diff options
451 files changed, 7481 insertions, 4622 deletions
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index 7ed3baa48c1f..4ce00cbff3f9 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -16,6 +16,7 @@  package android.app; +import static android.Manifest.permission.CONTROL_KEYGUARD;  import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;  import static android.Manifest.permission.START_TASKS_FROM_RECENTS;  import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; @@ -364,9 +365,8 @@ public class ActivityOptions extends ComponentOptions {      private static final String KEY_LAUNCH_INTO_PIP_PARAMS =              "android.activity.launchIntoPipParams"; -    /** See {@link #setDismissKeyguardIfInsecure()}. */ -    private static final String KEY_DISMISS_KEYGUARD_IF_INSECURE = -            "android.activity.dismissKeyguardIfInsecure"; +    /** See {@link #setDismissKeyguard()}. */ +    private static final String KEY_DISMISS_KEYGUARD = "android.activity.dismissKeyguard";      private static final String KEY_IGNORE_PENDING_INTENT_CREATOR_FOREGROUND_STATE =              "android.activity.ignorePendingIntentCreatorForegroundState"; @@ -467,7 +467,7 @@ public class ActivityOptions extends ComponentOptions {      private boolean mLaunchedFromBubble;      private boolean mTransientLaunch;      private PictureInPictureParams mLaunchIntoPipParams; -    private boolean mDismissKeyguardIfInsecure; +    private boolean mDismissKeyguard;      private boolean mIgnorePendingIntentCreatorForegroundState;      /** @@ -1272,7 +1272,7 @@ public class ActivityOptions extends ComponentOptions {          mLaunchIntoPipParams = opts.getParcelable(KEY_LAUNCH_INTO_PIP_PARAMS);          mIsEligibleForLegacyPermissionPrompt =                  opts.getBoolean(KEY_LEGACY_PERMISSION_PROMPT_ELIGIBLE); -        mDismissKeyguardIfInsecure = opts.getBoolean(KEY_DISMISS_KEYGUARD_IF_INSECURE); +        mDismissKeyguard = opts.getBoolean(KEY_DISMISS_KEYGUARD);          mIgnorePendingIntentCreatorForegroundState = opts.getBoolean(                  KEY_IGNORE_PENDING_INTENT_CREATOR_FOREGROUND_STATE);      } @@ -1878,24 +1878,24 @@ public class ActivityOptions extends ComponentOptions {      }      /** -     * Sets whether the insecure keyguard should go away when this activity launches. In case the -     * keyguard is secure, this option will be ignored. +     * Sets whether the keyguard should go away when this activity launches.       *       * @see Activity#setShowWhenLocked(boolean)       * @see android.R.attr#showWhenLocked       * @hide       */ -    public void setDismissKeyguardIfInsecure() { -        mDismissKeyguardIfInsecure = true; +    @RequiresPermission(CONTROL_KEYGUARD) +    public void setDismissKeyguard() { +        mDismissKeyguard = true;      }      /** -     * @see #setDismissKeyguardIfInsecure() +     * @see #setDismissKeyguard()       * @return whether the insecure keyguard should go away when the activity launches.       * @hide       */ -    public boolean getDismissKeyguardIfInsecure() { -        return mDismissKeyguardIfInsecure; +    public boolean getDismissKeyguard() { +        return mDismissKeyguard;      }      /** @@ -2176,8 +2176,8 @@ public class ActivityOptions extends ComponentOptions {              b.putBoolean(KEY_LEGACY_PERMISSION_PROMPT_ELIGIBLE,                      mIsEligibleForLegacyPermissionPrompt);          } -        if (mDismissKeyguardIfInsecure) { -            b.putBoolean(KEY_DISMISS_KEYGUARD_IF_INSECURE, mDismissKeyguardIfInsecure); +        if (mDismissKeyguard) { +            b.putBoolean(KEY_DISMISS_KEYGUARD, mDismissKeyguard);          }          if (mIgnorePendingIntentCreatorForegroundState) {              b.putBoolean(KEY_IGNORE_PENDING_INTENT_CREATOR_FOREGROUND_STATE, diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index b709b7ee90c3..fe75dd302beb 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -239,7 +239,6 @@ interface IActivityTaskManager {       *              {@link android.view.WindowManagerPolicyConstants#KEYGUARD_GOING_AWAY_FLAG_TO_SHADE}       *              etc.       */ -     @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.CONTROL_KEYGUARD)")      void keyguardGoingAway(int flags);      void suppressResizeConfigChanges(boolean suppress); diff --git a/core/java/android/app/IUriGrantsManager.aidl b/core/java/android/app/IUriGrantsManager.aidl index b630d034dca9..9e7f2fecfea0 100644 --- a/core/java/android/app/IUriGrantsManager.aidl +++ b/core/java/android/app/IUriGrantsManager.aidl @@ -39,7 +39,4 @@ interface IUriGrantsManager {      void clearGrantedUriPermissions(in String packageName, int userId);      ParceledListSlice getUriPermissions(in String packageName, boolean incoming,              boolean persistedOnly); - -    int checkGrantUriPermission_ignoreNonSystem( -            int sourceUid, String targetPkg, in Uri uri, int modeFlags, int userId);  } diff --git a/core/java/android/hardware/camera2/CameraCaptureSession.java b/core/java/android/hardware/camera2/CameraCaptureSession.java index 691690c09e0e..5b1973ad2dd4 100644 --- a/core/java/android/hardware/camera2/CameraCaptureSession.java +++ b/core/java/android/hardware/camera2/CameraCaptureSession.java @@ -1234,6 +1234,42 @@ public abstract class CameraCaptureSession implements AutoCloseable {          }          /** +         * This method is called when the camera device has started reading out the output +         * image for the request, at the beginning of the sensor image readout. +         * +         * <p>For a capture request, this callback is invoked right after +         * {@link #onCaptureStarted}. Unlike {@link #onCaptureStarted}, instead of passing +         * a timestamp of start of exposure, this callback passes a timestamp of start of +         * camera data readout. This is useful because for a camera running at fixed frame +         * rate, the start of readout is at fixed interval, which is not necessarily true for +         * the start of exposure, particularly when autoexposure is changing exposure duration +         * between frames.</p> +         * +         * <p>This timestamp may not match {@link CaptureResult#SENSOR_TIMESTAMP the result +         * timestamp field}. It will, however, match the timestamp of buffers sent to the +         * output surfaces with {@link OutputConfiguration#TIMESTAMP_BASE_READOUT_SENSOR} +         * timestamp base.</p> +         * +         * <p>This callback will be called only if {@link +         * CameraCharacteristics#SENSOR_READOUT_TIMESTAMP} is +         * {@link CameraMetadata#SENSOR_READOUT_TIMESTAMP_HARDWARE}, and it's called +         * right after {@link #onCaptureStarted}.</p> +         * +         * @param session the session returned by {@link CameraDevice#createCaptureSession} +         * @param request the request for the readout that just began +         * @param timestamp the timestamp at start of readout for a regular request, or +         *                  the timestamp at the input image's start of readout for a +         *                  reprocess request, in nanoseconds. +         * @param frameNumber the frame number for this capture +         * +         * @hide +         */ +        public void onReadoutStarted(@NonNull CameraCaptureSession session, +                @NonNull CaptureRequest request, long timestamp, long frameNumber) { +            // default empty implementation +        } + +        /**           * This method is called when some results from an image capture are           * available.           * diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 9e4bf6a0c608..9d624b6c0ed8 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -1326,6 +1326,10 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri       * {@link android.hardware.camera2.CameraManager#turnOnTorchWithStrengthLevel }.       * If this value is equal to 1, flashlight brightness control is not supported.       * The value for this key will be null for devices with no flash unit.</p> +     * <p>The maximum value is guaranteed to be safe to use for an indefinite duration in +     * terms of device flashlight lifespan, but may be too bright for comfort for many +     * use cases. Use the default torch brightness value to avoid problems with an +     * over-bright flashlight.</p>       * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>       */      @PublicKey @@ -4465,6 +4469,40 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri              new Key<android.graphics.Rect[]>("android.sensor.opticalBlackRegions", android.graphics.Rect[].class);      /** +     * <p>Whether or not the camera device supports readout timestamp and +     * onReadoutStarted callback.</p> +     * <p>If this tag is HARDWARE, the camera device calls onReadoutStarted in addition to the +     * onCaptureStarted callback for each capture. The timestamp passed into the callback +     * is the start of camera image readout rather than the start of the exposure. In +     * addition, the application can configure an +     * {@link android.hardware.camera2.params.OutputConfiguration } with +     * TIMESTAMP_BASE_READOUT_SENSOR timestamp base, in which case, the timestamp of the +     * output surface matches the timestamp from the corresponding onReadoutStarted callback.</p> +     * <p>The readout timestamp is beneficial for video recording, because the encoder favors +     * uniform timestamps, and the readout timestamps better reflect the cadence camera sensors +     * output data.</p> +     * <p>If this tag is HARDWARE, the camera device produces the start-of-exposure and +     * start-of-readout together. As a result, the onReadoutStarted is called right after +     * onCaptureStarted. The difference in start-of-readout and start-of-exposure is the sensor +     * exposure time, plus certain constant offset. The offset is usually due to camera sensor +     * level crop, and it remains constant for a given camera sensor mode.</p> +     * <p><b>Possible values:</b></p> +     * <ul> +     *   <li>{@link #SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED NOT_SUPPORTED}</li> +     *   <li>{@link #SENSOR_READOUT_TIMESTAMP_HARDWARE HARDWARE}</li> +     * </ul> +     * +     * <p>This key is available on all devices.</p> +     * @see #SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED +     * @see #SENSOR_READOUT_TIMESTAMP_HARDWARE +     * @hide +     */ +    @PublicKey +    @NonNull +    public static final Key<Integer> SENSOR_READOUT_TIMESTAMP = +            new Key<Integer>("android.sensor.readoutTimestamp", int.class); + +    /**       * <p>List of lens shading modes for {@link CaptureRequest#SHADING_MODE android.shading.mode} that are supported by this camera device.</p>       * <p>This list contains lens shading modes that can be set for the camera device.       * Camera devices that support the MANUAL_POST_PROCESSING capability will always diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index e1089c22f593..7055c9c6aa4d 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -1659,6 +1659,28 @@ public abstract class CameraMetadata<TKey> {      public static final int SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN = 24;      // +    // Enumeration values for CameraCharacteristics#SENSOR_READOUT_TIMESTAMP +    // + +    /** +     * <p>This camera device doesn't support readout timestamp and onReadoutStarted +     * callback.</p> +     * @see CameraCharacteristics#SENSOR_READOUT_TIMESTAMP +     * @hide +     */ +    public static final int SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED = 0; + +    /** +     * <p>This camera device supports the onReadoutStarted callback as well as outputting +     * readout timestamp for streams with TIMESTAMP_BASE_READOUT_SENSOR timestamp base. The +     * readout timestamp is generated by the camera hardware and it has the same accuracy +     * and timing characteristics of the start-of-exposure time.</p> +     * @see CameraCharacteristics#SENSOR_READOUT_TIMESTAMP +     * @hide +     */ +    public static final int SENSOR_READOUT_TIMESTAMP_HARDWARE = 1; + +    //      // Enumeration values for CameraCharacteristics#LED_AVAILABLE_LEDS      // diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java index 9a9163c724ff..b9eba9c1d541 100644 --- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java @@ -657,6 +657,21 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession              }              @Override +            public void onReadoutStarted(CameraDevice camera, +                    CaptureRequest request, long timestamp, long frameNumber) { +                if ((callback != null) && (executor != null)) { +                    final long ident = Binder.clearCallingIdentity(); +                    try { +                        executor.execute(() -> callback.onReadoutStarted( +                                    CameraCaptureSessionImpl.this, request, timestamp, +                                    frameNumber)); +                    } finally { +                        Binder.restoreCallingIdentity(ident); +                    } +                } +            } + +            @Override              public void onCapturePartial(CameraDevice camera,                      CaptureRequest request, android.hardware.camera2.CaptureResult result) {                  if ((callback != null) && (executor != null)) { diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 3cb0c93d8409..a6c79b3a289f 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -2025,12 +2025,16 @@ public class CameraDeviceImpl extends CameraDevice                      resultExtras.getLastCompletedReprocessFrameNumber();              final long lastCompletedZslFrameNumber =                      resultExtras.getLastCompletedZslFrameNumber(); +            final boolean hasReadoutTimestamp = resultExtras.hasReadoutTimestamp(); +            final long readoutTimestamp = resultExtras.getReadoutTimestamp();              if (DEBUG) {                  Log.d(TAG, "Capture started for id " + requestId + " frame number " + frameNumber                          + ": completedRegularFrameNumber " + lastCompletedRegularFrameNumber                          + ", completedReprocessFrameNUmber " + lastCompletedReprocessFrameNumber -                        + ", completedZslFrameNumber " + lastCompletedZslFrameNumber); +                        + ", completedZslFrameNumber " + lastCompletedZslFrameNumber +                        + ", hasReadoutTimestamp " + hasReadoutTimestamp +                        + (hasReadoutTimestamp ? ", readoutTimestamp " + readoutTimestamp : "")) ;              }              final CaptureCallbackHolder holder; @@ -2082,14 +2086,26 @@ public class CameraDeviceImpl extends CameraDevice                                                  CameraDeviceImpl.this,                                                  holder.getRequest(i),                                                  timestamp - (subsequenceId - i) * -                                                NANO_PER_SECOND/fpsRange.getUpper(), +                                                NANO_PER_SECOND / fpsRange.getUpper(),                                                  frameNumber - (subsequenceId - i)); +                                            if (hasReadoutTimestamp) { +                                                holder.getCallback().onReadoutStarted( +                                                    CameraDeviceImpl.this, +                                                    holder.getRequest(i), +                                                    readoutTimestamp - (subsequenceId - i) * +                                                    NANO_PER_SECOND / fpsRange.getUpper(), +                                                    frameNumber - (subsequenceId - i)); +                                            }                                          }                                      } else {                                          holder.getCallback().onCaptureStarted( -                                            CameraDeviceImpl.this, -                                            holder.getRequest(resultExtras.getSubsequenceId()), +                                            CameraDeviceImpl.this, request,                                              timestamp, frameNumber); +                                        if (hasReadoutTimestamp) { +                                            holder.getCallback().onReadoutStarted( +                                                CameraDeviceImpl.this, request, +                                                readoutTimestamp, frameNumber); +                                        }                                      }                                  }                              } diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java index 4d0ba63d7759..41822e77f953 100644 --- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java @@ -1693,8 +1693,10 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {                          ((i != idx) || notifyCurrentIndex)) {                      TotalCaptureResult result = previewMap.valueAt(i).second;                      Long timestamp = result.get(CaptureResult.SENSOR_TIMESTAMP); -                    mCaptureResultHandler.onCaptureCompleted(timestamp, -                            initializeFilteredResults(result)); +                    if (mCaptureResultHandler != null) { +                        mCaptureResultHandler.onCaptureCompleted(timestamp, +                                initializeFilteredResults(result)); +                    }                      Log.w(TAG, "Preview frame drop with timestamp: " + previewMap.keyAt(i));                      final long ident = Binder.clearCallingIdentity(); @@ -1739,6 +1741,20 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {                      // abruptly.                      Log.w(TAG, "Output surface likely abandoned, dropping buffer!");                      img.close(); +                } catch (RuntimeException e) { +                    // NOTE: This is intended to catch RuntimeException from ImageReader.detachImage +                    // ImageReader.detachImage is not supposed to throw RuntimeExceptions but the +                    // bug went unchecked for a few years and now its behavior cannot be changed +                    // without breaking backwards compatibility. + +                    if (!e.getClass().equals(RuntimeException.class)) { +                        // re-throw any exceptions that aren't base RuntimeException since they are +                        // coming from elsewhere, and we shouldn't silently drop those. +                        throw e; +                    } + +                    Log.w(TAG, "Output surface likely abandoned, dropping buffer!"); +                    img.close();                  }              }          } @@ -1773,9 +1789,23 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {                  }                  try {                      reader.detachImage(img); -                } catch (Exception e) { -                    Log.e(TAG, -                            "Failed to detach image!"); +                } catch (IllegalStateException e) { +                    Log.e(TAG, "Failed to detach image!"); +                    img.close(); +                    return; +                } catch (RuntimeException e) { +                    // NOTE: This is intended to catch RuntimeException from ImageReader.detachImage +                    // ImageReader.detachImage is not supposed to throw RuntimeExceptions but the +                    // bug went unchecked for a few years and now its behavior cannot be changed +                    // without breaking backwards compatibility. + +                    if (!e.getClass().equals(RuntimeException.class)) { +                        // re-throw any exceptions that aren't base RuntimeException since they are +                        // coming from elsewhere, and we shouldn't silently drop those. +                        throw e; +                    } + +                    Log.e(TAG, "Failed to detach image!");                      img.close();                      return;                  } diff --git a/core/java/android/hardware/camera2/impl/CaptureCallback.java b/core/java/android/hardware/camera2/impl/CaptureCallback.java index 6defe63b1766..b064e6a1f975 100644 --- a/core/java/android/hardware/camera2/impl/CaptureCallback.java +++ b/core/java/android/hardware/camera2/impl/CaptureCallback.java @@ -66,6 +66,13 @@ public abstract class CaptureCallback {              CaptureRequest request, long timestamp, long frameNumber);      /** +     * This method is called when the camera device has started reading out the output +     * image for the request, at the beginning of the sensor image readout. +     */ +    public abstract void onReadoutStarted(CameraDevice camera, +            CaptureRequest request, long timestamp, long frameNumber); + +    /**       * This method is called when some results from an image capture are       * available.       * diff --git a/core/java/android/hardware/camera2/impl/CaptureResultExtras.java b/core/java/android/hardware/camera2/impl/CaptureResultExtras.java index 5d9da73fd5c0..8bf94986a490 100644 --- a/core/java/android/hardware/camera2/impl/CaptureResultExtras.java +++ b/core/java/android/hardware/camera2/impl/CaptureResultExtras.java @@ -33,6 +33,8 @@ public class CaptureResultExtras implements Parcelable {      private long lastCompletedRegularFrameNumber;      private long lastCompletedReprocessFrameNumber;      private long lastCompletedZslFrameNumber; +    private boolean hasReadoutTimestamp; +    private long readoutTimestamp;      public static final @android.annotation.NonNull Parcelable.Creator<CaptureResultExtras> CREATOR =              new Parcelable.Creator<CaptureResultExtras>() { @@ -56,7 +58,8 @@ public class CaptureResultExtras implements Parcelable {                                 int partialResultCount, int errorStreamId,                                 String errorPhysicalCameraId, long lastCompletedRegularFrameNumber,                                 long lastCompletedReprocessFrameNumber, -                               long lastCompletedZslFrameNumber) { +                               long lastCompletedZslFrameNumber, boolean hasReadoutTimestamp, +                               long readoutTimestamp) {          this.requestId = requestId;          this.subsequenceId = subsequenceId;          this.afTriggerId = afTriggerId; @@ -68,6 +71,8 @@ public class CaptureResultExtras implements Parcelable {          this.lastCompletedRegularFrameNumber = lastCompletedRegularFrameNumber;          this.lastCompletedReprocessFrameNumber = lastCompletedReprocessFrameNumber;          this.lastCompletedZslFrameNumber = lastCompletedZslFrameNumber; +        this.hasReadoutTimestamp = hasReadoutTimestamp; +        this.readoutTimestamp = readoutTimestamp;      }      @Override @@ -93,6 +98,10 @@ public class CaptureResultExtras implements Parcelable {          dest.writeLong(lastCompletedRegularFrameNumber);          dest.writeLong(lastCompletedReprocessFrameNumber);          dest.writeLong(lastCompletedZslFrameNumber); +        dest.writeBoolean(hasReadoutTimestamp); +        if (hasReadoutTimestamp) { +            dest.writeLong(readoutTimestamp); +        }      }      public void readFromParcel(Parcel in) { @@ -110,6 +119,10 @@ public class CaptureResultExtras implements Parcelable {          lastCompletedRegularFrameNumber = in.readLong();          lastCompletedReprocessFrameNumber = in.readLong();          lastCompletedZslFrameNumber = in.readLong(); +        hasReadoutTimestamp = in.readBoolean(); +        if (hasReadoutTimestamp) { +            readoutTimestamp = in.readLong(); +        }      }      public String getErrorPhysicalCameraId() { @@ -155,4 +168,12 @@ public class CaptureResultExtras implements Parcelable {      public long getLastCompletedZslFrameNumber() {          return lastCompletedZslFrameNumber;      } + +    public boolean hasReadoutTimestamp() { +        return hasReadoutTimestamp; +    } + +    public long getReadoutTimestamp() { +        return readoutTimestamp; +    }  } diff --git a/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java b/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java index 6cf5d60acec8..598170dfcb25 100644 --- a/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java +++ b/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java @@ -26,6 +26,10 @@ import static android.hardware.camera2.marshal.MarshalHelpers.getPrimitiveTypeCl  import java.lang.reflect.Array;  import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer;  import java.util.ArrayList;  /** @@ -45,46 +49,49 @@ public class MarshalQueryableArray<T> implements MarshalQueryable<T> {      private static final boolean DEBUG = false;      private static interface PrimitiveArrayFiller { -        public void fillPosition(Object arr, int index, ByteBuffer buffer); +        public void fillArray(Object arr, int size, ByteBuffer buffer);          static PrimitiveArrayFiller getPrimitiveArrayFiller(Class<?> componentType) {              if (componentType == int.class) {                  return new PrimitiveArrayFiller() {                        @Override -                      public void fillPosition(Object arr, int index, ByteBuffer buffer) { -                          int i = buffer.getInt(); -                          Array.setInt(arr, index, i); +                      public void fillArray(Object arr, int size, ByteBuffer buffer) { +                          IntBuffer ib = buffer.asIntBuffer().get(int[].class.cast(arr), 0, size); +                          // Update buffer position since the IntBuffer has independent position. +                          buffer.position(buffer.position() + ib.position() * Integer.BYTES);                        }                  };              } else if (componentType == float.class) {                  return new PrimitiveArrayFiller() {                        @Override -                      public void fillPosition(Object arr, int index, ByteBuffer buffer) { -                          float i = buffer.getFloat(); -                          Array.setFloat(arr, index, i); +                      public void fillArray(Object arr, int size, ByteBuffer buffer) { +                          FloatBuffer fb = +                                  buffer.asFloatBuffer().get(float[].class.cast(arr), 0, size); +                          buffer.position(buffer.position() + fb.position() * Float.BYTES);                        }                  };              } else if (componentType == long.class) {                  return new PrimitiveArrayFiller() {                        @Override -                      public void fillPosition(Object arr, int index, ByteBuffer buffer) { -                          long i = buffer.getLong(); -                          Array.setLong(arr, index, i); +                      public void fillArray(Object arr, int size, ByteBuffer buffer) { +                          LongBuffer lb = +                                  buffer.asLongBuffer().get(long[].class.cast(arr), 0, size); +                          buffer.position(buffer.position() + lb.position() * Long.BYTES);                        }                  };              } else if (componentType == double.class) {                  return new PrimitiveArrayFiller() {                        @Override -                      public void fillPosition(Object arr, int index, ByteBuffer buffer) { -                          double i = buffer.getDouble(); -                          Array.setDouble(arr, index, i); +                      public void fillArray(Object arr, int size, ByteBuffer buffer) { +                          DoubleBuffer db = +                                  buffer.asDoubleBuffer().get(double[].class.cast(arr), 0, size); +                          buffer.position(buffer.position() + db.position() * Double.BYTES);                        }                  };              } else if (componentType == byte.class) {                  return new PrimitiveArrayFiller() {                        @Override -                      public void fillPosition(Object arr, int index, ByteBuffer buffer) { -                          byte i = buffer.get(); -                          Array.setByte(arr, index, i); +                      public void fillArray(Object arr, int size, ByteBuffer buffer) { +                          buffer.get(byte[].class.cast(arr), 0, size);                        }                  };              } @@ -93,13 +100,6 @@ public class MarshalQueryableArray<T> implements MarshalQueryable<T> {          }      }; -    static void unmarshalPrimitiveArray(Object arr, int size, ByteBuffer buffer, -            PrimitiveArrayFiller filler) { -        for (int i = 0; i < size; i++) { -            filler.fillPosition(arr, i, buffer); -        } -    } -      private class MarshalerArray extends Marshaler<T> {          private final Class<T> mClass;          private final Marshaler<?> mComponentMarshaler; @@ -150,8 +150,8 @@ public class MarshalQueryableArray<T> implements MarshalQueryable<T> {                  array = Array.newInstance(mComponentClass, arraySize);                  if (isUnwrappedPrimitiveClass(mComponentClass) &&                          mComponentClass == getPrimitiveTypeClass(mNativeType)) { -                    unmarshalPrimitiveArray(array, arraySize, buffer, -                            PrimitiveArrayFiller.getPrimitiveArrayFiller(mComponentClass)); +                    PrimitiveArrayFiller.getPrimitiveArrayFiller(mComponentClass).fillArray(array, +                            arraySize, buffer);                  } else {                      for (int i = 0; i < arraySize; ++i) {                          Object elem = mComponentMarshaler.unmarshal(buffer); diff --git a/core/java/android/hardware/camera2/params/OutputConfiguration.java b/core/java/android/hardware/camera2/params/OutputConfiguration.java index 4a2517763aae..9e8703779863 100644 --- a/core/java/android/hardware/camera2/params/OutputConfiguration.java +++ b/core/java/android/hardware/camera2/params/OutputConfiguration.java @@ -245,6 +245,26 @@ public final class OutputConfiguration implements Parcelable {       */      public static final int TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED = 4; +    /** +     * Timestamp is the start of readout in the same time domain as TIMESTAMP_BASE_SENSOR. +     * +     * <p>The start of the camera sensor readout after exposure. For a rolling shutter camera +     * sensor, the timestamp is typically equal to the start of exposure time + +     * exposure time + certain fixed offset. The fixed offset could be due to camera sensor +     * level crop. The benefit of using readout time is that when camera runs in a fixed +     * frame rate, the timestamp intervals between frames are constant.</p> +     * +     * <p>This timestamp is in the same time domain as in TIMESTAMP_BASE_SENSOR, with the exception +     * that one is start of exposure, and the other is start of readout.</p> +     * +     * <p>This timestamp base is supported only if {@link +     * CameraCharacteristics#SENSOR_READOUT_TIMESTAMP} is +     * {@link CameraMetadata#SENSOR_READOUT_TIMESTAMP_HARDWARE}.</p> +     * +     * @hide +     */ +    public static final int TIMESTAMP_BASE_READOUT_SENSOR = 5; +      /** @hide */      @Retention(RetentionPolicy.SOURCE)      @IntDef(prefix = {"TIMESTAMP_BASE_"}, value = @@ -252,7 +272,8 @@ public final class OutputConfiguration implements Parcelable {           TIMESTAMP_BASE_SENSOR,           TIMESTAMP_BASE_MONOTONIC,           TIMESTAMP_BASE_REALTIME, -         TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED}) +         TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED, +         TIMESTAMP_BASE_READOUT_SENSOR})      public @interface TimestampBase {};      /** @hide */ @@ -974,7 +995,7 @@ public final class OutputConfiguration implements Parcelable {      public void setTimestampBase(@TimestampBase int timestampBase) {          // Verify that the value is in range          if (timestampBase < TIMESTAMP_BASE_DEFAULT || -                timestampBase > TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED) { +                timestampBase > TIMESTAMP_BASE_READOUT_SENSOR) {              throw new IllegalArgumentException("Not a valid timestamp base value " +                      timestampBase);          } diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 31f3b6aef251..7092e43596ec 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -1363,19 +1363,31 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan              // Consolidate positional feedback to reduce noise during authentication.              case FACE_ACQUIRED_NOT_DETECTED: +                return context.getString(R.string.face_acquired_not_detected);              case FACE_ACQUIRED_TOO_CLOSE: +                return context.getString(R.string.face_acquired_too_close);              case FACE_ACQUIRED_TOO_FAR: +                return context.getString(R.string.face_acquired_too_far);              case FACE_ACQUIRED_TOO_HIGH: +                // TODO(b/181269243) Change back once error codes are fixed. +                return context.getString(R.string.face_acquired_too_low);              case FACE_ACQUIRED_TOO_LOW: +                // TODO(b/181269243) Change back once error codes are fixed. +                return context.getString(R.string.face_acquired_too_high);              case FACE_ACQUIRED_TOO_RIGHT: +                // TODO(b/181269243) Change back once error codes are fixed. +                return context.getString(R.string.face_acquired_too_left);              case FACE_ACQUIRED_TOO_LEFT: +                // TODO(b/181269243) Change back once error codes are fixed. +                return context.getString(R.string.face_acquired_too_right);              case FACE_ACQUIRED_POOR_GAZE: +                return context.getString(R.string.face_acquired_poor_gaze);              case FACE_ACQUIRED_PAN_TOO_EXTREME: +                return context.getString(R.string.face_acquired_pan_too_extreme);              case FACE_ACQUIRED_TILT_TOO_EXTREME: +                return context.getString(R.string.face_acquired_tilt_too_extreme);              case FACE_ACQUIRED_ROLL_TOO_EXTREME: -                return context.getString(R.string.face_acquired_poor_gaze); - -            // Provide more detailed feedback for other soft errors. +                return context.getString(R.string.face_acquired_roll_too_extreme);              case FACE_ACQUIRED_INSUFFICIENT:                  return context.getString(R.string.face_acquired_insufficient);              case FACE_ACQUIRED_TOO_BRIGHT: @@ -1394,6 +1406,10 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan                  return context.getString(R.string.face_acquired_obscured);              case FACE_ACQUIRED_SENSOR_DIRTY:                  return context.getString(R.string.face_acquired_sensor_dirty); +            case FACE_ACQUIRED_DARK_GLASSES_DETECTED: +                return context.getString(R.string.face_acquired_dark_glasses_detected); +            case FACE_ACQUIRED_MOUTH_COVERING_DETECTED: +                return context.getString(R.string.face_acquired_mouth_covering_detected);              // Find and return the appropriate vendor-specific message.              case FACE_ACQUIRED_VENDOR: { @@ -1459,11 +1475,13 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan              case FACE_ACQUIRED_ROLL_TOO_EXTREME:                  return context.getString(R.string.face_acquired_roll_too_extreme);              case FACE_ACQUIRED_FACE_OBSCURED: -            case FACE_ACQUIRED_DARK_GLASSES_DETECTED: -            case FACE_ACQUIRED_MOUTH_COVERING_DETECTED:                  return context.getString(R.string.face_acquired_obscured);              case FACE_ACQUIRED_SENSOR_DIRTY:                  return context.getString(R.string.face_acquired_sensor_dirty); +            case FACE_ACQUIRED_DARK_GLASSES_DETECTED: +                return context.getString(R.string.face_acquired_dark_glasses_detected); +            case FACE_ACQUIRED_MOUTH_COVERING_DETECTED: +                return context.getString(R.string.face_acquired_mouth_covering_detected);              case FACE_ACQUIRED_VENDOR: {                  String[] msgArray = context.getResources().getStringArray(                          R.array.face_acquired_vendor); diff --git a/core/java/android/os/PersistableBundle.java b/core/java/android/os/PersistableBundle.java index 79155076b39a..622c0c6d1c0d 100644 --- a/core/java/android/os/PersistableBundle.java +++ b/core/java/android/os/PersistableBundle.java @@ -21,7 +21,6 @@ import static java.nio.charset.StandardCharsets.UTF_8;  import android.annotation.NonNull;  import android.annotation.Nullable;  import android.util.ArrayMap; -import android.util.Slog;  import android.util.TypedXmlPullParser;  import android.util.TypedXmlSerializer;  import android.util.Xml; @@ -51,8 +50,6 @@ import java.util.ArrayList;   */  public final class PersistableBundle extends BaseBundle implements Cloneable, Parcelable,          XmlUtils.WriteMapCallback { -    private static final String TAG = "PersistableBundle"; -      private static final String TAG_PERSISTABLEMAP = "pbundle_as_map";      /** An unmodifiable {@code PersistableBundle} that is always {@link #isEmpty() empty}. */ @@ -121,11 +118,7 @@ public final class PersistableBundle extends BaseBundle implements Cloneable, Pa       * @hide       */      public PersistableBundle(Bundle b) { -        this(b, true); -    } - -    private PersistableBundle(Bundle b, boolean throwException) { -        this(b.getItemwiseMap(), throwException); +        this(b.getItemwiseMap());      }      /** @@ -134,7 +127,7 @@ public final class PersistableBundle extends BaseBundle implements Cloneable, Pa       * @param map a Map containing only those items that can be persisted.       * @throws IllegalArgumentException if any element of #map cannot be persisted.       */ -    private PersistableBundle(ArrayMap<String, Object> map, boolean throwException) { +    private PersistableBundle(ArrayMap<String, Object> map) {          super();          mFlags = FLAG_DEFUSABLE; @@ -143,23 +136,16 @@ public final class PersistableBundle extends BaseBundle implements Cloneable, Pa          // Now verify each item throwing an exception if there is a violation.          final int N = mMap.size(); -        for (int i = N - 1; i >= 0; --i) { +        for (int i=0; i<N; i++) {              Object value = mMap.valueAt(i);              if (value instanceof ArrayMap) {                  // Fix up any Maps by replacing them with PersistableBundles. -                mMap.setValueAt(i, -                        new PersistableBundle((ArrayMap<String, Object>) value, throwException)); +                mMap.setValueAt(i, new PersistableBundle((ArrayMap<String, Object>) value));              } else if (value instanceof Bundle) { -                mMap.setValueAt(i, new PersistableBundle((Bundle) value, throwException)); +                mMap.setValueAt(i, new PersistableBundle(((Bundle) value)));              } else if (!isValidType(value)) { -                final String errorMsg = "Bad value in PersistableBundle key=" -                        + mMap.keyAt(i) + " value=" + value; -                if (throwException) { -                    throw new IllegalArgumentException(errorMsg); -                } else { -                    Slog.wtfStack(TAG, errorMsg); -                    mMap.removeAt(i); -                } +                throw new IllegalArgumentException("Bad value in PersistableBundle key=" +                        + mMap.keyAt(i) + " value=" + value);              }          }      } @@ -282,15 +268,6 @@ public final class PersistableBundle extends BaseBundle implements Cloneable, Pa      /** @hide */      public void saveToXml(TypedXmlSerializer out) throws IOException, XmlPullParserException {          unparcel(); -        // Explicitly drop invalid types an attacker may have added before persisting. -        for (int i = mMap.size() - 1; i >= 0; --i) { -            final Object value = mMap.valueAt(i); -            if (!isValidType(value)) { -                Slog.e(TAG, "Dropping bad data before persisting: " -                        + mMap.keyAt(i) + "=" + value); -                mMap.removeAt(i); -            } -        }          XmlUtils.writeMapXml(mMap, out, this);      } @@ -382,12 +359,9 @@ public final class PersistableBundle extends BaseBundle implements Cloneable, Pa          while (((event = in.next()) != XmlPullParser.END_DOCUMENT) &&                  (event != XmlPullParser.END_TAG || in.getDepth() < outerDepth)) {              if (event == XmlPullParser.START_TAG) { -                // Don't throw an exception when restoring from XML since an attacker could try to -                // input invalid data in the persisted file.                  return new PersistableBundle((ArrayMap<String, Object>)                          XmlUtils.readThisArrayMapXml(in, startTag, tagName, -                        new MyReadMapCallback()), -                        /* throwException */ false); +                        new MyReadMapCallback()));              }          }          return new PersistableBundle();  // An empty mutable PersistableBundle diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 96cc1f892551..e8ed8b8a85d4 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -9389,6 +9389,13 @@ public final class Settings {          public static final String SPATIAL_AUDIO_ENABLED = "spatial_audio_enabled";          /** +         * Internal collection of audio device inventory items +         * The device item stored are {@link com.android.server.audio.AdiDeviceState} +         * @hide +         */ +        public static final String AUDIO_DEVICE_INVENTORY = "audio_device_inventory"; + +        /**           * Indicates whether notification display on the lock screen is enabled.           * <p>           * Type: int (0 for false, 1 for true) diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index a8ba2e9a4d7f..cb5dff024ff7 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -728,11 +728,6 @@ public class RemoteViews implements Parcelable, Filter {                  mActions.get(i).visitUris(visitor);              }          } -        if (mSizedRemoteViews != null) { -            for (int i = 0; i < mSizedRemoteViews.size(); i++) { -                mSizedRemoteViews.get(i).visitUris(visitor); -            } -        }          if (mLandscape != null) {              mLandscape.visitUris(visitor);          } diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto index 152d729da3b6..92ac389ece67 100644 --- a/core/proto/android/server/windowmanagerservice.proto +++ b/core/proto/android/server/windowmanagerservice.proto @@ -116,6 +116,7 @@ message KeyguardControllerProto {      repeated KeyguardOccludedProto keyguard_occluded_states = 2 [deprecated=true];      optional bool aod_showing = 3;      repeated KeyguardPerDisplayProto keyguard_per_display = 4; +    optional bool keyguard_going_away = 5;  }  message KeyguardOccludedProto { @@ -132,6 +133,7 @@ message KeyguardPerDisplayProto {      optional bool keyguard_showing = 2;      optional bool aod_showing = 3;      optional bool keyguard_occluded = 4; +    optional bool keyguard_going_away = 5;  }  /* represents PhoneWindowManager */ diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 4370acd379c1..e8244c4e7217 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Vingerafdrukslot"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Kan nie vingerafdruksensor gebruik nie"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Besoek \'n verskaffer wat herstelwerk doen."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Kon nie gesigdata akkuraat vasvang nie. Probeer weer."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kan nie jou gesigmodel skep nie. Probeer weer."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Te helder. Probeer sagter beligting."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Te donker. Probeer helderder beligting."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Beweeg foon verder weg"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Beweeg foon nader."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Beweeg foon hoër op."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Beweeg foon laer af."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Beweeg foon na links."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Beweeg foon na regs."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Probeer helderder beligting"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Beweeg foon verder weg"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Beweeg foon nader"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Beweeg foon hoër op"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Beweeg foon laer af"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Beweeg foon na jou linkerkant"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Beweeg foon na jou regterkant"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Kyk asseblief meer reguit na jou toestel."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Posisioneer jou gesig direk voor die foon."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Kan nie jou gesig sien nie. Hou jou foon op oogvlak."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Te veel beweging. Hou foon stil."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Skryf jou gesig asseblief weer in."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Kan nie meer gesig herken nie. Probeer weer."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Te eenders. Verander asseblief jou pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Draai jou kop \'n bietjie minder."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Kantel jou kop \'n bietjie minder."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Draai jou kop \'n bietjie minder."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Kan nie gesig herken nie. Probeer weer."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Verander die posisie van jou kop effens"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Kyk meer reguit na jou foon"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Kyk meer reguit na jou foon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Kyk meer reguit na jou foon"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Verwyder enigiets wat jou gesig versteek."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Maak die bokant van jou skerm skoon, insluitend die swart balk"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Jou gesig moet heeltemal sigbaar wees"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Jou gesig moet heeltemal sigbaar wees"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Kan nie jou gesigmodel skep nie. Probeer weer."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Donkerbril bespeur. Jou gesig moet heeltemal sigbaar wees."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Gesigbedekking bespeur. Jou gesig moet heeltemal sigbaar wees."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Kan nie gesig verifieer nie. Hardeware nie beskikbaar nie."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index a49c923e9e5b..847987350a3b 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"በጣት አሻራ መክፈቻ"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"የጣት አሻራ ዳሳሽን መጠቀም አይቻልም"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"የጥገና አገልግሎት ሰጪን ይጎብኙ።"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"ትክክለኛ የፊት ውሂብ ማንሳት አልተቻለም። እንደገና ይሞክሩ።"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"የመልክዎን ሞዴል መፍጠር አልተቻለም። እንደገና ይሞክሩ።"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"ከልክ በላይ ፈካ ያለ። ይበልጥ ረጋ ያለ ብርሃን አጠቃቀምን ይሞክሩ።"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"ከልክ በላይ ጨለማ ነው። ከዚህ ፈካ ያለ ብርሃን አጠቃቀምን ይሞክሩ።"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ስልክን ይበልጥ አርቀው ያንቀሳቅሱት።"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ስልክን ወደ ቅርብ ቦታ ያንቀሳቅሱ።"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ስልኩን ከፍ ወዳለ ቦታ ያንቀሳቅሱት።"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ስልክን ወደ ታች ዝቅ ያድርጉ።"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ስልክን ወደ ግራ ያንቀሳቅሱ።"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ስልክን ወደ ቀኝ ያንቀሳቅሱ።"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"ከዚህ ፈካ ያለ ብርሃንን ይሞክሩ"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ስልኩን ያርቁት"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ስልኩን ያቅርቡት"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ስልኩን ከፍ ወዳለ ቦታ ይውሰዱት"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ስልኩን ወደ ታች ዝቅ ያድርጉ"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ስልክዎን ወደ በስተግራዎ ይውሰዱት"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ስልኩን ወደ በስተቀኝዎ ይውሰዱት"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"እባክዎ መሣሪያዎን ይበልጥ በቀጥታ ይመልከቱ።"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"መልክዎን በቀጥታ ከስልኩ ፊት ያድርጉት።"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"የእርስዎን መልክ ማየት አይችልም። ስልክዎን በዓይን ትክክል ይያዙ።"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"ከልክ በላይ ብዙ እንቅስቃሴ። ስልኩን ቀጥ አድርገው ይያዙት።"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"እባክዎ ፊትዎን እንደገና ያስመዝግቡ"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"ከእንግዲህ ፊትን ለይቶ ማወቅ አይችልም። እንደገና ይሞክሩ።"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"በጣም ይመሳሰላል፣ እባክዎ የእርስዎን ፎቶ አነሳስ ይለውጡ"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"ጭንቅላትዎን ትንሽ ብቻ ያዙሩት።"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"ጭንቅላትዎን ትንሽ ብቻ ያጋድሉት።"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"ጭንቅላትዎን ትንሽ ብቻ ያዙሩት።"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"መልክን መለየት አልተቻለም። እንደገና ይሞክሩ።"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"የጭንቅላትዎን ቦታ በትንሹ ይለዋውጡ"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"ስልክዎን ይበልጥ በቀጥታ ይመልከቱ"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"ስልክዎን ይበልጥ በቀጥታ ይመልከቱ"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"ስልክዎን ይበልጥ በቀጥታ ይመልከቱ"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"የእርስዎን ፊት የሚደብቀውን ሁሉንም ነገር በማስወገድ ላይ"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"የማያ ገጽዎን አናት ያጽዱት፣ ጥቁር አሞሌውን ጨምሮ"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"መልክዎ ሙሉ በሙሉ መታየት አለበት"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"መልክዎ ሙሉ በሙሉ መታየት አለበት"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"የመልክዎን ሞዴል መፍጠር አልተቻለም። እንደገና ይሞክሩ።"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ጠቆር ያሉ መነጽሮች ተገኝተዋል። መልክዎ ሙሉ በሙሉ መታየት አለበት።"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"የመልክ መሸፈኛ ተገኝቷል። መልክዎ ሙሉ በሙሉ መታየት አለበት።"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"መልክን ማረጋገጥ አይቻልም። ሃርድዌር የለም።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 989849d3e039..1ccddcad547b 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -638,26 +638,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"فتح الجهاز ببصمة الإصبع"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"لا يمكن استخدام مستشعر بصمات الإصبع"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"يُرجى التواصل مع مقدِّم خدمات إصلاح."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"تعذّر تسجيل بيانات دقيقة للوجه. حاول مرة أخرى."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"يتعذّر إنشاء نموذج الوجه. يُرجى إعادة المحاولة."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"ساطع للغاية. تجربة مستوى سطوع أقلّ."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"الصورة معتمة للغاية. يُرجى زيادة السطوع."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"يُرجى نقل الهاتف مسافة أبعد."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"انقل الهاتف إلى مكان قريب."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"يُرجى رفع الهاتف للأعلى."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"يُرجى خفض الهاتف للأسفل."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"يُرجى نقل الهاتف إلى اليمين."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"يُرجى نقل الهاتف إلى اليسار."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"جرِّب زيادة الإضاءة."</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"يُرجى إبعاد الهاتف عنك."</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"يُرجى تقريب الهاتف منك."</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"يُرجى رفع الهاتف للأعلى."</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"يُرجى خفض الهاتف للأسفل."</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"يُرجى تحريك الهاتف جهة اليسار."</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"يُرجى تحريك الهاتف جهة اليمين."</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"يُرجى النظر إلى جهازك مباشرة أكثر."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"ضع وجهك أمام الهاتف مباشرة."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"تتعذّر رؤية وجهك. ارفع هاتفك إلى مستوى العينَين."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"حركة أكثر من اللازم يُرجى حمل بدون حركة."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"يُرجى إعادة تسجيل وجهك."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"لم يعُد يمكن التعرّف على الوجه. حاول مرة أخرى."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"الوجه مشابه جدًا، يُرجى تغيير وضعيتك."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"حرّك رأسك قليلاً نحو الأمام مباشرة."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"يُرجى إمالة رأسك أقل قليلاً."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"حرّك رأسك قليلاً نحو الوسط."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"يتعذّر التعرّف على الوجه. يُرجى إعادة المحاولة."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"غيِّر موضع رأسك قليلاً."</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"يُرجى النظر إلى هاتفك مباشرةً."</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"يُرجى النظر إلى هاتفك مباشرةً."</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"يُرجى النظر إلى هاتفك مباشرةً."</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"عليك بإزالة أي شيء يُخفي وجهك."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"يُرجى تنظيف الجزء العلوي من الشاشة، بما في ذلك الشريط الأسود."</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"يجب أن يكون وجهك ظاهرًا بالكامل."</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"يجب أن يكون وجهك ظاهرًا بالكامل."</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"يتعذّر إنشاء نموذج الوجه. يُرجى إعادة المحاولة."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"تمّ رصد نظارة شمسية. يجب أن يكون وجهك ظاهرًا بالكامل."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"تمّ رصد قناع على الوجه. يجب أن يكون وجهك ظاهرًا بالكامل."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"يتعذّر التحقُّق من الوجه. الجهاز غير مُتاح."</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 29c0a9540a98..1aed2235190f 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ফিংগাৰপ্ৰিন্ট আনলক"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰ ব্যৱহাৰ কৰিব নোৱাৰি"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"মেৰামতি সেৱা প্ৰদানকাৰী কোনো প্ৰতিষ্ঠানলৈ যাওক।"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"সঠিক মুখমণ্ডলৰ ডেটা কেপচাৰ নহ’ল। আকৌ চেষ্টা কৰক।"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"মুখাৱয়বৰ মডেল সৃষ্টি কৰিব নোৱাৰি। পুনৰ চেষ্টা কৰক।"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"অতি উজ্জ্বল। ইয়াতকৈ কম পোহৰৰ উৎস ব্যৱহাৰ কৰক।"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"অতি আন্ধাৰ। উজ্জ্বল লাইট ব্যৱহাৰ কৰক।"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ফ’নটো আৰু আঁতৰলৈ নিয়ক।"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ফ’নটো ওচৰলৈ আনক।"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ফ’নটো ওপৰলৈ নিয়ক।"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ফ’নটো তললৈ নিয়ক"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ফ’নটো বাওঁফালে নিয়ক।"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ফ’নটো সোঁফালে নিয়ক।"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"উজ্জ্বল পোহৰ থকা ঠাইলৈ গৈ চাওক"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ফ’নটো আৰু আঁতৰলৈ নিয়ক"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ফ’নটো ওচৰলৈ আনক"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ফ’নটো ওপৰলৈ নিয়ক"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ফ’নটো তললৈ নিয়ক"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ফ’নটো আপোনাৰ বাওঁফাললৈ নিয়ক"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ফ’নটো আপোনাৰ সোঁফাললৈ নিয়ক"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"আপোনাৰ ডিভাইচটোলৈ অধিক পোনে পোনে চাওক।"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"আপোনাৰ মুখখন পোনপটীয়াকৈ ফ’নটোৰ সন্মুখত ৰাখক।"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"আপোনাৰ মুখাৱয়ব দেখা নাই। আপোনাৰ ফ’নটো চকুৰ স্তৰত ধৰি ৰাখক।"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"বেছি লৰচৰ কৰি আছে। ফ’নটো স্থিৰকৈ ধৰক।"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক।"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"মুখমণ্ডল আৰু চিনাক্ত কৰিব নোৱাৰি। আকৌ চেষ্টা কৰক।"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"একে ধৰণৰ হৈছে, অনুগ্ৰহ কৰি আপোনাৰ প’জটো সলনি কৰক।"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"আপোনাৰ মূৰটো অলপ কমকৈ হেলনীয়া কৰক।"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"মুখাৱয়ব চিনিব নোৱাৰি। পুনৰ চেষ্টা কৰক।"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"আপোনাৰ মূৰটোৰ স্থান সামান্য সলনি কৰক"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"আপোনাৰ ফ’নটোলৈ আৰু পোনপটীয়াকৈ চাওক"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"আপোনাৰ ফ’নটোলৈ আৰু পোনপটীয়াকৈ চাওক"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"আপোনাৰ ফ’নটোলৈ আৰু পোনপটীয়াকৈ চাওক"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"আপোনাৰ মুখখন ঢাকি ৰখা বস্তুবোৰ আঁতৰাওক।"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"ক’লা বাৰডালকে ধৰি আপোনাৰ স্ক্রীনৰ ওপৰৰ অংশ চাফা কৰক"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"আপোনাৰ মুখাৱয়ব সম্পূৰ্ণৰূপে দেখা পোৱা হৈ থাকিবই লাগিব"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"আপোনাৰ মুখাৱয়ব সম্পূৰ্ণৰূপে দেখা পোৱা হৈ থাকিবই লাগিব"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"মুখাৱয়বৰ মডেল সৃষ্টি কৰিব নোৱাৰি। পুনৰ চেষ্টা কৰক।"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ডাঠ ৰঙৰ চশমা চিনাক্ত কৰা হৈছে। আপোনাৰ মুখাৱয়ব সম্পূৰ্ণৰূপে দেখা পোৱা হৈ থাকিবই লাগিব।"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"মুখাৱয়বত আৱৰণ চিনাক্ত কৰা হৈছে। আপোনাৰ মুখাৱয়ব সম্পূৰ্ণৰূপে দেখা পোৱা হৈ থাকিবই লাগিব।"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। হাৰ্ডৱেৰ নাই।"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 862ef3cc93b7..a7911de524c5 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Barmaq izi ilə kiliddən çıxarma"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Barmaq izi sensorundan istifadə etmək mümkün deyil"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Təmir provayderini ziyarət edin."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Dəqiq üz datası əldə edilmədi. Yenidən cəhd edin."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Üz modelinizi yaratmaq olmur. Yenə cəhd edin."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Çox işıqlıdır. Daha az işıqlı şəkli sınayın."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Çox qaranlıqdır. Parlaq işıqdan istifadə edin."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Telefonu uzaq tutun."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Telefonu yaxına tutun."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Telefonu yuxarı tutun."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Telefonu aşağı tutun."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Telefonu sola hərəkət etdirin."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Telefonu sağa hərəkət etdirin."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Parlaq işıqdan istifadə edin"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Telefonu uzaq tutun"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Telefonu yaxına tutun"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Telefonu yuxarı tutun"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Telefonu aşağı tutun"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Telefonu sola tutun"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Telefonu sağa tutun"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Birbaşa cihaza baxın."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Üzünüzü telefonun qarşısında sabit saxlayın."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Üzünüz görünmür. Telefonunuzu göz səviyyəsində saxlayın."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Cihaz stabil deyil. Telefonu tərpətməyin."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Üzünüzü yenidən qeydiyyatdan keçirin."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Üzü artıq tanımaq olmur. Yenidən cəhd edin."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Digəri ilə oxşardır, pozanızı dəyişin."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Başınızı bir az döndərin."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Başınızı azca əyin."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Başınızı bir az döndərin."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Üzü tanımaq olmur. Yenə cəhd edin."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Başınızın yerini bir az dəyişdirin"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Telefonunuza düz baxın"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Telefonunuza düz baxın"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Telefonunuza düz baxın"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Üzünüzü gizlədən maneələri kənarlaşdırın."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Qara panel daxil olmaqla, ekranın yuxarısını təmizləyin"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Üzünüz tam görünməlidir"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Üzünüz tam görünməlidir"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Üz modelinizi yaratmaq olmur. Yenə cəhd edin."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Tünd eynək aşkar edildi. Üzünüz tam görünməlidir."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Üz örtüyü aşkar edildi. Üzünüz tam görünməlidir."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Üz doğrulanmadı. Avadanlıq əlçatan deyil."</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index b40c77b09459..971d23d3e7df 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Otključavanje otiskom prsta"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Ne možete da koristite senzor za otisak prsta"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Posetite dobavljača za popravke."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Snimanje lica nije uspelo. Probajte ponovo."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Pravljenje modela lica nije uspelo. Probajte ponovo."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Previše je svetlo. Probajte sa slabijim osvetljenjem."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Pretamno je. Probajte sa jačim osvetljenjem."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Udaljite telefon."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Približite telefon."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Pomerite telefon nagore."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Pomerite telefon nadole."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Pomerite telefon ulevo."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Pomerite telefon udesno."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Probajte sa jačim osvetljenjem"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Udaljite telefon"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Približite telefon"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Pomerite telefon nagore"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Pomerite telefon nadole"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Pomerite telefon ulevo"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Pomerite telefon udesno"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Gledajte pravo u uređaj."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Postavite lice direktno ispred telefona"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Ne vidi se lice. Držite telefon u visini očiju."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Mnogo se pomerate. Držite telefon mirno."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Ponovo registrujte lice."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Više ne može da se prepozna lice. Probajte ponovo."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Previše je slično, promenite pozu."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Malo manje pomerite glavu."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Malo manje nagnite glavu."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Malo manje pomerite glavu."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Lice nije prepoznato. Probajte ponovo."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Malo pomerite glavu"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Gledajte pravo u telefon"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Gledajte pravo u telefon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Gledajte pravo u telefon"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Uklonite sve što vam zaklanja lice."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Očistite gornji deo ekrana, uključujući crnu traku"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Lice mora da bude potpuno vidljivo"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Lice mora da bude potpuno vidljivo"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Pravljenje modela lica nije uspelo. Probajte ponovo."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Otkrivene su tamne naočari. Lice mora da bude potpuno vidljivo."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Otkriveno je prekrivanje lica. Lice mora da bude potpuno vidljivo."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Provera lica nije uspela. Hardver nije dostupan."</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 9b33e31c058e..4b5a54fcd5fd 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -636,26 +636,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Разблакіраванне адбіткам пальца"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Не ўдалося скарыстаць сканер адбіткаў пальцаў"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Звярніцеся ў сэрвісны цэнтр."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Не атрымалася распазнаць твар. Паўтарыце спробу."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Не ўдалося стварыць мадэль твару. Паўтарыце."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Занадта светла. Прыглушыце асвятленне."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Занадта цёмна. Павялічце асвятленне."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Перамясціце тэлефон далей."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Перамясціце тэлефон бліжэй."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Перамясціце тэлефон вышэй."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Перамясціце тэлефон ніжэй."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Перамясціце тэлефон улева."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Перамясціце тэлефон управа."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Павялічце асвятленне"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Перамясціце тэлефон далей"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Перамясціце тэлефон бліжэй"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Перамясціце тэлефон вышэй"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Перамясціце тэлефон ніжэй"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Перамясціце тэлефон улева"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Перамясціце тэлефон управа"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Глядзіце прама на экран прылады."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Трымайце тэлефон прама перад тварам."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Не відаць твару. Трымайце тэлефон на ўзроўні вачэй."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Трымайце прыладу нерухома. Трымайце тэлефон роўна."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Паўтарыце рэгістрацыю твару."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Не ўдаецца распазнаць твар. Паўтарыце спробу."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Не бачна розніцы. Памяняйце позу."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Вы занадта моцна павярнулі галаву."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Трымайце галаву прама."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Вы занадта моцна павярнулі галаву."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Твар не распазнаны. Паўтарыце спробу."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Крыху змяніце паставу галавы"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Глядзіце прама на экран тэлефона"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Глядзіце прама на экран тэлефона"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Глядзіце прама на экран тэлефона"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Прыміце ўсё, што закрывае ваш твар."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Ачысціце ад бруду верхнюю частку экрана, у тым ліку чорную панэль"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Твар павінен быць цалкам бачным"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Твар павінен быць цалкам бачным"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Не ўдалося стварыць мадэль твару. Паўтарыце спробу."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Выяўлены цёмныя акуляры. Твар павінен быць цалкам бачным."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Нешта засланяе твар. Твар павінен быць цалкам бачным."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Твар не спраўджаны. Абсталяванне недаступнае."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 9c871474c38d..b9c285fe87b9 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Отключване с отпечатък"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Сензорът за отпечатъци не може да се използва"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Посетете оторизиран сервиз."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Лицето не бе заснето точно. Опитайте отново."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Моделът на лицето ви не бе създаден. Опитайте пак."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Твърде светло е. Опитайте при по-слабо осветление."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Твърде тъмно е. Опитайте при по-силно осветление."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Отдалечете телефона."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Доближете телефона."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Преместете телефона по-високо."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Преместете телефона по-ниско."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Преместете телефона наляво."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Преместете телефона надясно."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Опитайте при по-силно осветление"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Отдалечете телефона"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Доближете телефона"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Преместете телефона по-високо"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Преместете телефона по-ниско"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Преместете телефона наляво"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Преместете телефона надясно"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Моля, гледайте точно към устройството си."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Позиционирайте лицето си директно пред телефона."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Лицето ви не се вижда. Дръжте телефона на нивото на очите си."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Твърде много движение. Дръжте телефона неподвижно."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Моля, регистрирайте лицето си отново."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Лицето не бе разпознато. Опитайте отново."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Позата ви е сходна с предишна. Моля, променете я."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Не завъртайте главата си толкова много."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Не накланяйте главата си толкова много."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Не завъртайте главата си толкова много."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Лицето не е разпознато. Опитайте отново."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Леко променете позицията на главата си"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Гледайте директно към телефона си"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Гледайте директно към телефона си"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Гледайте директно към телефона си"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Премахнете всичко, което закрива лицето ви."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Почистете горната част на екрана си, включително черната лента"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Лицето ви трябва да е напълно видимо"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Лицето ви трябва да е напълно видимо"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Моделът на лицето ви не бе създаден. Опитайте отново."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Изглежда, че носите тъмни очила. То трябва да е напълно видимо."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Изглежда, че лицето ви е покрито. То трябва да е напълно видимо."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Лицето не може да се потвърди. Хардуерът не е налице."</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 09fdd3c4d04a..2241ef498a2d 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ফিঙ্গারপ্রিন্ট আনলক"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"আঙ্গুলের ছাপের সেন্সর ব্যবহার করা যাচ্ছে না"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"একজন মেরামতি মিস্ত্রির কাছে যান।"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"মুখের সঠিক ডেটা পাওয়া যায়নি। আবার চেষ্টা করুন।"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"ফেস মডেল তৈরি করা যাচ্ছে না। আবার চেষ্টা করুন।"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"খুব উজ্জ্বল। আলো কমিয়ে চেষ্টা করে দেখুন।"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"খুব অন্ধকার। আরও উজ্জ্বল আলো ব্যবহার করে দেখুন।"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ফোনটি আরও দূরে নিয়ে যান।"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ফোনটি আরও কাছে নিয়ে আসুন।"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ফোন উঁচুতে তুলুন।"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ফোন নিচে নামান।"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ফোনটি বাঁদিকে সরান।"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ফোনটি ডানদিকে সরান।"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"আরও উজ্জ্বল আলো ব্যবহার করে দেখুন"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ফোন আরও দূরে নিয়ে যান"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ফোন আরও কাছে নিয়ে আসুন"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ফোন আরও উঁচুতে তুলুন"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ফোন নিচে নামান"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ফোন আপনার বাঁদিকে সরান"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ফোন আপনার ডানদিকে সরান"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"সরাসরি ডিভাইসের দিকে তাকান।"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"আপনার মুখ সরাসরি ফোনের সামনে রাখুন।"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"আপনার মুখ দেখা যাচ্ছে না। ফোন আপনার চোখের সোজাসুজি ধরুন।"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"খুব বেশি নড়ছে। ফোনটি যাতে না কাঁপে সেইভাবে ধরুন।"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"আপনার মুখের ছবি আবার নথিভুক্ত করুন।"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"আর মুখ চিনতে পারবেন না। আবার চেষ্টা করুন।"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"একই ধরনের দেখতে, একটু অন্যদিকে ঘুরে দাঁড়ান।"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"আপনার মাথাটি নিচের দিকে সামান্য নামান।"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"আপনার মাথা একটু কম ঝোঁকান।"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"আপনার মাথাটি সামান্য ঘোরান।"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"মুখ শনাক্ত করা যাচ্ছে না। আবার চেষ্টা করুন।"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"আপনার মাথার পজিশন সামান্য পরিবর্তন করুন"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"আপনার ফোনের দিকে আরও সরাসরি তাকান"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"আপনার ফোনের দিকে আরও সরাসরি তাকান"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"আপনার ফোনের দিকে আরও সরাসরি তাকান"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"আপনার মুখকে আড়াল করে এমন সব কিছু সরিয়ে দিন।"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"ব্ল্যাক বার সহ আপনার স্ক্রিনের উপরের অংশ মুছে ফেলুন"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"আপনার মুখ পুরোপুরি দৃশ্যমান হতে হবে"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"আপনার মুখ পুরোপুরি দৃশ্যমান হতে হবে"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"ফেস মডেল তৈরি করা যাচ্ছে না। আবার চেষ্টা করুন।"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"কালো চশমা শনাক্ত করা হয়েছে। আপনার মুখ পুরোপুরি দৃশ্যমান হতে হবে।"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"মুখে মাস্ক শনাক্ত করা হয়েছে। আপনার মুখ পুরোপুরি দৃশ্যমান হতে হবে।"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"ফেস যাচাই করা যায়নি। হার্ডওয়্যার উপলভ্য নেই।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index f4e72fd2e3f6..caf7a7d1f7d2 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Otključavanje otiskom prsta"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Nije moguće koristiti senzor za otisak prsta"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Posjetite pružaoca usluga za popravke."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Lice nije snimljeno precizno. Pokušajte ponovo."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nije moguće kreirati model lica. Pokušajte ponovo."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Previše svijetlo. Probajte s blažim osvjetljenjem."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Previše je tamno. Pokušajte s jačim osvjetljenjem."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Odmaknite telefon."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Primaknite telefon."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Pomjerite telefon naviše."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Pomjerite telefon naniže."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Pomjerite telefon ulijevo."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Pomjerite telefon udesno."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Pokušajte s jačim osvjetljenjem"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Odmaknite telefon"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Primaknite telefon"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Pomjerite telefon naviše"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Pomjerite telefon naniže"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Pomjerite telefon ulijevo"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Pomjerite telefon udesno"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Gledajte direktno u uređaj."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Postavite lice direktno ispred telefona"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Ne vidi se lice. Držite telefon u visini očiju."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Previše pokreta. Držite telefon mirno."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Ponovo registrirajte lice."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Više nije moguće prepoznati lice. Pokušajte opet."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Previše slično, promijenite položaj."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Malo manje zakrenite glavu."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Malo manje nagnite glavu."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Malo manje zakrenite glavu."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Nije moguće prepoznati lice. Pokušajte ponovo."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Malo pomjerite glavu"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Gledajte direktno u telefon"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Gledajte direktno u telefon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Gledajte direktno u telefon"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Uklonite sve što vam zaklanja lice."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Očistite vrh ekrana, uključujući crnu traku"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Lice se mora u potpunosti vidjeti"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Lice se mora u potpunosti vidjeti"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Nije moguće kreirati model lica. Pokušajte ponovo."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Otkrivene su tamne naočale. Lice se mora u potpunosti vidjeti."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Otkriveno je pokrivalo preko lica. Lice se mora u potpunosti vidjeti."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nije moguće potvrditi lice. Hardver nije dostupan."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index f4d8422167ec..f69cc40a48be 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueig amb empremta digital"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"No es pot utilitzar el sensor d\'empremtes digitals"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un proveïdor de reparacions."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"No es reconeix la teva cara. Torna-ho a provar."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"No es pot crear el model facial. Torna-ho a provar."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Massa brillant Prova una il·luminació més suau."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Massa fosc. Prova una il·luminació més brillant."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Allunya\'t del telèfon."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Apropa el telèfon."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Mou el telèfon més amunt."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Mou el telèfon més avall."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Mou el telèfon cap a l\'esquerra."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Mou el telèfon cap a la dreta."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prova amb més il·luminació"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Allunya\'t del telèfon"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Apropa el telèfon"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Mou el telèfon més amunt"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Mou el telèfon més avall"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Mou el telèfon cap a l\'esquerra"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Mou el telèfon cap a la dreta"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Mira més directament cap al dispositiu."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Posa la cara directament davant del telèfon."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"No se\'t veu la cara. Mantén el telèfon a l\'altura dels ulls."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Massa moviment. Subjecta bé el telèfon."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Torna a registrar la teva cara."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Ja no es reconeix la teva cara. Torna-ho a provar."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"És massa semblant; canvia de postura."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"No giris tant el cap."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"No inclinis tant el cap."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"No giris tant el cap."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"No podem reconèixer la cara. Torna-ho a provar."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Canvia lleugerament la posició del cap"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Mira més directament al telèfon"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Mira més directament al telèfon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Mira més directament al telèfon"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Treu qualsevol cosa que amagui la teva cara."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Neteja la part superior de la pantalla, inclosa la barra negra"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"La cara ha de ser completament visible"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"La cara ha de ser completament visible"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"No es pot crear el model facial. Torna-ho a provar."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"S\'han detectat ulleres fosques. La cara ha de ser completament visible."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"S\'ha detectat una mascareta. La cara ha de ser completament visible."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"No es pot verificar la cara. Maquinari no disponible."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 1373873f310b..34ccaea18b77 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -636,26 +636,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odemknutí otiskem prstu"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Snímač otisků prstů nelze použít"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Navštivte servis"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Obličej se nepodařilo zachytit. Zkuste to znovu."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Model se nepodařilo vytvořit. Zkuste to znovu."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Je příliš světlo. Zmírněte osvětlení."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Je moc velká tma. Přejděte na světlo."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Umístěte telefon dál."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Umístěte telefon blíž."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Umístěte telefon výš."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Umístěte telefon níž."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Přesuňte telefon vlevo."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Přesuňte telefon vpravo."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Přejděte na světlo"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Umístěte telefon dál"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Umístěte telefon blíž"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Umístěte telefon výš"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Umístěte telefon níž"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Umístěte telefon víc doleva"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Umístěte telefon víc doprava"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Dívejte se přímo na zařízení."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Umístěte obličej přímo před telefon."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Obličej není vidět. Držte telefon na úrovni očí."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Příliš mnoho pohybu. Držte telefon nehybně."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Zaznamenejte obličej znovu."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Obličej už nelze rozpoznat. Zkuste to znovu."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Příliš podobné, změňte výraz."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Natočte hlavu o něco méně."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Nakloňte hlavu trochu méně."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Natočte hlavu o něco méně."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Obličej se nepodařilo rozpoznat. Zkuste to znovu."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Mírně pohněte hlavou"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Dívejte se přímo na telefon"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Dívejte se přímo na telefon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Dívejte se přímo na telefon"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Odstraňte vše, co vám zakrývá obličej."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Očistěte horní část obrazovky včetně černé části"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Obličej musí být plně viditelný"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Obličej musí být plně viditelný"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Model se nepodařilo vytvořit. Zkuste to znovu."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Byly zjištěny tmavé brýle. Obličej musí být plně viditelný."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Byl zjištěn zakrytý obličej. Obličej musí být plně viditelný."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Obličej nelze ověřit. Hardware není dostupný."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index a4f910172f09..fb9d373977f7 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Oplåsning med fingeraftryk"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Fingeraftrykslæseren kan ikke bruges"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Få den repareret."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Der blev ikke registreret ansigtsdata. Prøv igen."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Din ansigtsmodel kan ikke oprettes. Prøv igen."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Der er for lyst. Prøv en mere dæmpet belysning."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"For mørkt. Prøv med mere belysning."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Flyt telefonen længere væk."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Flyt telefonen tættere på."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Løft telefonen højere op."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Sænk telefonen."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Flyt telefonen til venstre."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Flyt telefonen til højre."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prøv med mere belysning"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Flyt telefonen længere væk"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Flyt telefonen tættere på"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Løft telefonen højere op"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Sænk telefonen"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Flyt telefonen længere til venstre for dig"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Flyt telefonen længere til højre for dig"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Kig mere direkte på din enhed."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Sørg for, at dit ansigt er direkte foran telefonen."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Dit ansigt kan ikke registreres. Hold din telefon i øjenhøjde."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Der er for meget bevægelse. Hold telefonen stille."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Registrer dit ansigt igen."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Ansigtet kan ikke længere genkendes. Prøv igen."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Det minder for meget om et andet. Skift stilling."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Du skal ikke dreje hovedet så meget."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Ret dit hoved lidt op."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Du skal ikke dreje hovedet så meget."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Ansigtet kan ikke genkendes. Prøv igen."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Flyt dit hoved en smule"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Kig mere direkte på din telefon"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Kig mere direkte på din telefon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Kig mere direkte på din telefon"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Hvis noget skjuler dit ansigt, skal du fjerne det."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Rengør toppen af din skærm, inkl. den sorte bjælke"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Dit ansigt skal være helt synligt"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Dit ansigt skal være helt synligt"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Din ansigtsmodel kan ikke oprettes. Prøv igen."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Mørke briller er registreret. Dit ansigt skal være helt synligt."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Ansigtsdækning er registreret. Dit ansigt skal være helt synligt."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ansigt ikke bekræftet. Hardware ikke tilgængelig."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 7a1813b1e8c1..839099a84950 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Entsperrung per Fingerabdruck"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Der Fingerabdrucksensor kann nicht verwendet werden"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Suche einen Reparaturdienstleister auf."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Gesichtsdaten nicht gut erfasst. Erneut versuchen."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kein Gesichtsmodell möglich. Versuche es erneut."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Zu hell. Schwächere Beleuchtung ausprobieren."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Zu dunkel. Probier eine hellere Beleuchtung aus."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Beweg das Telefon weiter weg."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Beweg das Telefon näher heran."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Halte das Smartphone höher."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Beweg das Smartphone nach unten."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Beweg das Smartphone nach links."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Beweg das Smartphone nach rechts."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Probiere es mit einer helleren Beleuchtung"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Bewege das Smartphone weiter weg"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Bewege das Smartphone näher heran"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Bewege das Smartphone nach oben"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Bewege das Smartphone nach unten"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Bewege das Smartphone nach links"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Bewege das Smartphone nach rechts"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Bitte sieh direkt auf dein Gerät."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Halte dein Gesicht direkt vor dein Smartphone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Dein Gesicht wurde nicht erkannt. Halte dein Smartphone auf Augenhöhe."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Zu viel Unruhe. Halte das Smartphone ruhig."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Bitte registriere dein Gesicht noch einmal."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Gesicht wird nicht mehr erkannt. Erneut versuchen."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Zu ähnlich. Bitte dreh deinen Kopf etwas."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Dreh den Kopf etwas weniger zur Seite."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Neig den Kopf etwas weniger stark."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Neig den Kopf etwas weniger stark."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Gesicht nicht erkannt. Versuche es noch einmal."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Ändere die Position deines Kopfes leicht"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Sieh direkt auf dein Smartphone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Sieh direkt auf dein Smartphone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Sieh direkt auf dein Smartphone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Entferne alles, was dein Gesicht verdeckt."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Reinige den oberen Teil deines Bildschirms, einschließlich der schwarzen Leiste"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Dein Gesicht muss vollständig sichtbar sein"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Dein Gesicht muss vollständig sichtbar sein"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Dein Gesichtsmodell kann nicht erstellt werden. Versuche es noch einmal."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Dunkle Brille erkannt. Dein Gesicht muss vollständig sichtbar sein."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Dein Gesicht ist bedeckt. Es muss vollständig sichtbar sein."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Gesicht nicht erkannt. Hardware nicht verfügbar."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 8f9d23e38010..2968efd5e5c7 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Ξεκλείδωμα με δακτυλικό αποτύπωμα"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Δεν είναι δυνατή η χρήση του αισθητήρα δακτυλικών αποτυπωμάτων"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Επισκεφτείτε έναν πάροχο υπηρεσιών επισκευής."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Αδύνατη λήψη ακριβών δεδομ. προσώπου. Επανάληψη."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Αδύν. η δημιουρ. του μοντ. προσώπ. Δοκιμάστε ξανά."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Υπερβολικά έντονος φωτισμός. Δοκιμάστε πιο ήπιο."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Πολύ σκοτεινό περιβάλλον. Φροντίστε τον φωτισμό."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Απομακρύνετε περισσότερο το τηλέφωνο."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Πλησιάστε περισσότερο το τηλέφωνο."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Μετακινήστε το τηλέφωνο πιο ψηλά."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Μετακινήστε το τηλέφωνο πιο χαμηλά."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Μετακινήστε το τηλέφωνο στα αριστερά."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Μετακινήστε το τηλέφωνο στα δεξιά."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Δοκιμάστε με περισσότερο φως"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Απομακρύνετε περισσότερο το τηλέφωνο"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Φέρτε πιο κοντά το τηλέφωνό σας"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Μετακινήστε το τηλέφωνο πιο ψηλά"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Μετακινήστε πιο χαμηλά το τηλέφωνο"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Μετακινήστε το τηλέφωνο προς τα αριστερά"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Μετακινήστε το τηλέφωνο προς τα δεξιά"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Κοιτάξτε απευθείας τη συσκευή σας."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Στρέψτε το πρόσωπό σάς απευθείας στο τηλέφωνο."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Δεν εντοπίστηκε το πρόσωπό σας. Κρατήστε το τηλέφωνο στο ύψος των ματιών."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Πάρα πολλή κίνηση. Κρατήστε σταθερό το τηλέφωνο."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Καταχωρίστε ξανά το πρόσωπό σας."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Αδύνατη η αναγνώριση του προσώπου. Επανάληψη."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Πολύ παρόμοιο, αλλάξτε την πόζα σας."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Στρέψτε λιγότερο το κεφάλι σας."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Γείρετε λιγότερο το κεφάλι σας."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Στρέψτε λιγότερο το κεφάλι σας."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Το πρόσωπο δεν αναγνωρίζεται. Δοκιμάστε ξανά."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Αλλάξτε ελαφρώς τη θέση του κεφαλιού σας"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Κοιτάξτε απευθείας το τηλέφωνό σας"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Κοιτάξτε απευθείας το τηλέφωνό σας"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Κοιτάξτε απευθείας το τηλέφωνό σας"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Απομακρύνετε οτιδήποτε κρύβει το πρόσωπό σας."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Καθαρίστε το επάνω μέρος της οθόνης σας, συμπεριλαμβανομένης της μαύρης γραμμής"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Το πρόσωπό σας πρέπει να φαίνεται πλήρως."</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Το πρόσωπό σας πρέπει να φαίνεται πλήρως."</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Αδύνατη η δημιουργία του μοντέλου προσώπου. Δοκιμάστε ξανά."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Ανιχνεύτηκαν σκούρα γυαλιά. Το πρόσωπό σας πρέπει να φαίνεται πλήρως."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Ανιχνεύτηκε κάλυμμα προσώπου. Το πρόσωπό σας πρέπει να φαίνεται πλήρως."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Αδύν. επαλήθ. προσώπου. Μη διαθέσιμος εξοπλισμός."</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 4e1c415db7a9..180ff8fa73db 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Can’t use fingerprint sensor"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Couldn’t capture accurate face data. Try again."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Too dark. Try brighter lighting."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Move phone farther away."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Move phone closer."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Move phone higher."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Move phone lower."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Move phone to the left."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Move phone to the right."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone further away"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Move phone lower"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Move phone to your left"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Move phone to your right"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Please look more directly at your device."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Position your face directly in front of the phone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Can’t see your face. Hold your phone at eye level."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Too much motion. Hold phone steady."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Please re-enroll your face."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"No longer able to recognise face. Try again."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Too similar, please change your pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Turn your head a little less."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Tilt your head a little less."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Turn your head a little less."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Can’t recognise face. Try again."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Change the position of your head slightly"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Look more directly at your phone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Look more directly at your phone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Look more directly at your phone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Remove anything hiding your face."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Clean the top of your screen, including the black bar"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Your face must be fully visible"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Your face must be fully visible"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Can’t create your face model. Try again."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Dark glasses detected. Your face must be fully visible."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Face covering detected. Your face must be fully visible."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 0d8285251ea5..12821fe1527c 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Can’t use fingerprint sensor"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Couldn’t capture accurate face data. Try again."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Too dark. Try brighter lighting."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Move phone farther away."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Move phone closer."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Move phone higher."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Move phone lower."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Move phone to the left."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Move phone to the right."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone further away"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Move phone lower"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Move phone to your left"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Move phone to your right"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Please look more directly at your device."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Position your face directly in front of the phone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Can’t see your face. Hold your phone at eye level."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Too much motion. Hold phone steady."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Please re-enroll your face."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"No longer able to recognise face. Try again."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Too similar, please change your pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Turn your head a little less."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Tilt your head a little less."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Turn your head a little less."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Can’t recognise face. Try again."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Change the position of your head slightly"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Look more directly at your phone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Look more directly at your phone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Look more directly at your phone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Remove anything hiding your face."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Clean the top of your screen, including the black bar"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Your face must be fully visible"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Your face must be fully visible"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Can’t create your face model. Try again."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Dark glasses detected. Your face must be fully visible."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Face covering detected. Your face must be fully visible."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 606dc80308e2..f4f7e80f6307 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Can’t use fingerprint sensor"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Couldn’t capture accurate face data. Try again."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Too dark. Try brighter lighting."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Move phone farther away."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Move phone closer."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Move phone higher."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Move phone lower."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Move phone to the left."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Move phone to the right."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone further away"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Move phone lower"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Move phone to your left"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Move phone to your right"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Please look more directly at your device."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Position your face directly in front of the phone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Can’t see your face. Hold your phone at eye level."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Too much motion. Hold phone steady."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Please re-enroll your face."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"No longer able to recognise face. Try again."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Too similar, please change your pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Turn your head a little less."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Tilt your head a little less."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Turn your head a little less."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Can’t recognise face. Try again."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Change the position of your head slightly"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Look more directly at your phone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Look more directly at your phone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Look more directly at your phone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Remove anything hiding your face."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Clean the top of your screen, including the black bar"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Your face must be fully visible"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Your face must be fully visible"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Can’t create your face model. Try again."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Dark glasses detected. Your face must be fully visible."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Face covering detected. Your face must be fully visible."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 399034380a9b..631cf2b0c3da 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Can’t use fingerprint sensor"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Couldn’t capture accurate face data. Try again."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Too dark. Try brighter lighting."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Move phone farther away."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Move phone closer."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Move phone higher."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Move phone lower."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Move phone to the left."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Move phone to the right."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone further away"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Move phone lower"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Move phone to your left"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Move phone to your right"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Please look more directly at your device."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Position your face directly in front of the phone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Can’t see your face. Hold your phone at eye level."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Too much motion. Hold phone steady."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Please re-enroll your face."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"No longer able to recognise face. Try again."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Too similar, please change your pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Turn your head a little less."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Tilt your head a little less."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Turn your head a little less."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Can’t recognise face. Try again."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Change the position of your head slightly"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Look more directly at your phone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Look more directly at your phone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Look more directly at your phone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Remove anything hiding your face."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Clean the top of your screen, including the black bar"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Your face must be fully visible"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Your face must be fully visible"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Can’t create your face model. Try again."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Dark glasses detected. Your face must be fully visible."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Face covering detected. Your face must be fully visible."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index b8aca7344ac3..3bb25cb3ebe4 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Can’t use fingerprint sensor"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visit a repair provider."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Couldn’t capture accurate face data. Try again."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Can’t create your face model. Try again."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Too bright. Try gentler lighting."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Too dark. Try brighter lighting."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Move phone farther away."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Move phone closer."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Move phone higher."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Move phone lower."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Move phone to the left."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Move phone to the right."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Try brighter lighting"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Move phone farther away"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Move phone closer"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Move phone higher"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Move phone lower"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Move phone to your left"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Move phone to your right"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Please look more directly at your device."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Position your face directly in front of the phone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Can’t see your face. Hold your phone at eye level."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Too much motion. Hold phone steady."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Please re-enroll your face."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"No longer able to recognize face. Try again."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Too similar, please change your pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Turn your head a little less."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Tilt your head a little less."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Turn your head a little less."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Can’t recognize face. Try again."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Change the position of your head slightly"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Look more directly at your phone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Look more directly at your phone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Look more directly at your phone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Remove anything hiding your face."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Clean the top of your screen, including the black bar"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Your face must be fully visible"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Your face must be fully visible"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Can’t create your face model. Try again."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Dark glasses detected. Your face must be fully visible."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Face covering detected. Your face must be fully visible."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 5c0ef1303260..de1cfdebd4ee 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo con huellas dactilares"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"No se puede usar el sensor de huellas dactilares"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Consulta a un proveedor de reparaciones."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Datos faciales imprecisos. Vuelve a intentarlo."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"No se puede crear modelo de rostro. Reinténtalo."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Demasiado brillante. Prueba con menos iluminación."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Demasiado oscuro. Prueba con más iluminación."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Aleja un poco más el teléfono."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Acerca el teléfono."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Mueve el teléfono hacia arriba."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Mueve el teléfono hacia abajo."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Mueve el teléfono hacia la izquierda."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Mueve el teléfono hacia la derecha."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prueba con más iluminación"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Aleja el teléfono un poco más"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Acerca el teléfono"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Mueve el teléfono hacia arriba"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Mueve el teléfono hacia abajo"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Mueve el teléfono hacia la izquierda"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Mueve el teléfono hacia la derecha"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Mira directamente al dispositivo."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Ubica el rostro directamente frente al teléfono."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"No se ve tu cara. Sostén el teléfono a la altura de los ojos."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Te estás moviendo demasiado. No muevas el teléfono"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Vuelve a registrar tu rostro."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Ya no se reconoce el rostro. Vuelve a intentarlo."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Es muy similar a la anterior. Haz otra pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Gira la cabeza un poco menos."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Inclina un poco menos la cabeza."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Gira la cabeza un poco menos."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"No se reconoce el rostro. Vuelve a intentarlo."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Cambia levemente la posición de la cabeza"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Mira el teléfono de forma más directa"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Mira el teléfono de forma más directa"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Mira el teléfono de forma más directa"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Quítate cualquier objeto que te cubra el rostro."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Limpia la parte superior de la pantalla, incluida la barra negra"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Tu rostro debe verse completamente"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Tu rostro debe verse completamente"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"No se puede crear modelo de rostro. Vuelve a intentarlo."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Se detectaron lentes oscuros. Tu rostro debe verse completamente."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Se detectó que llevas mascarilla. Tu rostro debe verse completamente."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"No se verificó el rostro. Hardware no disponible."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 69e952605214..ae768433ff81 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo con huella digital"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"No se puede usar el sensor de huellas digitales"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un proveedor de reparaciones."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Datos faciales no reconocidos. Vuelve a intentarlo."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"No se puede crear tu modelo. Inténtalo de nuevo."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Hay demasiada luz. Busca un sitio menos iluminado."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Demasiado oscuro. Prueba en un lugar con más luz."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Aleja el teléfono."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Acerca el teléfono."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Sube el teléfono."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Baja el teléfono."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Mueve el teléfono hacia la izquierda."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Mueve el teléfono hacia la derecha."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prueba en un lugar con más luz"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Aleja el teléfono"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Acerca el teléfono"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Sube el teléfono"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Baja el teléfono"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Mueve el teléfono hacia la izquierda"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Mueve el teléfono hacia la derecha"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Mira de forma más directa al dispositivo."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Coloca la cara directamente frente al teléfono."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"No se detecta tu cara. Sujeta el teléfono a la altura de los ojos."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"El teléfono se mueve demasiado. Mantenlo quieto."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Vuelve a registrar tu cara."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"No puede reconocer tu cara. Vuelve a intentarlo."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Se parece mucha a la anterior. Pon otra cara."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Gira la cabeza un poco menos."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"No inclines tanto la cabeza."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"No gires tanto la cabeza."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"No se reconoce la cara. Inténtalo de nuevo."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Cambia ligeramente la posición de tu cabeza"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Mira al teléfono de forma más directa"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Mira al teléfono de forma más directa"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Mira al teléfono de forma más directa"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Retira cualquier objeto que te tape la cara."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Limpia la parte superior de la pantalla, incluida la barra de color negro"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Tu cara se debe poder ver por completo"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Tu cara se debe poder ver por completo"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"No se puede crear tu modelo. Inténtalo de nuevo."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Gafas oscuras detectadas. Tu cara se debe poder ver por completo."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Mascarilla detectada. Tu cara se debe poder ver por completo."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"No se puede verificar. Hardware no disponible."</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 4044249ba1d6..694b69671e31 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Sõrmejäljega avamine"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Sõrmejäljeandurit ei saa kasutada"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Külastage remonditeenuse pakkujat."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Näoandmeid ei saanud jäädvustada. Proovige uuesti."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Teie näomudelit ei saa luua. Proovige uuesti."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Liiga ere. Proovige hämaramat valgust."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Liiga pime. Proovige parema valgustusega kohas."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Liigutage telefon kaugemale."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Liigutage telefon lähemale."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Liigutage telefoni kõrgemale."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Liigutage telefoni allapoole."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Liigutage telefoni vasakule."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Liigutage telefoni paremale."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Proovige parema valgustusega kohas"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Liigutage telefoni kaugemale"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Liigutage telefoni lähemale"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Liigutage telefoni kõrgemale"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Liigutage telefoni allapoole"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Liigutage telefoni vasakule"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Liigutage telefoni paremale"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Vaadake otse oma seadmesse."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Hoidke oma nägu otse telefoni ees."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Teie nägu ei ole näha. Hoidke telefoni silmade kõrgusel."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Liiga palju liikumist. Hoidke telefoni paigal."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Registreerige oma nägu uuesti."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Nägu ei õnnestu enam tuvastada. Proovige uuesti."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Liiga sarnane, palun muutke oma asendit."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Pöörake oma pead veidi vähem."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Kallutage oma pead pisut vähem."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Pöörake oma pead veidi vähem."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Nägu ei õnnestu tuvastada. Proovige uuesti."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Muutke pisut oma pea asendit"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Vaadake otse telefoni"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Vaadake otse telefoni"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Vaadake otse telefoni"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Eemaldage kõik, mis varjab teie nägu."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Puhastage ekraani ülaosa, sh musta värvi riba"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Teie nägu peab olema täielikult nähtaval"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Teie nägu peab olema täielikult nähtaval"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Teie näomudelit ei saa luua. Proovige uuesti."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Tuvastati tumedad prillid. Teie nägu peab olema täielikult nähtaval."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Tuvastati nägu kattev ese. Teie nägu peab olema täielikult nähtaval."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nägu ei saa kinnitada. Riistvara pole saadaval."</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 5212a8d22ff8..17b55f9bf383 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Hatz-marka bidez desblokeatzea"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Ezin da erabili hatz-marken sentsorea"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Jarri harremanetan konponketak egiten dituen hornitzaile batekin."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Ezin izan dira bildu argazkiaren datu zehatzak. Saiatu berriro."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Ezin da sortu aurpegi-eredua. Saiatu berriro."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Argi gehiegi dago. Joan toki ilunago batera."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Ilunegi dago. Erabili argi gehiago."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Urrundu telefonoa."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Hurbildu telefonoa."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Igo telefonoa."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Jaitsi telefonoa."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Mugitu telefonoa ezkerretara."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Mugitu telefonoa eskuinetara."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Erabili argi gehiago"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Urrundu telefonoa"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Hurbildu telefonoa"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Igo telefonoa"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Jaitsi telefonoa"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Eraman telefonoa ezkerrera"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Eraman telefonoa eskuinera"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Begiratu zuzenago gailuari."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Ipini aurrez aurre aurpegia eta telefonoa."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Ezin da hauteman aurpegia. Eutsi telefonoari begien parean."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Mugimendu gehiegi dago. Eutsi tinko telefonoari."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Erregistratu berriro aurpegia."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Ez dugu ezagutzen aurpegi hori. Saiatu berriro."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Jarrera berdintsuegia da. Alda ezazu."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Biratu burua pixka bat gutxiago."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Makurtu burua pixka bat gutxiago."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Biratu burua pixka bat gutxiago."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Ezin da hauteman aurpegia. Saiatu berriro."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Aldatu buruaren posizioa apur bat"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Begiratu zuzenago telefonoari"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Begiratu zuzenago telefonoari"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Begiratu zuzenago telefonoari"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Kendu aurpegia estaltzen dizuten gauzak."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Garbitu pantailaren goialdea, barra beltza barne"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Aurpegi osoak egon behar du ikusgai"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Aurpegi osoak egon behar du ikusgai"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Ezin da sortu aurpegi-eredua. Saiatu berriro."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Betaurreko ilunak hauteman dira. Aurpegi osoak egon behar du ikusgai."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Maskara bat hauteman da. Aurpegi osoak egon behar du ikusgai."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ezin da egiaztatu aurpegia. Hardwarea ez dago erabilgarri."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index b1d46e67ed25..4579c279f6e8 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"قفلگشایی با اثر انگشت"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"امکان استفاده از حسگر اثر انگشت وجود ندارد"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"به ارائهدهنده خدمات تعمیر مراجعه کنید."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"دادههای دقیق چهره ضبط نشد. دوباره امتحان کنید."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"مدل چهره ایجاد نشد. دوباره امتحان کنید."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"خیلی روشن است. روشناییاش را ملایمتر کنید."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"خیلی تاریک است. تصویر را روشنتر کنید."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"تلفن را به دورتر منتقل کنید."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"تلفن را نزدیکتر بیاورید."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"تلفن را بالاتر ببرید."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"تلفن را پایینتر بیاورید."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"تلفن را بهسمت چپ حرکت دهید."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"تلفن را به سمت راست حرکت دهید."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"نور را بیشتر کنید"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"تلفن را دورتر ببرید"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"تلفن را نزدیکتر بیاورید"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"تلفن را بالاتر ببرید"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"تلفن را پایینتر ببرید"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"تلفن را بهسمت چپ ببرید"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"تلفن را بهسمت راست ببرید"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"لطفاً مستقیم به دستگاه نگه کنید."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"صورتتان را مستقیماً روبروی تلفن قرار دهید."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"چهره دیده نمیشود. تلفن را همسطح چشمانتان نگه دارید."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"حرکت خیلی زیاد است. تلفن را ثابت نگهدارید."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"لطفاً چهرهتان را مجدداً ثبت کنید."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"دیگر چهره را تشخیص نمیدهد. دوباره امتحان کنید."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"بسیار شبیه قبلی است، لطفاً قیافه دیگری بگیرید."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"سرتان را کمی صاف بگیرید."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"سرتان را کمی صاف کنید."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"سرتان را کمی صاف بگیرید."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"چهره شناسایی نشد. دوباره امتحان کنید."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"موقعیت سرتان را کمی تغییر دهید"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"مستقیمتر به تلفن نگاه کنید"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"مستقیمتر به تلفن نگاه کنید"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"مستقیمتر به تلفن نگاه کنید"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"هر چیزی که جلو صورت شما را میگیرد بردارید."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"بالای صفحه و همچنین نوار مشکی را تمیز کنید."</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"چهرهتان باید کاملاً نمایان باشد"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"چهرهتان باید کاملاً نمایان باشد"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"مدل چهره ایجاد نشد. دوباره امتحان کنید."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"عینک تیره شناسایی شد. چهرهتان باید کاملاً نمایان باشد."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"پوشش صورت شناسایی شد. چهرهتان باید کاملاً نمایان باشد."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"چهره تأیید نشد. سختافزار در دسترس نیست."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 11524b20e655..6d2424f10a7c 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Sormenjälkiavaus"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Sormenjälkitunnistinta ei voi käyttää"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Ota yhteys korjauspalveluun."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Tarkan kasvodatan tallennus epäonnistui. Yritä uudelleen."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kasvomallia ei voi luoda. Yritä uudelleen."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Liian kirkasta. Kokeile pehmeämpää valaistusta."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Liian pimeää. Kokeile kirkkaampaa valaistusta."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Siirrä puhelinta kauemmas."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Siirrä puhelinta lähemmäs."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Siirrä puhelinta ylemmäs."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Siirrä puhelinta alemmas."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Siirrä puhelinta vasemmalle."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Siirrä puhelinta oikealle."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Kokeile kirkkaampaa valaistusta"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Vie puhelin kauemmas"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Tuo puhelin lähemmäs"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Siirrä puhelinta ylemmäs"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Siirrä puhelinta alemmas"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Siirrä puhelinta vasemmalle"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Siirrä puhelinta oikealle"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Katso suoremmin laitteeseen."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Aseta kasvosi suoraan puhelimen eteen."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Kasvoja ei näy. Pidä puhelinta silmien korkeudella."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Laite liikkui liikaa. Pidä puhelin vakaana."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Rekisteröi kasvot uudelleen."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Ei enää tunnista kasvoja. Yritä uudelleen."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Liian samanlainen, vaihda asentoa."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Käännä päätä vähän vähemmän."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Kallista päätäsi vähän vähemmän."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Käännä päätä vähän vähemmän."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Kasvoja ei voi tunnistaa. Yritä uudelleen."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Liikuta päätä hieman"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Katso suoremmin puhelimeen"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Katso suoremmin puhelimeen"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Katso suoremmin puhelimeen"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Poista esteet kasvojesi edestä."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Puhdista näytön yläreuna, mukaan lukien musta palkki"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Kasvojen täytyy näkyä kokonaan"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Kasvojen täytyy näkyä kokonaan"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Kasvomallia ei voi luoda. Yritä uudelleen."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Tummat lasit havaittu. Kasvojen täytyy näkyä kokonaan."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Kasvot peittävä asia havaittu. Kasvojen täytyy näkyä kokonaan."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Kasvoja ei voi vahvistaa. Laitteisto ei käytettäv."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 8ca43d53e8b9..5338cfc1f7eb 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Déverrouillage par empreinte digitale"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Impossible d\'utiliser le capteur d\'empreintes digitales"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Consultez un fournisseur de services de réparation."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Imposs. capt. données visage précises. Réessayez."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Impossible de créer votre modèle facial. Réessayez."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Trop lumineux. Essayez un éclairage plus faible."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Trop sombre. Essayez avec un éclairage plus fort."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Déplacez le téléphone plus loin."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Rapprochez le téléphone."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Déplacez le téléphone plus haut."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Déplacez le téléphone plus bas."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Déplacez le téléphone vers la gauche."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Déplacez le téléphone vers la droite."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Essayez avec un éclairage plus fort"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Éloignez le téléphone"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Rapprochez le téléphone"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Tenez le téléphone plus haut"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Tenez le téléphone plus bas"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Déplacez le téléphone vers la gauche"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Déplacez le téléphone vers la droite"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Veuillez regarder plus directement votre appareil."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Placez votre visage directement devant le téléphone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Impossible de voir votre visage. Tenez votre téléphone à la hauteur des yeux."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Trop de mouvement. Tenez le téléphone immobile."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Veuillez inscrire votre visage à nouveau."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Ce visage ne sera plus reconnu. Réessayez."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Trop similaire. Changez de pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Tournez un peu moins votre tête."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Inclinez un peu moins votre tête."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Tournez un peu moins votre tête."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Visage non reconnu. Réessayez."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Modifiez légèrement la position de votre tête"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Regardez plus directement votre téléphone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Regardez plus directement votre téléphone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Regardez plus directement votre téléphone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Retirez tout ce qui pourrait couvrir votre visage."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Nettoyez le haut de l\'écran, y compris la barre noire"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Votre visage doit être entièrement visible"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Votre visage doit être entièrement visible"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Impossible de créer votre modèle facial. Réessayez."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Lunettes sombres détectées. Votre visage doit être entièrement visible."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Couvre-visage détecté. Votre visage doit être entièrement visible."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imposs. de vérif. visage. Matériel non accessible."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index da39213dbee5..0fbd7de60b9b 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Déverrouillage par empreinte digitale"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Impossible d\'utiliser le lecteur d\'empreinte digitale"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Contactez un réparateur."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Capture du visage impossible. Réessayez."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Impossible de créer l\'empreinte faciale. Réessayez."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Trop lumineux. Essayez de baisser la lumière."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Trop sombre. Essayez une éclairage plus lumineux."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Éloignez le téléphone."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Rapprochez le téléphone."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Montez le téléphone."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Baissez le téléphone."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Déplacez le téléphone vers la gauche."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Déplacez le téléphone vers la droite."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Essayez un éclairage plus lumineux"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Éloignez le téléphone."</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Rapprochez le téléphone"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Déplacez le téléphone vers le haut"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Déplacez le téléphone vers le bas"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Déplacez le téléphone vers la gauche"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Déplacez le téléphone vers la droite"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Veuillez regarder plus directement l\'appareil."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Placez votre visage en face du téléphone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Visage non détecté. Tenez votre téléphone à hauteur des yeux."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Trop de mouvement. Ne bougez pas le téléphone."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Veuillez enregistrer à nouveau votre visage."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Impossible de reconnaître le visage. Réessayez."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Ressemble à un visage existant, changez de pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Tournez un peu moins la tête."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Penchez un peu moins la tête."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Tournez un peu moins la tête."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Visage non reconnu. Réessayez."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Déplacez légèrement votre tête."</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Regardez plus directement votre téléphone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Centrez bien votre visage devant votre téléphone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Regardez plus directement votre téléphone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Retirez tout ce qui cache votre visage."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Nettoyez la partie supérieure de l\'écran, y compris la barre noire"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Votre visage doit être entièrement visible"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Votre visage doit être entièrement visible"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Impossible de créer votre empreinte faciale. Réessayez."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Lunettes sombres détectées. Votre visage doit être entièrement visible."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Masque détecté. Votre visage doit être entièrement visible."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imposs. valider visage. Matériel non disponible."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 1963dd55c655..dec1e0691967 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo dactilar"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Non se puido usar o sensor de impresión dixital"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un provedor de reparacións."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Sen datos faciais exactos. Téntao de novo."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Non se puido crear o modelo facial. Téntao de novo."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Hai demasiada iluminación. Proba cunha máis suave."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Hai demasiada escuridade. Proba con máis luz."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Separa máis o teléfono."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Achega máis o teléfono."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Eleva o teléfono."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Baixa o teléfono."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Move o teléfono cara á esquerda."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Move o teléfono cara á dereita."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Proba con máis luz"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Afasta o teléfono"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Achega o teléfono"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Sube o teléfono"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Baixa o teléfono"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Move o teléfono cara á esquerda"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Move o teléfono cara á dereita"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Mira o dispositivo de forma máis directa."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Coloca a cara directamente diante do teléfono."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Non se pode ver a túa cara. Coloca o teléfono á altura dos ollos."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Demasiado movemento. Non movas o teléfono."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Volve rexistrar a túa cara."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Xa non se pode recoñecer a cara. Téntao de novo."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"É moi similar. Cambia a pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Xira a cabeza un pouco menos."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Inclina a cabeza un pouco menos."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Xira a cabeza un pouco menos."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Non se recoñeceu a cara. Téntao de novo."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Cambia lixeiramente a posición da cabeza"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Mira o teléfono de forma máis directa"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Mira o teléfono de forma máis directa"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Mira o teléfono de forma máis directa"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Quita todo o que oculte a túa cara."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Limpa a parte superior da pantalla, incluída a barra de cor negra"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"A cara debe poder verse por completo"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"A cara debe poder verse por completo"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Non se puido crear o modelo facial. Téntao de novo."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Detectáronse lentes escuras. A cara debe poder verse por completo."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Detectouse unha máscara. A cara debe poder verse por completo."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Sen verificar a cara. Hardware non dispoñible."</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 5c67c0cdab8d..1dc75235dbb1 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ફિંગરપ્રિન્ટ અનલૉક"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"ફિંગરપ્રિન્ટ સેન્સરનો ઉપયોગ કરી શકાતો નથી"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"રિપેર કરવાની સેવા આપતા પ્રદાતાની મુલાકાત લો."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"ચહેરાનો સચોટ ડેટા કૅપ્ચર ન થયો. ફરી પ્રયાસ કરો."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"તમારા ચહેરાનું મૉડલ ન બનાવી શકાય. ફરી પ્રયાસ કરો."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"અતિશય પ્રકાશિત. થોડો હળવો પ્રકાશ અજમાવી જુઓ."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"અતિશય ઘેરી. વધુ ઝળહળતો પ્રકાશ અજમાવો"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ફોનને વધુ દૂર ખસેડો."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ફોનને વધુ નજીક લાવો."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ફોનને વધુ ઊંચે ખસેડો."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ફોનને થોડો નીચે ખસેડો."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ફોનને ડાબી બાજુ ખસેડો."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ફોનને જમણી બાજુ ખસેડો."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"વધુ પ્રકાશિત લાઇટિંગ અજમાવો"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ફોનને વધુ દૂર લઈ જાઓ"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ફોનને વધુ નજીક લાવો"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ફોનને વધુ ઊંચે લઈ જાઓ"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ફોનને થોડો નીચે લઈ જાઓ"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ફોનને તમારી ડાબી બાજુએ લઈ જાઓ"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ફોનને તમારી જમણી બાજુએ લઈ જાઓ"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"કૃપા કરીને તમારા ડિવાઇસ તરફ સીધું જુઓ."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"તમારો ચહેરો તમારા ફોનની બિલકુલ સામે રાખો."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"તમારો ચહેરો દેખાતો નથી. તમારા ફોનને આંખના લેવલ પર પકડી રાખો."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"ડિવાઇસ અસ્થિર છે. ફોનને સ્થિર રાખો."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"ચહેરો ઓળખી શકાતો નથી. ફરી પ્રયાસ કરો."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ઘણી સમાનતા ધરાવે છે, કૃપા કરીને તમારો પોઝ બદલો."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"તમારું માથું થોડું ફેરવો."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"તમારું માથું થોડું ઓછું ટિલ્ટ કરો."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"તમારું માથું થોડું ઓછું ફેરવો."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"ચહેરો ઓળખી શકતા નથી. ફરી પ્રયાસ કરો."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"તમારા માથાની સ્થિતિ સહેજ બદલો"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"વધારે પ્રમાણમાં સીધું તમારા ફોન તરફ જુઓ"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"વધારે પ્રમાણમાં સીધું તમારા ફોન તરફ જુઓ"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"વધારે પ્રમાણમાં સીધું તમારા ફોન તરફ જુઓ"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"તમારા ચહેરાને છુપાવતી કંઈપણ વસ્તુ દૂર કરો."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"કાળી પટ્ટી સહિત, તમારી સ્ક્રીનની ટોચ સાફ કરો"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"તમારો આખો ચહેરો દેખાવો આવશ્યક છે"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"તમારો આખો ચહેરો દેખાવો આવશ્યક છે"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"તમારા ચહેરાનું મૉડલ ન બનાવી શકાય. ફરી પ્રયાસ કરો."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"કાળા ચશ્માંની ભાળ મળી. તમારો આખો ચહેરો દેખાવો આવશ્યક છે."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ચહેરો ઢંકાયેલો હોવાની ભાળ મળી. તમારો આખો ચહેરો દેખાવો આવશ્યક છે."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"ચહેરો ચકાસી શકાતો નથી. હાર્ડવેર ઉપલબ્ધ નથી."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index e315f548b402..4bf82c8a3537 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"फ़िंगरप्रिंट अनलॉक"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"फ़िंगरप्रिंट सेंसर इस्तेमाल नहीं किया जा सकता"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"फ़िंगरप्रिंट सेंसर को रिपेयर करने की सेवा देने वाली कंपनी से संपर्क करें."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"चेहरे से जुड़ा सटीक डेटा कैप्चर नहीं किया जा सका. फिर से कोशिश करें."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"चेहरे का माॅडल नहीं बन सका. फिर से कोशिश करें."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"बहुत रोशनी है. हल्की रोशनी आज़माएं."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"बहुत अंधेरा है. बेहतर रोशनी में आज़माएं."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"फ़ोन को दूर ले जाएं."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"फ़ोन को नज़दीक ले जाएं."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"फ़ोन को और ऊपर ले जाएं."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"फ़ोन को थोड़ा नीचे ले जाएं."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"फ़ोन को बाईं ओर घुमाएं."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"फ़ोन को दाईं ओर घुमाएं."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"बेहतर रोशनी में कोशिश करें"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"फ़ोन को दूर ले जाएं"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"फ़ोन को नज़दीक लाएं"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"फ़ोन को थोड़ा और ऊपर ले जाएं"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"फ़ोन को थोड़ा नीचे ले जाएं"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"फ़ोन को अपने बाईं ओर ले जाएं"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"फ़ोन को अपने दाईं ओर ले जाएं"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"कृपया अपने डिवाइस की तरफ़ सीधे देखें."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"अपने चेहरे को फोन के ठीक सामने लाएं."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"आपका चेहरा नहीं दिख रहा है. फ़ोन को अपनी आंखों की सीध में पकड़कर रखें."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"डिवाइस बहुत ज़्यादा हिल रहा है. फ़ोन को बिना हिलाएं पकड़ें."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"कृपया फिर से अपने चेहरे की पहचान कराएं."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"अब चेहरे की पहचान नहीं कर पा रहा. फिर से कोशिश करें."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"चेहरा काफ़ी मिलता-जुलता है, कृपया अपना पोज़ बदलें."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"अपना सिर थोड़ा कम घुमाएं."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"अपने सिर को थोड़ा कम झुकाएं."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"अपना सिर थोड़ा कम घुमाएं."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"चेहरे की पहचान नहीं हुई. फिर से कोशिश करें."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"अपने सिर की पोज़िशन को थोड़ा बदलें"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"अपने फ़ोन की तरफ़ बिलकुल सीधा देखें"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"अपने फ़ोन की तरफ़ बिलकुल सीधा देखें"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"अपने फ़ोन की तरफ़ बिलकुल सीधा देखें"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"आपके चेहरे को छिपाने वाली सभी चीज़ों को हटाएं."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"अपनी स्क्रीन के सबसे ऊपरी हिस्से को साफ़ करें, जिसमें काले रंग वाला बार भी शामिल है"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"आपका पूरा चेहरा दिखना चाहिए"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"आपका पूरा चेहरा दिखना चाहिए"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"चेहरे का माॅडल नहीं बन सका. फिर से कोशिश करें."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"आपने गहरे रंग का चश्मा पहना है. आपका पूरा चेहरा दिखना चाहिए."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"चेहरा ढका हुआ है. आपका पूरा चेहरा दिखना चाहिए."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"चेहरा नहीं पहचान पा रहे. हार्डवेयर उपलब्ध नहीं है."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index b0bc0b73da1c..40c6e7b5d654 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Otključavanje otiskom prsta"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Senzor otiska prsta ne može se koristiti"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Posjetite davatelja usluga popravaka."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Podaci o licu nisu točni. Pokušajte ponovo."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Izrada modela lica nije uspjela. Pokušajte ponovo."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Presvijetlo je. Pokušajte sa slabijim svjetlom."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Pretamno je. Pokušajte s jačim osvjetljenjem."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Udaljite telefon."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Približite telefon."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Pomaknite telefon više."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Pomaknite telefon niže."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Pomaknite telefon ulijevo."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Pomaknite telefon udesno."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Pokušajte s jačim osvjetljenjem"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Udaljite telefon"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Približite telefon"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Pomaknite telefon prema gore"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Pomaknite telefon prema dolje"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Pomaknite telefon ulijevo"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Pomaknite telefon udesno"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Gledajte izravnije prema uređaju."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Postavite lice izravno ispred telefona."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Vaše se lice ne vidi. Držite telefon u razini očiju."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Previše kretanja. Držite telefon mirno."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Ponovo registrirajte svoje lice."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Lice nije prepoznato. Pokušajte ponovo."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Previše slično, promijenite pozu."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Nagnite glavu malo manje."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Malo manje nagnite glavu."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Nagnite glavu malo manje."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Prepoznavanje lica nije uspjelo. Pokušajte ponovo."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Malo pomaknite glavu"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Gledajte izravnije prema telefonu"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Gledajte ravno u telefon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Gledajte izravnije prema telefonu"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Uklonite sve što vam zakriva lice."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Očistite vrh zaslona, uključujući crnu traku"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Vaše lice mora biti potpuno vidljivo"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Vaše lice mora biti potpuno vidljivo"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Izrada modela lica nije uspjela. Pokušajte ponovo."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Otkrivene su tamne naočale. Vaše lice mora biti potpuno vidljivo."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Otkriveno je prekrivanje lica. Vaše lice mora biti potpuno vidljivo."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Lice nije potvrđeno. Hardver nije dostupan."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 8a0b1ff55db4..3cc4b63d70d4 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Feloldás ujjlenyomattal"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Nem lehet használni az ujjlenyomat-érzékelőt"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Keresse fel a szervizt."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Sikertelen az arc pontos rögzítése. Próbálja újra."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nem lehet létrehozni az arcmodellt. Próbálja újra."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Túl világos. Próbálja kevésbé erős világítással."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Túl sötét. Próbálja jobb megvilágítás mellett."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Tartsa távolabb a telefont."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Tartsa közelebb a telefont."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Emelje magasabbra a telefont."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Tartsa alacsonyabban a telefont."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Mozgassa a telefont balra."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Mozgassa a telefont jobbra."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Próbálja jobb megvilágítás mellett"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Tartsa távolabb a telefont"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Tartsa közelebb a telefont"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Emelje magasabbra a telefont"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Tartsa alacsonyabban a telefont"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Mozgassa balra a telefont"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Mozgassa jobbra a telefont"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Szemből nézzen az eszközre."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"A telefont közvetlenül az arca elé tegye."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Nem látszik az arca. Tartsa szemmagasságban a telefonját."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Túl sok a mozgás. Tartsa stabilan a telefont."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Rögzítsen újra képet az arcáról."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Már nem lehet felismerni az arcát. Próbálja újra."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Túlságosan hasonló, változtasson a pózon."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Kicsit kevésbé fordítsa el a fejét."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Tartsa kicsit egyenesebben a fejét."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Kicsit kevésbé fordítsa el a fejét."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Az arc nem felismerhető. Próbálja újra."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Egy kicsit mozdítsa el a fejét"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Nézzen egyenesen a telefonjára"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Nézzen egyenesen a telefonjára"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Nézzen egyenesen a telefonjára"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Távolítson el mindent, ami takarja az arcát."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Tisztítsa meg a képernyő tetejét, a fekete sávot is beleértve."</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Arcának teljesen láthatónak kell lennie"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Arcának teljesen láthatónak kell lennie"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Nem lehet létrehozni az arcmodellt. Próbálja újra."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Sötét szemüveget észlelt a rendszer. Arcának teljesen láthatónak kell lennie."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Valami eltakarja az arcát. Arcának teljesen láthatónak kell lennie."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Sikertelen arcellenőrzés. A hardver nem érhető el."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 835cdcde94bb..e43d7e4bf481 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Մատնահետքով ապակողպում"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Մատնահետքերի սկաները հնարավոր չէ օգտագործել"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Այցելեք սպասարկման կենտրոն։"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Չհաջողվեց գրանցել դեմքի ճշգրիտ տվյալները։ Կրկնեք։"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Չհաջողվեց ստեղծել ձեր դեմքի մոդելը։ Նորից փորձեք։"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Շատ լուսավոր է։ Փորձեք ավելի թեթև լուսավորություն։"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Շատ մութ է։ Փորձեք ավելի պայծառ լուսավորություն։"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Փոքր-ինչ հեռու պահեք հեռախոսը։"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Մոտեցրեք հեռախոսը։"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Բարձրացրեք հեռախոսը։"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Իջեցրեք հեռախոսը։"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Տեղափոխեք հեռախոսը ձախ:"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Տեղափոխեք հեռախոսը աջ:"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Ավելի պայծառ դարձրեք լուսավորությունը"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Փոքր-ինչ հեռու պահեք հեռախոսը"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Մոտեցրեք հեռախոսը"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Բարձրացրեք հեռախոսը"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Իջեցրեք հեռախոսը"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Տեղափոխեք հեռախոսը ձախ"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Տեղափոխեք հեռախոսը աջ"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Նայեք ուղիղ էկրանին։"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Պահեք ձեր դեմքն անմիջապես հեռախոսի էկրանի դիմաց:"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Ձեր դեմքը չի երևում։ Հեռախոսը պահեք աչքերի մակարդակում։"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Շատ եք շարժում։ Հեռախոսն անշարժ պահեք։"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Նորից փորձեք։"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Չհաջողվեց ճանաչել դեմքը։ Նորից փորձեք:"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Շատ նման է նախորդին։ Փոխեք ձեր դիրքը։"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Գլուխն ուղիղ պահեք։"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Գլուխը մի փոքր իջեցրեք։"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Գլուխն ուղիղ պահեք։"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Դեմքը չի հաջողվում ճանաչել։ Նորից փորձեք։"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Թեթևակի փոխեք գլխի դիրքը"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Նայեք ուղիղ էկրանին"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Նայեք ուղիղ էկրանին"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Նայեք ուղիղ էկրանին"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Հեռացրեք այն ամենը, ինչը թաքցնում է ձեր երեսը:"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Մաքրեք էկրանի վերևի մասը, ներառյալ սև գոտին"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Ձեր դեմքը պետք է ամբողջովին տեսանելի լինի"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Ձեր դեմքը պետք է ամբողջովին տեսանելի լինի"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Չհաջողվեց ստեղծել ձեր դեմքի մոդելը։ Նորից փորձեք։"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Հանեք ակնոցը։ Ձեր դեմքը պետք է ամբողջովին տեսանելի լինի։"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Դեմքի մի մասը ծածկված է։ Ձեր դեմքը պետք է ամբողջովին տեսանելի լինի։"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Չհաջողվեց հաստատել դեմքը։ Սարքն անհասանելի է:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 8ce9ca244111..6cb05009b27a 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Tidak dapat menggunakan sensor sidik jari"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Kunjungi penyedia reparasi."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Tidak bisa mengambil data wajah akurat. Coba lagi."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Tidak dapat membuat model wajah Anda. Coba lagi."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Coba cahaya yang lebih lembut."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Terlalu gelap. Coba pencahayaan yang lebih cerah."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Gerakkan ponsel menjauh."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Gerakkan ponsel mendekat."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Geser ponsel ke atas."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Geser ponsel ke bawah."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Gerakkan ponsel ke kiri."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Gerakkan ponsel ke kanan."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Coba pencahayaan yang lebih cerah"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Jauhkan ponsel"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Dekatkan ponsel"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Gerakkan ponsel ke atas"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Gerakkan ponsel ke bawah"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Gerakkan ponsel ke kiri Anda"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Gerakkan ponsel ke kanan Anda"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Lihat langsung ke perangkat."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Posisikan wajah Anda tepat di depan ponsel."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Tidak dapat melihat wajah Anda. Pegang ponsel sejajar dengan mata."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Terlalu banyak gerakan. Stabilkan ponsel."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Daftarkan ulang wajah Anda."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Tidak lagi dapat mengenali wajah. Coba lagi."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Terlalu mirip, ubah pose Anda."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Putar sedikit kepala Anda."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Miringkan sedikit kepala Anda."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Putar sedikit kepala Anda."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Tidak dapat mengenali wajah. Coba lagi."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Ubah sedikit posisi kepala"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Lihat lebih lurus ke arah ponsel"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Lihat lebih lurus ke arah ponsel"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Lihat lebih lurus ke arah ponsel"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Singkirkan apa saja yang menutupi wajah Anda."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Bersihkan bagian atas layar, termasuk kotak hitam"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Wajah Anda harus terlihat sepenuhnya"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Wajah Anda harus terlihat sepenuhnya"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Tidak dapat membuat model wajah Anda. Coba lagi."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Kacamata hitam terdeteksi. Wajah Anda harus terlihat sepenuhnya."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Penutup wajah terdeteksi. Wajah Anda harus terlihat sepenuhnya."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Tidak dapat memverifikasi wajah. Hardware tidak tersedia."</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 4346b6323de0..186074608074 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingrafarskenni"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Ekki er hægt að nota fingrafaralesara"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Þú verður að fara á verkstæði."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Nákvæm andlitsgögn fengust ekki. Reyndu aftur."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Ekki tekst að búa til andlitslíkan. Reyndu aftur."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Of bjart. Prófaðu mýkri lýsingu."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Of dimmt. Prófaðu sterkari lýsingu."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Færðu símann lengra í burtu."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Færðu símann nær."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Færðu símann hærra."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Færðu símann neðar."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Færðu símann til vinstri."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Færðu símann til hægri."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prófaðu sterkari lýsingu"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Færðu símann lengra frá"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Færðu símann nær"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Færðu símann hærra"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Færðu símann neðar"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Færðu símann til vinstri"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Færðu símann til hægri"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Horfðu beint á tækið."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Hafðu andlitið beint fyrir framan símann."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Sé ekki andlitið á þér. Haltu símanum í augnhæð."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Of mikil hreyfing. Haltu símanum stöðugum."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Skráðu nafnið þitt aftur."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Andlit þekkist ekki lengur. Reyndu aftur."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Of svipað. Stilltu þér öðruvísi upp."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Snúðu höfðinu aðeins minna."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Hallaðu höfðinu aðeins minna."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Snúðu höfðinu aðeins minna."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Andlit þekkist ekki. Reyndu aftur."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Færðu höfuðið aðeins til"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Horfðu beint á símann"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Horfðu beint á símann"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Horfðu beint á símann"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Fjarlægðu það sem kann að hylja andlitið."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Hreinsaðu efsta hluta skjásins þíns, þ.m.t. svörtu stikuna"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Allt andlitið á þér þarf að sjást"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Allt andlitið á þér þarf að sjást"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Ekki tekst að búa til andlitslíkan. Reyndu aftur."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Dökk gleraugu greindust. Allt andlitið á þér þarf að sjást."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Eitthvað er fyrir andlitinu. Allt andlitið á þér þarf að sjást."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Andlit ekki staðfest. Vélbúnaður er ekki tiltækur."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 296e432e9a99..da865d7b5498 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Sblocco con l\'impronta"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Impossibile utilizzare il sensore di impronte digitali"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Contatta un fornitore di servizi di riparazione."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Impossibile acquisire dati viso accurati. Riprova."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Impossibile creare il modello del volto. Riprova."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Troppa luce. Prova con una luce più soft."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Troppo buio. Prova con più luce."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Sposta il telefono più lontano."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Avvicina il telefono."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Sposta il telefono più in alto."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Sposta il telefono più in basso."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Sposta il telefono verso sinistra."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Sposta il telefono verso destra."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prova con più luce"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Allontana il telefono"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Avvicina il telefono"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Sposta il telefono più in alto"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Sposta il telefono più in basso"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Sposta il telefono verso sinistra"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Sposta il telefono verso destra"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Guarda più direttamente verso il dispositivo."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Posiziona il viso davanti al telefono."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Impossibile vedere il volto. Tieni il telefono all\'altezza degli occhi."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Troppo movimento. Tieni fermo il telefono."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Ripeti l\'acquisizione del volto."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Non è più possibile riconoscere il volto. Riprova."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Troppo simile; cambia posa."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Gira un po\' meno la testa."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Inclina un po\' meno la testa."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Gira un po\' meno la testa."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Impossibile riconoscere il volto. Riprova."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Cambia leggermente la posizione della testa"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Guarda dritto nel telefono"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Guarda dritto nel telefono"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Guarda dritto nel telefono"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Rimuovi tutto ciò che ti nasconde il viso."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Pulisci la parte superiore dello schermo, inclusa la barra nera"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Il tuo volto deve essere visibile per intero"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Il tuo volto deve essere visibile per intero"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Impossibile creare il modello del volto. Riprova."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Sono stati rilevati occhiali scuri. Il tuo volto deve essere visibile per intero."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"È stata rilevata una mascherina. Il tuo volto deve essere visibile per intero."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imposs. verificare volto. Hardware non disponibile."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 757fb9e1a424..8fc613082c38 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -636,26 +636,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ביטול הנעילה בטביעת אצבע"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"לא ניתן להשתמש בחיישן טביעות האצבע"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"צריך ליצור קשר עם ספק תיקונים."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"לא ניתן ליצור את התבנית לזיהוי הפנים. יש לנסות שוב."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"בהירה מדי. צריך תאורה עדינה יותר."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"התמונה חשוכה מדי. צריך תאורה חזקה יותר."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"יש להרחיק את הטלפון."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"צריך לקרב את הטלפון."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"צריך להרים את הטלפון גבוה יותר."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"צריך להוריד את הטלפון."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"צריך להזיז את הטלפון שמאלה."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"צריך להזיז את הטלפון ימינה."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"כדאי לנסות בתאורה חזקה יותר"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"צריך להרחיק את הטלפון"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"צריך לקרב את הטלפון"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"צריך להגביה את הטלפון"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"צריך להוריד את הטלפון"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"צריך להזיז את הטלפון שמאלה"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"צריך להזיז את הטלפון ימינה"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"יש להביט ישירות אל המכשיר."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"עליך למקם את הפנים ישירות מול הטלפון."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"אי אפשר לראות את הפנים שלך. צריך להחזיק את הטלפון בגובה העיניים."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"יותר מדי תנועה. יש להחזיק את הטלפון בצורה יציבה."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"יש לסרוק שוב את הפנים."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"כבר לא ניתן לזהות פנים. יש לנסות שוב."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"דומה מדי, יש לשנות תנוחה."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"עליך ליישר קצת את הראש."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"יש ליישר קצת את הראש."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"צריך ליישר קצת את הראש."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"לא ניתן לזהות את הפנים. יש לנסות שוב."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"צריך לשנות מעט את תנוחת הראש"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"צריך להביט ישירות בטלפון"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"צריך להביט ישירות בטלפון"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"צריך להביט ישירות בטלפון"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"יש להסיר כל דבר שמסתיר את הפנים."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"צריך לנקות את החלק העליון של המסך, כולל הסרגל השחור"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"הפנים שלך חייבות להיות גלויות לגמרי"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"הפנים שלך חייבות להיות גלויות לגמרי"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"לא ניתן ליצור את התבנית לזיהוי הפנים. יש לנסות שוב."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"זוהו משקפיים כהים. הפנים שלך חייבות להיות גלויות לגמרי."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"זוהה כיסוי על הפנים. הפנים שלך חייבות להיות גלויות לגמרי."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"לא ניתן לאמת את הפנים. החומרה לא זמינה."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 72d59a5c8685..5715acdda4ac 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋認証"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"指紋認証センサーを使用できません"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"修理業者に調整を依頼してください。"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"顔を認識できませんでした。もう一度お試しください。"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"顔モデルを作成できません。もう一度お試しください。"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"明るすぎます。もっと暗い場所でお試しください。"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"暗すぎます。もっと明るい場所でお試しください。"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"スマートフォンをもっと離してください。"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"スマートフォンをもっと近づけてください。"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"スマートフォンを上に動かしてください。"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"スマートフォンを下に動かしてください。"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"スマートフォンを左に動かしてください。"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"スマートフォンを右に動かしてください。"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"もっと明るい場所でお試しください"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"スマートフォンをもっと離してください"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"スマートフォンをもっと近づけてください"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"スマートフォンをもっと上げてください"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"スマートフォンをもっと下げてください"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"スマートフォンを左に動かしてください"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"スマートフォンを右に動かしてください"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"もっとまっすぐデバイスに顔を向けてください。"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"顔をスマートフォンの真正面に向けてください。"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"顔を確認できません。スマートフォンを目の高さに合わせて持ってください。"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"あまり動かさないでください。安定させてください。"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"顔を登録し直してください。"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"顔を認識できなくなりました。もう一度お試しください。"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"似すぎています。ポーズを変えてください。"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"顔の向きを少し戻してください。"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"顔を少し傾けてください。"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"顔の向きを少し戻してください。"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"顔を認識できません。もう一度お試しください。"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"顔の位置を少し変えてください"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"もっとまっすぐスマートフォンに顔を向けてください"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"もっとまっすぐスマートフォンに顔を向けてください"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"もっとまっすぐスマートフォンに顔を向けてください"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"顔を隠しているものをすべて外してください"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"黒いバーを含め、画面の上部をきれいにしてください"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"顔が完全に写るようにしてください"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"顔が完全に写るようにしてください"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"顔モデルを作成できません。もう一度お試しください。"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"サングラスが検出されました。顔が完全に写るようにしてください。"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"マスクが検出されました。顔が完全に写るようにしてください。"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"顔を確認できません。ハードウェアを利用できません。"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index d23623d7bde5..9aeb034bc305 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"თითის ანაბეჭდით განბლოკვა"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"თითის ანაბეჭდის სენსორის გამოყენება ვერ ხერხდება"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ეწვიეთ შეკეთების სერვისის პროვაიდერს."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"სახის ზუსტი მონაცემები არ აღიბეჭდა. ცადეთ ხელახლა."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"თქვენი სახის მოდელი ვერ იქმნება. ცადეთ ხელახლა."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"მეტისმეტად ნათელია. ცადეთ უფრო სუსტი განათება."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"მეტისმეტად ბნელია. ცადეთ უფრო ძლიერი განათება."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"გადაანაცვლეთ ტელეფონი უფრო შორს."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"მიიტანეთ ტელეფონი უფრო ახლოს."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"გადაანაცვლეთ ტელეფონი ზემოთ."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"გადაანაცვლეთ ტელეფონი ქვემოთ."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"გადაანაცვლეთ ტელეფონი მარცხნივ."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"გადაანაცვლეთ ტელეფონი მარჯვნივ."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"ცადეთ უფრო ძლიერი განათება"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"გაწიეთ ტელეფონი უფრო შორს"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"მიიტანეთ ტელეფონი უფრო ახლოს"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"აწიეთ ტელეფონი ზემოთ"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ჩაწიეთ ტელეფონი ქვემოთ"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"გაწიეთ ტელეფონი თქვენგან მარცხნივ"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"გაწიეთ ტელეფონი თქვენგან მარჯვნივ"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"გთხოვთ, უფრო პირდაპირ შეხედოთ თქვენს მოწყობილობას."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"დაიჭირეთ სახე უშუალოდ ტელეფონის წინ."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"თქვენი სახე არ ჩანს. დაიჭირეთ ტელეფონი თვალის დონეზე."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"მეტისმეტად მოძრაობთ. მყარად დაიჭირეთ ტელეფონი."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"სახის ამოცნობა ვეღარ ხერხდება. ცადეთ ხელახლა."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"მეტისმეტად მსგავსია. გთხოვთ, შეცვალოთ პოზა."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"თავი ცოტა ნაკლებად მიაბრუნეთ."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"თავი ცოტა ნაკლებად გადახარეთ."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"თავი ცოტა ნაკლებად მიაბრუნეთ."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"სახის ამოცნობა ვერ ხერხდება. ცადეთ ხელახლა."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"ოდნავ შეცვალეთ თავის პოზიცია"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"პირდაპირ უყურეთ ტელეფონს"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"პირდაპირ უყურეთ ტელეფონს"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"პირდაპირ უყურეთ ტელეფონს"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"მოაშორეთ ყველაფერი, რაც სახეს გიფარავთ."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"გაწმინდეთ ეკრანის ზედა ნაწილი, შავი ზოლის ჩათვლით."</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"თქვენი სახე მთლიანად უნდა ჩანდეს"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"თქვენი სახე მთლიანად უნდა ჩანდეს"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"თქვენი სახის მოდელი ვერ იქმნება. ცადეთ ხელახლა."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"აღმოჩენილია მუქი სათვალე. თქვენი სახე მთლიანად უნდა ჩანდეს."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"აღმოჩენილია სახის დაფარვა. თქვენი სახე მთლიანად უნდა ჩანდეს."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"სახე ვერ დასტურდება. აპარატი მიუწვდომელია."</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 6067b809b213..5fe7ea4a4f1d 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Құлыпты саусақ ізімен ашу"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Саусақ ізін оқу сканерін пайдалану мүмкін емес"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Жөндеу қызметіне барыңыз."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Бет деректері дұрыс алынбады. Әрекетті қайталаңыз."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Бет үлгісі жасалмады. Қайталап көріңіз."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Тым ашық. Күңгірттеу жарық керек."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Тым қараңғы. Молырақ жарық керек."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Телефонды алшақ ұстаңыз."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Телефонды жақынырақ ұстаңыз."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Телефонды жоғарырақ ұстаңыз."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Телефонды төменірек ұстаңыз."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Телефонды солға жылжытыңыз."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Телефонды оңға жылжытыңыз."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Жарық деңгейін арттырыңыз."</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Телефонды алшақ ұстаңыз."</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Телефонды жақынырақ ұстаңыз."</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Телефонды жоғарырақ ұстаңыз."</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Телефонды төменірек ұстаңыз."</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Телефонды солға қарай ұстаңыз."</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Телефонды оңға қарай ұстаңыз."</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Құрылғының камерасына тура қараңыз."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Бетіңізді телефонға тура қаратыңыз."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Бетіңіз көрінбей тұр. Телефонды көз деңгейінде ұстаңыз."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Қозғалыс тым көп. Телефонды қозғалтпаңыз."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Қайта тіркеліңіз."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Енді бет анықтау мүмкін емес. Әрекетті қайталаңыз."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Алдыңғысына тым ұқсас, басқаша қалыпта түсіңіз."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Басыңызды түзурек ұстаңыз."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Басыңызды түзуірек ұстаңыз."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Басыңызды кішкене бұрыңыз."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Бет танылмады. Қайталап көріңіз."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Басыңыздың қалпын сәл өзгертіңіз."</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Телефонға барынша тура қараңыз."</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Телефонға барынша тура қараңыз."</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Телефонға барынша тура қараңыз."</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Бетіңізді жауып тұрған нәрсені алып тастаңыз."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Экранның жоғарғы жағын, сонымен қатар қара жолақты өшіріңіз."</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Бетіңіз толық көрініп тұруы керек."</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Бетіңіз толық көрініп тұруы керек."</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Бет үлгісі жасалмады. Қайталап көріңіз."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Қою түсті көзілдірік анықталды. Бетіңіз толық көрініп тұруы керек."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Бетперде анықталды. Бетіңіз толық көрініп тұруы керек."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Бетті тану мүмкін емес. Жабдық қолжетімді емес."</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 7f505c89f2db..ca3a1dd39b4d 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ការដោះសោដោយប្រើស្នាមម្រាមដៃ"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"មិនអាចប្រើឧបករណ៍ចាប់ស្នាមម្រាមដៃបានទេ"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ទាក់ទងក្រុមហ៊ុនផ្ដល់ការជួសជុល។"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"មិនអាចថតទិន្នន័យទម្រង់មុខបានត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"មិនអាចបង្កើតគំរូមុខរបស់អ្នកបានទេ។ សូមព្យាយាមម្ដងទៀត។"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"ភ្លឺពេក។ សូមសាកល្បងប្រើពន្លឺស្រាលជាងនេះ។"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"ងងឹតជ្រុល។ សូមសាកល្បងប្រើពន្លឺភ្លឺជាងនេះ។"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"រំកិលទូរសព្ទឱ្យឆ្ងាយជាងមុន។"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ផ្លាស់ទីទូរសព្ទឱ្យជិតជាងមុន។"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ផ្លាស់ទីទូរសព្ទឱ្យខ្ពស់ជាងមុន។"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ផ្លាស់ទីទូរសព្ទឱ្យទាបជាងមុន។"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ផ្លាស់ទីទូរសព្ទទៅខាងឆ្វេង។"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ផ្លាស់ទីទូរសព្ទទៅខាងស្ដាំ។"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"សាកល្បងប្រើពន្លឺភ្លឺជាងនេះ"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ដាក់ទូរសព្ទឱ្យឆ្ងាយជាងមុន"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ដាក់ទូរសព្ទឱ្យជិតជាងមុន"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ដាក់ទូរសព្ទឱ្យខ្ពស់ជាងមុន"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ដាក់ទូរសព្ទឱ្យទាបជាងមុន"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ដាក់ទូរសព្ទទៅខាងឆ្វេងអ្នក"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ដាក់ទូរសព្ទទៅខាងស្ដាំអ្នក"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"សូមមើលឱ្យចំឧបករណ៍របស់អ្នកជាងមុន។"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"បែរមុខរបស់អ្នកឱ្យចំពីមុខទូរសព្ទផ្ទាល់។"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"មើលមិនឃើញមុខរបស់អ្នកទេ។ កាន់ទូរសព្ទរបស់អ្នកដាក់ត្រឹមភ្នែក។"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"មានចលនាខ្លាំងពេក។ សូមកាន់ទូរសព្ទឱ្យនឹង។"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"សូមស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត។"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"មិនអាចសម្គាល់មុខបានទៀតទេ។ សូមព្យាយាមម្ដងទៀត។"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ស្រដៀងគ្នាពេក សូមផ្លាស់ប្ដូរកាយវិការរបស់អ្នក។"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"ងាកក្បាលរបស់អ្នកតិចជាងមុនបន្តិច។"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"ផ្អៀងក្បាលរបស់អ្នកតិចជាងនេះបន្តិច។"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"ងាកក្បាលរបស់អ្នកបន្តិចទៀត។"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"មិនអាចសម្គាល់មុខបានទេ។ សូមព្យាយាមម្ដងទៀត។"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"ប្ដូរទីតាំងក្បាលរបស់អ្នកតិចៗ"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"មើលទូរសព្ទរបស់អ្នកឱ្យចំជាងនេះ"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"មើលទូរសព្ទរបស់អ្នកឱ្យចំជាងនេះ"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"មើលទូរសព្ទរបស់អ្នកឱ្យចំជាងនេះ"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"យកអ្វីដែលបាំងមុខរបស់អ្នកចេញ។"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"សម្អាតផ្នែកខាងលើនៃអេក្រង់របស់អ្នក រួមទាំងរបារខ្មៅ"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"មុខរបស់អ្នកត្រូវតែអាចមើលឃើញពេញលេញ"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"មុខរបស់អ្នកត្រូវតែអាចមើលឃើញពេញលេញ"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"មិនអាចបង្កើតគំរូមុខរបស់អ្នកបានទេ។ សូមព្យាយាមម្ដងទៀត។"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"បានរកឃើញវ៉ែនតាខ្មៅ។ មុខរបស់អ្នកត្រូវតែអាចមើលឃើញពេញលេញ។"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"បានរកឃើញគ្រឿងពាក់លើមុខ។ មុខរបស់អ្នកត្រូវតែអាចមើលឃើញពេញលេញ។"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"មិនអាចផ្ទៀងផ្ទាត់មុខបានទេ។ មិនមានហាតវែរទេ។"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index e3f69042e745..46fe03ee6419 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ಲಾಕ್"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ರಿಪೇರಿ ಮಾಡುವವರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"ಸರಿಯಾಗಿ ಮುಖ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಲಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"ಫೇಸ್ ಮಾಡೆಲ್ ರಚಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"ತುಂಬಾ ಪ್ರಕಾಶಮಾನವಾಗಿದೆ ಮಂದ ಪ್ರಕಾಶಮಾನವಿರುವ ಲೈಟ್ ಬಳಸಿ"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"ತುಂಬಾ ಕಪ್ಪು ಛಾಯೆಯಿದೆ. ಪ್ರಕಾಶಮಾನವಾದ ಲೈಟಿಂಗ್ ಬಳಸಿ."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ಫೋನ್ ಅನ್ನು ದೂರಕ್ಕೆ ಸರಿಸಿ."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ಫೋನ್ ಅನ್ನು ಸಮೀಪಕ್ಕೆ ತನ್ನಿ."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ಫೋನ್ ಅನ್ನು ಮೇಲಕ್ಕೆ ಎತ್ತಿ ಹಿಡಿಯಿರಿ."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ಫೋನ್ ಅನ್ನು ಕೆಳಗೆ ಸರಿಸಿ."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ಫೋನ್ ಅನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ಫೋನ್ ಅನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"ಪ್ರಕಾಶಮಾನವಾದ ಲೈಟಿಂಗ್ ಬಳಸಿ"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ಫೋನ್ ಅನ್ನು ದೂರಕ್ಕೆ ಸರಿಸಿ"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ಫೋನ್ ಅನ್ನು ಸಮೀಪಕ್ಕೆ ತನ್ನಿ"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ಫೋನ್ ಅನ್ನು ಮೇಲಕ್ಕೆ ಎತ್ತಿ ಹಿಡಿಯಿರಿ."</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ಫೋನ್ ಅನ್ನು ಕೆಳಗೆ ಸರಿಸಿ"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ಫೋನ್ ಅನ್ನು ನಿಮ್ಮ ಎಡಕ್ಕೆ ಸರಿಸಿ"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ಫೋನ್ ಅನ್ನು ನಿಮ್ಮ ಬಲಕ್ಕೆ ಸರಿಸಿ"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಹೆಚ್ಚಿನದ್ದನ್ನು ನೇರವಾಗಿ ನೋಡಿ."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"ನಿಮ್ಮ ಮುಖವನ್ನು ಫೋನ್ಗೆ ನೇರವಾಗಿ ಇರಿಸಿ."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"ನಿಮ್ಮ ಮುಖ ಕಾಣಿಸುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಕಣ್ಣಿನ ನೇರಕ್ಕೆ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"ತುಂಬಾ ಅಲುಗಾಡುತ್ತಿದೆ ಫೋನ್ ಅನ್ನು ಸ್ಥಿರವಾಗಿ ಹಿಡಿಯಿರಿ."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"ಮುಖ ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ತುಂಬಾ ಸಮಾನ, ನಿಮ್ಮ ಪೋಸ್ ಬದಲಾಯಿಸಿ."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"ನಿಮ್ಮ ತಲೆಯನ್ನು ಹೆಚ್ಚು ತಿರುಗಿಸಬೇಡಿ."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"ನಿಮ್ಮ ತಲೆಯನ್ನು ಸ್ವಲ್ಪ ಓರೆಯಾಗಿಸಿ."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"ನಿಮ್ಮ ತಲೆಯನ್ನು ಸ್ವಲ್ಪ ಕಡಿಮೆ ತಿರುಗಿಸಿ."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"ಮುಖ ಗುರುತಿಸಲಾಗುತ್ತಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"ನಿಮ್ಮ ತಲೆಯ ಸ್ಥಾನವನ್ನು ಸ್ವಲ್ಪ ಬದಲಾಯಿಸಿ"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೇರವಾಗಿ ನೋಡಿ"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೇರವಾಗಿ ನೋಡಿ"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೇರವಾಗಿ ನೋಡಿ"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರೆಮಾಡುವ ಯಾವುದನ್ನಾದರೂ ತೆಗೆದುಹಾಕಿ."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"ಬ್ಲ್ಯಾಕ್ ಬಾರ್ ಸೇರಿದಂತೆ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ನ ಮೇಲ್ಭಾಗವನ್ನು ತೆರವುಗೊಳಿಸಿ"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"ನಿಮ್ಮ ಮುಖವು ಸಂಪೂರ್ಣವಾಗಿ ಗೋಚರಿಸಬೇಕು"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"ನಿಮ್ಮ ಮುಖವು ಸಂಪೂರ್ಣವಾಗಿ ಗೋಚರಿಸಬೇಕು"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"ಫೇಸ್ ಮಾಡೆಲ್ ರಚಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ಕಪ್ಪು ಕನ್ನಡಕ ಪತ್ತೆಯಾಗಿದೆ. ನಿಮ್ಮ ಮುಖವು ಸಂಪೂರ್ಣವಾಗಿ ಗೋಚರಿಸಬೇಕು."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ಮುಖವಾಡ ಪತ್ತೆಯಾಗಿದೆ. ನಿಮ್ಮ ಮುಖವು ಸಂಪೂರ್ಣವಾಗಿ ಗೋಚರಿಸಬೇಕು."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"ಮುಖ ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 8a3ef03361a8..b7012f7f27e7 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"지문 잠금 해제"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"지문 센서를 사용할 수 없음"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"수리업체에 방문하세요."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"정확한 얼굴 데이터를 캡처하지 못했습니다. 다시 시도하세요."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"얼굴 모델을 만들 수 없습니다. 다시 시도해 주세요."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"너무 밝습니다. 조명 밝기를 조금 낮춰보세요."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"너무 어둡습니다. 조명을 밝게 해 보세요."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"휴대전화를 더 멀리 위치시키세요."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"휴대전화를 더 가깝게 위치시키세요."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"휴대전화를 위쪽으로 이동하세요."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"휴대전화를 아래로 이동하세요"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"휴대전화를 왼쪽으로 이동하세요."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"휴대전화를 오른쪽으로 이동하세요."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"조명을 밝게 해 보세요."</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"휴대전화를 얼굴에서 더 멀리 떨어뜨려 주세요."</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"휴대전화를 얼굴에 더 가까이 가져와 주세요."</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"휴대전화를 위로 이동하세요"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"휴대전화를 아래로 이동하세요"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"휴대전화를 왼쪽으로 이동하세요"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"휴대전화를 오른쪽으로 이동하세요"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"기기에서 더 똑바로 바라보세요."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"휴대전화가 얼굴 정면을 향하도록 두세요."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"얼굴이 보이지 않습니다. 눈높이에 맞춰 휴대전화를 들어 주세요."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"너무 많이 움직였습니다. 휴대전화를 흔들리지 않게 잡으세요."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"얼굴을 다시 등록해 주세요."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"더 이상 얼굴을 인식할 수 없습니다. 다시 시도하세요."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"너무 비슷합니다. 다른 포즈를 취해 보세요."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"고개를 조금 덜 돌려 보세요."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"고개를 조금 덜 기울여 보세요."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"고개를 조금 덜 돌려 보세요."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"얼굴을 인식할 수 없습니다. 다시 시도해 주세요."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"얼굴의 위치를 조금 변경해 주세요."</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"휴대전화를 좀 더\\n똑바로 바라봐 주세요."</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"휴대전화를 좀 더\\n똑바로 바라봐 주세요."</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"휴대전화를 좀 더\\n똑바로 바라봐 주세요."</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"얼굴이 가려지지 않도록 해 주세요."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"검은색 바를 포함한 화면 상단을 청소하세요."</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"전체 얼굴이 보여야\\n합니다."</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"전체 얼굴이 보여야\\n합니다."</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"얼굴 모델을 만들 수 없습니다. 다시 시도해 주세요."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"선글라스가 감지되었습니다. 전체 얼굴이 보여야 합니다."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"마스크가 감지되었습니다. 전체 얼굴이 보여야 합니다."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"얼굴을 확인할 수 없습니다. 하드웨어를 사용할 수 없습니다."</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index ccb03848061e..afa3e3c36394 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Кулпуланган түзмөктү манжа изи менен ачуу"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Манжа изинин сенсорун колдонууга болбойт"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Тейлөө кызматына кайрылыңыз."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Жүзүңүз жакшы тартылган жок. Кайталап көрүңүз."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Жүзүңүздүн үлгүсү түзүлгөн жок. Кайталаңыз."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Өтө жарык. Жарыктыкты азайтып көрүңүз."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Өтө караңгы. Жарыгыраак жерге туруңуз."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Телефонду алыстатыңыз."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Телефонду жакындатыңыз."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Телефонду өйдө жылдырыңыз."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Телефонду ылдый жылдырыңыз."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Телефонду солго жылдырыңыз."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Телефонду оңго жылдырыңыз."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Жарыгыраак жерге туруңуз"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Телефонду алыстатыңыз"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Телефонду жакындатыңыз"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Телефонду жогору жылдырыңыз"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Телефонду ылдый жылдырыңыз"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Телефонду солго жылдырыңыз"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Телефонду оңго жылдырыңыз"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Түзмөгүңүзгө түз караңыз."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Телефонду жүзүңүздүн маңдайында кармаңыз."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Жүзүңүз көрүнбөй жатат. Телефонду көздөрүңүздүн деңгээлинде кармаңыз."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Кыймылдап жибердиңиз. Телефонду түз кармаңыз."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Жүзүңүздү кайра таанытыңыз."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Жүз таанылган жок. Кайталап көрүңүз."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Мурункуга окшош болуп калды, башкача туруңуз."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Башыңызды бир аз гана эңкейтиңиз."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Башыңызды бир аз гана эңкейтиңиз."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Башыңызды бир аз гана эңкейтиңиз."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Жүз таанылбай жатат. Кайталаңыз."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Башыңызды бир аз буруңуз"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Телефонуңузду караңыз"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Телефонуңузду караңыз"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Телефонуңузду караңыз"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Жүзүңүз жакшы көрүнбөй жатат."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Экраныңыздын жогору жагын, анын ичинде тилкени да тазалаңыз"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Жүзүңүз толук көрүнүшү керек"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Жүзүңүз толук көрүнүшү керек"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Жүзүңүздүн үлгүсү түзүлгөн жок. Кайталаңыз."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Кара көз айнек кийгенге болбойт. Жүзүңүз толук көрүнүшү керек."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Жүзүңүз жабылып калды. Ал толук көрүнүшү керек."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Жүз ырасталбай жатат. Аппараттык камсыздоо жеткиликсиз."</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index aa99ef19eb04..e4b34b19d1c2 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ປົດລັອກດ້ວຍລາຍນິ້ວມື"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"ບໍ່ສາມາດໃຊ້ເຊັນເຊີລາຍນິ້ວມືໄດ້"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ກະລຸນາໄປຫາຜູ້ໃຫ້ບໍລິການສ້ອມແປງ."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າທີ່ຖືກຕ້ອງໄດ້. ກະລຸນາລອງໃໝ່."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"ບໍ່ສາມາດສ້າງຮູບແບບໃບໜ້າຂອງທ່ານໄດ້. ກະລຸນາລອງໃໝ່."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"ແຈ້ງເກີນໄປ. ລອງຄ່ອຍແສງໄຟລົງ."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"ມືດເກີນ. ກະລຸນາລອງໃຊ້ສະພາບແສງທີ່ແຈ້ງຂຶ້ນ."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ຍ້າຍໂທລະສັບອອກໄປໄກຂຶ້ນ."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ຍ້າຍໂທລະສັບເຂົ້າໄປໃກ້ຂຶ້ນ."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ຍົກໂທລະສັບໃຫ້ສູງຂຶ້ນ."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ເລື່ອນໂທລະສັບຕ່ຳລົງ."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ຍ້າຍໂທລະສັບໄປທາງຊ້າຍ."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ຍ້າຍໂທລະສັບໄປທາງຂວາ."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"ກະລຸນາລອງໃຊ້ສະພາບແສງທີ່ແຈ້ງຂຶ້ນ"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ເລື່ອນໂທລະສັບອອກໄປໄກຂຶ້ນ"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ເລື່ອນໂທລະສັບເຂົ້າໄປໃກ້ຂຶ້ນ"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ຍົກໂທລະສັບໃຫ້ສູງຂຶ້ນ"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ເລື່ອນໂທລະສັບຕ່ຳລົງ"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ເລື່ອນໂທລະສັບໄປທາງຊ້າຍຂອງທ່ານ"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ເລື່ອນໂທລະສັບໄປທາງຂວາຂອງທ່ານ"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"ກະລຸນາເບິ່ງອຸປະກອນຂອງທ່ານໃຫ້ຊື່ໆ."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"ຫັນໜ້າຂອງທ່ານໄປໃສ່ໜ້າໂທລະສັບໂດຍກົງ."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"ບໍ່ເຫັນໃບໜ້າຂອງທ່ານ. ຖືໂທລະສັບຂອງທ່ານໄວ້ໃນລະດັບສາຍຕາ."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"ເຄື່ອນໄຫວຫຼາຍເກີນໄປ. ກະລຸນາຖືໂທລະສັບໄວ້ຊື່ໆ."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"ກະລຸນາລົງທະບຽນອຸປະກອນຂອງທ່ານອີກເທື່ອໜຶ່ງ."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"ບໍ່ສາມາດຈຳແນກໃບໜ້າໄດ້ອີກຕໍ່ໄປ. ກະລຸນາລອງໃໝ່."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ຄ້າຍກັນເກີນໄປ, ກະລຸນາປ່ຽນທ່າຂອງທ່ານ."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"ອຽງຫົວຂອງທ່ານໜ້ອຍໜຶ່ງ."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"ປັບມຸມໜ້າຂອງທ່ານໃຫ້ຕັ້ງຊື່."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"ອຽງຫົວຂອງທ່ານໜ້ອຍໜຶ່ງ."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"ບໍ່ສາມາດຈຳແນກໃບໜ້າໄດ້. ກະລຸນາລອງໃໝ່."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"ປ່ຽນຕຳແໜ່ງຂອງຫົວທ່ານເລັກນ້ອຍ"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"ເບິ່ງຊື່ໆໄປຫາໂທລະສັບຂອງທ່ານໃຫ້ຫຼາຍຂຶ້ນ"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"ເບິ່ງຊື່ໆໄປຫາໂທລະສັບຂອງທ່ານໃຫ້ຫຼາຍຂຶ້ນ"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"ເບິ່ງຊື່ໆໄປຫາໂທລະສັບຂອງທ່ານໃຫ້ຫຼາຍຂຶ້ນ"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"ນຳສິ່ງທີ່ກີດຂວາງໃບໜ້າທ່ານອອກ."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"ທຳຄວາມສະອາດສ່ວນເທິງສຸດຂອງໜ້າຈໍທ່ານ, ຮວມທັງແຖບດຳນຳ"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"ໃບໜ້າຂອງທ່ານຕ້ອງສະແດງໃຫ້ເຫັນໝົດ"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"ໃບໜ້າຂອງທ່ານຕ້ອງສະແດງໃຫ້ເຫັນໝົດ"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"ບໍ່ສາມາດສ້າງຮູບແບບໃບໜ້າຂອງທ່ານໄດ້. ກະລຸນາລອງໃໝ່."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ກວດພົບແວ່ນຕາດຳ. ໃບໜ້າຂອງທ່ານຕ້ອງສະແດງໃຫ້ເຫັນໝົດ."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ກວດພົບການປົກປິດໃບໜ້າ. ໃບໜ້າຂອງທ່ານຕ້ອງສະແດງໃຫ້ເຫັນໝົດ."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ບໍ່ມີຮາດແວໃຫ້ໃຊ້."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 0b368facd99c..dfa4b57d2405 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -636,26 +636,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Atrakinimas kontroliniu kodu"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Negalima naudoti kontrolinio kodo jutiklio"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Apsilankykite pas taisymo paslaugos teikėją."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Neužfiks. tikslūs veido duom. Bandykite dar kartą."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nepavyko sukurti veido modelio. Band. dar kartą."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Per šviesu. Išbandykite mažesnį apšvietimą."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Per tamsu. Išbandykite šviesesnį apšvietimą."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Laikykite telefoną toliau."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Laikykite telefoną arčiau."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Laikykite telefoną aukščiau."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Laikykite telefoną žemiau."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Pasukite telefoną kairėn."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Pasukite telefoną dešinėn."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Išbandykite šviesesnį apšvietimą"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Laikykite telefoną toliau"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Laikykite telefoną arčiau"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Laikykite telefoną aukščiau"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Laikykite telefoną žemiau"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Laikykite telefoną kairiau"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Laikykite telefoną dešiniau"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Žiūrėkite tiesiai į įrenginį."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Veidas turi būti prieš telefoną."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Nepavyko pamatyti jūsų veido. Laikykite telefoną akių lygyje."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Įrenginys per daug judinamas. Nejudink. telefono."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Užregistruokite veidą iš naujo."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Nebegalima atpažinti veido. Bandykite dar kartą."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Per daug panašu, pakeiskite veido išraišką."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Nesukite tiek galvos."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Pakreipkite galvą šiek tiek mažiau."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Nesukite tiek galvos."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Veidas neatpažintas. Bandykite dar kartą."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Kaskart šiek tiek pakeiskite galvos poziciją"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Žiūrėkite tiesiai į telefoną"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Žiūrėkite tiesiai į telefoną"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Žiūrėkite tiesiai į telefoną"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Patraukite viską, kas užstoja jūsų veidą."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Išvalykite ekrano viršų, įskaitant juodą juostą"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Veidas turi būti visas matomas"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Veidas turi būti visas matomas"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Nepavyko sukurti veido modelio. Band. dar kartą."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Aptikti akiniai nuo saulės. Visas veidas turi būti matomas."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Aptikta veido kaukė. Visas veidas turi būti matomas."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nepavyko patv. veido. Aparatinė įranga negalima."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index ef9831987a01..0d12561407a4 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Autorizācija ar pirksta nospiedumu"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Nevar izmantot pirksta nospieduma sensoru"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Sazinieties ar remonta pakalpojumu sniedzēju."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Neizdevās tvert sejas datus. Mēģiniet vēlreiz."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nevar izveidot sejas modeli. Mēģiniet vēlreiz."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Pārāk spilgts. Izmēģiniet maigāku apgaismojumu."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Pārāk tumšs. Izmēģiniet spožāku apgaismojumu."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Pārvietojiet tālruni tālāk."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Pārvietojiet tālruni tuvāk."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Paceliet tālruni augstāk."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Nolaidiet tālruni zemāk"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Pārvietojiet tālruni pa kreisi."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Pārvietojiet tālruni pa labi."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Izmēģiniet spožāku apgaismojumu"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Pārvietojiet tālruni tālāk."</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Pārvietojiet tālruni tuvāk."</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Paceliet tālruni augstāk."</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Nolaidiet tālruni zemāk."</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Pārvietojiet tālruni pa kreisi."</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Pārvietojiet tālruni pa labi."</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Lūdzu, tiešāk skatieties uz savu ierīci."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Novietojiet savu seju tieši pretī tālrunim."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Seja nav redzama. Turiet tālruni acu līmenī."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Pārāk daudz kustību. Nekustīgi turiet tālruni."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Lūdzu, atkārtoti reģistrējiet savu seju."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Seju vairs nevar atpazīt. Mēģiniet vēlreiz."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Pārāk līdzīgi. Lūdzu, mainiet pozu."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Pagrieziet galvu nedaudz mazāk."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Nedaudz mazāk nolieciet galvu."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Pagrieziet galvu nedaudz mazāk."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Nevar atpazīt seju. Mēģiniet vēlreiz."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Nedaudz mainiet galvas pozīciju."</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Skatieties tieši uz tālruni"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Skatieties tieši uz tālruni"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Skatieties tieši uz tālruni"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Noņemiet visu, kas aizsedz jūsu seju."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Notīriet ekrāna augšdaļu, tostarp melno joslu."</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Sejai ir jābūt pilnībā redzamai"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Sejai ir jābūt pilnībā redzamai"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Nevar izveidot sejas modeli. Mēģiniet vēlreiz."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Konstatētas tumšas brilles. Sejai ir jābūt pilnībā redzamai."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Konstatēts sejas aizsegs. Sejai ir jābūt pilnībā redzamai."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nevar verificēt seju. Aparatūra nav pieejama."</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 5bf647c5accb..44b9ddd870ed 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Отклучување со отпечаток на прст"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Не може да се користи сензорот за отпечатоци"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Однесете го на поправка."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Не се сними прецизна слика. Обидете се повторно."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Не може да создаде модел на лик. Обидете се пак."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Премногу светла. Пробајте со послабо осветлување."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Премногу темна. Пробајте со посилно осветлување."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Оддалечете го телефонот."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Доближете го телефонот."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Поткренете го телефонот."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Снижете го телефонот."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Поместете го телефонот налево."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Поместете го телефонот надесно."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Пробајте со посилно осветлување"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Оддалечете го телефонот"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Доближете го телефонот"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Кренете го телефонот погоре"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Спуштете го телефонот подолу"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Поместете го телефонот налево"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Поместете го телефонот надесно"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Погледнете подиректно во уредот."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Наместете го лицето директно пред телефонот."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Не ви се гледа лицето. Држете го телефонот во висина на очите."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Премногу движење. Држете го телефонот стабилно."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Повторно регистрирајте го лицето."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Ликот не се препознава. Обидете се повторно."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Премногу слично, сменете ја позата."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Не вртете ја главата толку многу."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Не навалувајте ја главата толку многу."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Не вртете ја главата толку многу."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Не се препознава ликот. Обидете се пак."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Малку сменете ја положбата на главата"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Гледајте подиректно во телефонот"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Гледајте подиректно во телефонот"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Гледајте подиректно во телефонот"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Отстранете ги работите што ви го покриваат лицето."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Исчистете го врвот на екранот, вклучувајќи ја црната лента"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Лицето мора да ви се гледа целосно"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Лицето мора да ви се гледа целосно"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Не може да создаде модел на лик. Обидете се пак."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Носите темни очила. Лицето мора да ви се гледа целосно."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Лицето е покриено. Лицето мора да ви се гледа целосно."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ликот не може да се потврди. Хардвер - недостапен."</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 04ef9d494d69..05431760481a 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ഫിംഗർപ്രിന്റ് അൺലോക്ക്"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"വിരലടയാള സെൻസർ ഉപയോഗിക്കാനാകുന്നില്ല"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"റിപ്പയർ കേന്ദ്രം സന്ദർശിക്കുക."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"കൃത്യ മുഖ ഡാറ്റ എടുക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"മുഖ മോഡൽ സൃഷ്ടിക്കാനാകുന്നില്ല. വീണ്ടും ശ്രമിക്കൂ."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"വളരെയധികം തെളിച്ചം. സൗമ്യതയേറിയ പ്രകാശം ശ്രമിക്കൂ."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"വളരെ ഇരുണ്ടത്. തിളക്കമേറിയ ലൈറ്റിംഗ് പരീക്ഷിക്കുക."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ഫോൺ കൂടുതൽ അകലേയ്ക്ക് നീക്കുക."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ഫോൺ അടുത്തേക്ക് നീക്കുക."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ഫോൺ മുകളിലേക്ക് ഉയർത്തുക"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ഫോൺ കൂടുതൽ താഴേക്ക് നീക്കുക."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ഫോൺ ഇടത്തോട്ട് നീക്കുക."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ഫോൺ വലത്തോട്ട് നീക്കുക."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"കൂടുതൽ വെളിച്ചമുള്ളയിടത്ത് പരീക്ഷിച്ച് നോക്കൂ"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ഫോൺ കൂടുതൽ ദൂരേയ്ക്ക് നീക്കുക"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ഫോൺ അടുത്തേക്ക് നീക്കുക"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ഫോൺ മുകളിലേക്ക് ഉയർത്തുക"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ഫോൺ കൂടുതൽ താഴേക്ക് നീക്കുക"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ഫോൺ നിങ്ങളുടെ ഇടതുവശത്തേക്ക് നീക്കുക"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ഫോൺ നിങ്ങളുടെ വലതുവശത്തേക്ക് നീക്കുക"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"നിങ്ങളുടെ ഉപകരണത്തിന് നേരെ കൂടുതൽ നന്നായി നോക്കുക."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"നിങ്ങളുടെ മുഖം ക്യാമറയ്ക്ക് നേരെയാക്കുക."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"നിങ്ങളുടെ മുഖം കാണാനാകുന്നില്ല. നിങ്ങളുടെ ഫോൺ കണ്ണിന് നേരെ പിടിക്കുക."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"വളരെയധികം ചലനം. ഫോൺ അനക്കാതെ നേരെ പിടിക്കുക."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യുക."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"ഇനി മുഖം തിരിച്ചറിയാനാവില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"വളരെയധികം സമാനത, നിങ്ങളുടെ പോസ് മാറ്റുക."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"നിങ്ങളുടെ തല ഇത്ര തിരിക്കേണ്ട."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"നിങ്ങളുടെ തല ചെറുതായി ടിൽറ്റ് ചെയ്യുക."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"നിങ്ങളുടെ തല ഇത്ര തിരിക്കേണ്ട."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"മുഖം തിരിച്ചറിയാനാകുന്നില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"നിങ്ങളുടെ തലയുടെ സ്ഥാനം ചെറുതായി മാറ്റുക"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"കൂടുതൽ കൃത്യമായി ഫോണിന് നേരെ നോക്കുക"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"കൂടുതൽ കൃത്യമായി ഫോണിന് നേരെ നോക്കുക"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"കൂടുതൽ കൃത്യമായി ഫോണിന് നേരെ നോക്കുക"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"നിങ്ങളുടെ മുഖം മറയ്ക്കുന്നത് എല്ലാം നീക്കം ചെയ്യൂ."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"കറുപ്പ് ബാർ ഉൾപ്പെടെ നിങ്ങളുടെ സ്ക്രീനിന്റെ മുകൾഭാഗം വൃത്തിയാക്കുക"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"നിങ്ങളുടെ മുഖം പൂർണ്ണമായും ദൃശ്യമായിരിക്കണം"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"നിങ്ങളുടെ മുഖം പൂർണ്ണമായും ദൃശ്യമായിരിക്കണം"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"മുഖ മോഡൽ സൃഷ്ടിക്കാനാകില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"കറുത്ത കണ്ണട കണ്ടെത്തി. നിങ്ങളുടെ മുഖം പൂർണ്ണമായും ദൃശ്യമായിരിക്കണം."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"മുഖം മറച്ചിരിക്കുന്നതായി കണ്ടെത്തി. നിങ്ങളുടെ മുഖം പൂർണ്ണമായും ദൃശ്യമായിരിക്കണം."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"മുഖം പരിശോധിക്കാൻ കഴിയില്ല. ഹാർഡ്വെയർ ലഭ്യമല്ല."</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index e0d78ef3f7d9..eaaed00b1bbf 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Хурууны хээгээр түгжээ тайлах"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Хурууны хээ мэдрэгч ашиглах боломжгүй"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Засварын үйлчилгээ үзүүлэгчид зочилно уу."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Царайн өгөгдлийг зөв авч чадсангүй. Дахин оролдоно уу."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Нүүрний загвар үүсгэж чадсангүй. Дахин оролдоно уу."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Хэт цайвар байна. Гэрэл багатай газар оролдоно уу."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Хэт харанхуй байна. Гэрэлтэй орчинд туршина уу."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Утсаа холдуулна уу."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Утсаа ойртуулна уу."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Утсаа дээшлүүлнэ үү."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Утсаа доошлуулна уу."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Утсаа зүүн тийш болгоно уу."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Утсаа баруун тийш болгоно уу."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Гэрэлтэй орчинд туршина уу"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Утсаа холдуулна уу"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Утсаа ойртуулна уу"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Утсаа дээшлүүлнэ үү"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Утсаа доошлуулна уу"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Утсаа зүүн тийш болгоно уу"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Утсаа баруун тийш болгоно уу"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Төхөөрөмж рүүгээ аль болох эгц харна уу."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Царайгаа утасны урд эгц байрлуулна уу"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Таны царай харагдахгүй байна. Утсаа нүднийхээ түвшинд барина уу."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Хэт их хөдөлгөөнтэй байна. Утсаа хөдөлгөөнгүй барина уу."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Нүүрээ дахин бүртгүүлнэ үү."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Царайг таних боломжгүй боллоо. Дахин оролдоно уу."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Хэт адилхан байгаа тул байрлалаа өөрчилнө үү."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Толгойгоо арай багаар эргүүлнэ үү."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Толгойгоо арай бага хазайлгана уу."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Толгойгоо арай багаар эргүүлнэ үү."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Царайг танихгүй байна. Дахин оролдоно уу."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Толгойныхоо байрлалыг бага зэрэг өөрчилнө үү"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Утас руугаа аль болох эгц харна уу"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Утас руугаа аль болох эгц харна уу"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Утас руугаа аль болох эгц харна уу"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Таны нүүрийг далдалж буй аливаа зүйлийг хасна уу."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Хар хэсэг зэрэг дэлгэцийнхээ дээд хэсгийг цэвэрлэнэ үү"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Таны нүүр бүтэн харагдах ёстой"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Таны нүүр бүтэн харагдах ёстой"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Нүүрний загвар үүсгэж чадсангүй. Дахин оролдоно уу."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Хар шил илэрлээ. Таны нүүр бүтэн харагдах ёстой."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Нүүрний халхавч илэрлээ. Таны нүүр бүтэн харагдах ёстой."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Царайг бататгаж чадсангүй. Техник хангамж боломжгүй байна."</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index d79f1c07cc78..795c6a77a24e 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"फिंगरप्रिंट अनलॉक"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"फिंगरप्रिंट सेन्सर वापरू शकत नाही"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"दुरुस्तीच्या सेवा पुरवठादाराला भेट द्या."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"अचूक फेस डेटा कॅप्चर करता आला नाही. पुन्हा करा."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"फेस मॉडेल तयार करू शकत नाही. पुन्हा प्रयत्न करा."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"खूप प्रखर. आणखी सौम्य प्रकाश वापरून पहा."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"खूप गडद. आणखी प्रखर प्रकाश वापरून पहा."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"फोन आणखी दूर हलवा"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"फोन आणखी जवळ हलवा."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"फोन आणखी वर हलवा."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"फोन आणखी खाली हलवा."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"फोन डावीकडे हलवा."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"फोन उजवीकडे हलवा."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"आणखी प्रखर प्रकाश वापरून पहा"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"फोन आणखी दूर हलवा"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"फोन आणखी जवळ हलवा"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"फोन आणखी वर हलवा"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"फोन आणखी खाली हलवा"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"फोन तुमच्या डावीकडे हलवा"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"फोन तुमच्या उजवीकडे हलवा"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"कृपया तुमच्या डिव्हाइसकडे थेट पहा"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"तुमचा चेहरा थेट फोन समोर आणा."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"तुमचा चेहरा दिसत नाही. तुमचा फोन डोळ्याच्या पातळीवर धरा."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"खूप हलत आहे. फोन स्थिर धरून ठेवा."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"चेहरा ओळखू शकत नाही. पुन्हा प्रयत्न करा."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"एकाच प्रकारची पोझ देत आहात कृपया तुमची पोझ बदला."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"तुमचे डोके थोडे कमी फिरवा."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"तुमचे डोके थोडे कमी तिरपे करा."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"तुमचे डोके थोडे कमी फिरवा."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"चेहरा ओळखू शकत नाही. पुन्हा प्रयत्न करा."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"तुमच्या डोक्याचे स्थान किंचित बदला"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"तुमच्या फोनकडे आणखी थेट पहा"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"तुमच्या फोनकडे आणखी थेट पहा"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"तुमच्या फोनकडे आणखी थेट पहा"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"तुमचा चेहरा लपवणारे काहीही काढून टाका."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"ब्लॅक बार सह तुमच्या स्क्रीनची वरची बाजू साफ करा"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"तुमचा चेहरा पूर्णपणे दृश्यमान असणे आवश्यक आहे"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"तुमचा चेहरा पूर्णपणे दृश्यमान असणे आवश्यक आहे"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"फेस मॉडेल तयार करू शकत नाही. पुन्हा प्रयत्न करा."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"गडद चष्मा डिटेक्ट केला. तुमचा चेहरा पूर्णपणे दृश्यमान असणे आवश्यक आहे."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"चेहर्यावरील आच्छादन डिटेक्ट केले. तुमचा चेहरा पूर्णपणे दृश्यमान असणे आवश्यक आहे."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"चेहरा पडताळू शकत नाही. हार्डवेअर उपलब्ध नाही."</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index f1b9498f444a..b9790a60d6a4 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Buka Kunci Cap Jari"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Tidak boleh menggunakan penderia cap jari"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Lawati penyedia pembaikan."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Gagal menangkap data wajah dgn tepat. Cuba lagi."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Tidak dapat membuat model wajah anda. Cuba lagi."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Cuba pencahayaan yang lebih lembut."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Terlalu gelap. Cuba pencahayaan yang lebih cerah."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Jauhkan telefon."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Dekatkan telefon."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Tinggikan lagi telefon."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Rendahkan lagi telefon."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Alihkan telefon ke kiri."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Alihkan telefon ke kanan."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Cuba pencahayaan yang lebih cerah"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Jauhkan telefon"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Dekatkan telefon"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Tinggikan lagi telefon"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Rendahkan lagi telefon"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Gerakkan telefon ke kiri anda"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Gerakkan telefon ke kanan anda"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Sila lihat terus pada peranti anda."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Letakkan wajah anda betul-betul di depan telefon."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Gagal mengesan wajah anda. Pegang telefon anda pada paras mata."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Terlalu bnyk gerakan. Pegang telefon dgn stabil."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Sila daftarkan semula wajah anda."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Tidak lagi dapat mengecam wajah. Cuba lagi."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Terlalu serupa, sila ubah lagak gaya anda."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Pusingkan kepala anda kurang sedikit."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Sengetkan kepala anda kurang sedikit."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Pusingkan kepala anda kurang sedikit."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Tidak dapat mengecam wajah. Cuba lagi."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Tukar sedikit kedudukan kepala anda"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Lihat terus pada telefon anda"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Lihat terus pada telefon anda"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Lihat terus pada telefon anda"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Alih keluar apa-apa yang melindungi wajah anda."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Bersihkan bahagian atas skrin anda, termasuk bar hitam"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Wajah anda mesti terlihat sepenuhnya"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Wajah anda mesti terlihat sepenuhnya"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Tidak dapat membuat model wajah anda. Cuba lagi."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Cermin mata gelap dikesan. Wajah anda mesti terlihat sepenuhnya."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Pelitup muka dikesan. Wajah anda mesti terlihat sepenuhnya."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Tdk dpt sahkan wajah. Perkakasan tidak tersedia."</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index fbea25125772..71b01513dcd9 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"လက်ဗွေသုံး လော့ခ်ဖွင့်ခြင်း"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"လက်ဗွေ အာရုံခံကိရိယာကို အသုံးပြု၍ မရပါ"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ပြုပြင်ရေး ဝန်ဆောင်မှုပေးသူထံသို့ သွားပါ။"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"မျက်နှာဒေတာ အမှန် မရိုက်ယူနိုင်ပါ၊ ထပ်စမ်းကြည့်ပါ။"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"သင့်မျက်နှာနမူနာ ပြုလုပ်၍မရပါ။ ထပ်စမ်းကြည့်ပါ။"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"အလွန် လင်းသည်။ အလင်းလျှော့ကြည့်ပါ။"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"အလွန်မှောင်သည်။ ပိုလင်းအောင် လုပ်ကြည့်ပါ။"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ဖုန်းကို အဝေးသို့ခွာပါ။"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ဖုန်းကို အနားသို့ ပိုတိုးပါ။"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ဖုန်းကို ပိုမြှင့်လိုက်ပါ။"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ဖုန်းကို အောက်ပိုနှိမ့်ပါ။"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ဖုန်းကို ဘယ်ဘက်သို့ရွှေ့ပါ။"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ဖုန်းကို ညာဘက်သို့ ရွှေ့ပါ။"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"ပိုလင်းအောင် လုပ်ကြည့်ပါ"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ဖုန်းကို အဝေးသို့ခွာပါ"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ဖုန်းကို အနားသို့ပိုတိုးပါ"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ဖုန်းကို ပိုမြှင့်လိုက်ပါ"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ဖုန်းကို အောက်ပိုနှိမ့်ပါ"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ဖုန်းကို သင့်ဘယ်ဘက်သို့ ရွှေ့ပါ"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ဖုန်းကို သင့်ညာဘက်သို့ ရွှေ့ပါ"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"သင့်စက်ပစ္စည်းကို တည့်တည့်ကြည့်ပါ။"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"မျက်နှာကို ဖုန်းရှေ့တွင် တည့်အောင်ထားပါ။"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"သင့်မျက်နှာကို မမြင်ရပါ။ ဖုန်းကို မျက်လုံးနှင့် တစ်တန်းတည်းထား၍ ကိုင်ပါ။"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"လှုပ်လွန်းသည်။ ဖုန်းကို ငြိမ်ငြိမ်ကိုင်ပါ။"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"သင့်မျက်နှာကို ပြန်စာရင်းသွင်းပါ။"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"မျက်နှာ မမှတ်သားနိုင်တော့ပါ။ ထပ်စမ်းကြည့်ပါ။"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ဆင်တူနေသည်၊ အမူအရာ ပြောင်းပါ။"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"ခေါင်းကို သိပ်မလှည့်ပါနှင့်။"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"သင့်ခေါင်းကို သိပ်မလှည့်ပါနှင့်။"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"ခေါင်းကို သိပ်မလှည့်ပါနှင့်။"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"မျက်နှာကို မသိပါ။ ထပ်စမ်းကြည့်ပါ။"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"ခေါင်းအနေအထားကို အနည်းငယ်ပြောင်းပါ"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"သင့်ဖုန်းကို တည့်တည့်ကြည့်ပါ"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"သင့်ဖုန်းကို တည့်တည့်ကြည့်ပါ"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"သင့်ဖုန်းကို တည့်တည့်ကြည့်ပါ"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"သင့်မျက်နှာကို ကွယ်နေသည့်အရာအားလုံး ဖယ်ပါ။"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"အနက်ရောင်ဘားအပါအဝင် ဖန်သားပြင်ထိပ်ကို သန့်ရှင်းရေး လုပ်ပါ"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"သင့်မျက်နှာကို အပြည့်အဝ မြင်ရရန်လိုအပ်သည်"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"သင့်မျက်နှာကို အပြည့်အဝ မြင်ရရန်လိုအပ်သည်"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"သင့်မျက်နှာနမူနာ ပြုလုပ်၍မရပါ။ ထပ်စမ်းကြည့်ပါ။"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"အရောင်ရင့်သောမျက်မှန် တွေ့သည်။ သင့်မျက်နှာကို အပြည့်အဝ မြင်ရရန်လိုအပ်သည်။"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"မျက်နှာဖုံး တွေ့သည်။ သင့်မျက်နှာကို အပြည့်အဝ မြင်ရရန်လိုအပ်သည်။"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"မျက်နှာကို အတည်ပြု၍ မရပါ။ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 1b0c46899b27..c6a8915807d7 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Opplåsing med fingeravtrykk"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Kan ikke bruke fingeravtrykkssensoren"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Gå til en reparasjonsleverandør."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Kunne ikke ta opp nøyaktige ansiktsdata Prøv på nytt"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kan ikke lage ansiktsmodell. Prøv på nytt."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"For lyst. Prøv svakere belysning."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"For mørkt. Prøv sterkere belysning."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Flytt telefonen lengre unna"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Flytt telefonen nærmere."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Flytt telefonen høyere."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Flytt telefonen lavere."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Flytt telefonen til venstre."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Flytt telefonen til høyre."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Prøv sterkere belysning"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Flytt telefonen lengre unna"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Flytt telefonen nærmere"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Flytt telefonen høyere"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Flytt telefonen lavere"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Flytt telefonen til venstre"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Flytt telefonen til høyre"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Se mer direkte på enheten din."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Hold ansiktet ditt rett foran telefonen."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Kan ikke se ansiktet ditt. Hold telefonen i øyehøyde."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"For mye bevegelse. Hold telefonen stødig."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Registrer ansiktet ditt på nytt."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Kan ikke gjenkjenne ansiktet lenger. Prøv på nytt."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"For likt – endre posituren din."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Vri hodet ditt litt mindre."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Vri hodet litt mindre."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Vri hodet ditt litt mindre."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Ansiktet gjenkjennes ikke. Prøv på nytt."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Endre hodeposisjonen litt"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Se mer direkte på telefonen"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Se mer direkte på telefonen"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Se mer direkte på telefonen"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Fjern alt som skjuler ansiktet ditt."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Rengjør den øverste delen av skjermen, inkludert den svarte linjen"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Ansiktet må være helt synlig"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Ansiktet må være helt synlig"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Kan ikke lage ansiktsmodell. Prøv på nytt."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Mørke briller er registrert. Ansiktet må være helt synlig."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Ansiktsdekke er registrert. Ansiktet må være helt synlig."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Kan ikke bekrefte ansikt. Utilgjengelig maskinvare."</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index efede375ac8e..cedb6e7bff8f 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"फिंगरप्रिन्ट अनलक"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"फिंगरप्रिन्ट सेन्सर प्रयोग गर्न मिल्दैन"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"फिंगरप्रिन्ट सेन्सर मर्मत गर्ने सेवा प्रदायक कम्पनीमा सम्पर्क गर्नुहोस्।"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"अनुहारको सटीक डेटा खिच्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"तपाईंको फेस मोडेल सिर्जना गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"ज्यादै चम्किलो। अझ मधुरो प्रकाश प्रयोग गरी हेर्नु…"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"ज्यादै अँध्यारो छ। अझ बढी प्रकाशमा गई हेर्नुहोस्"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"फोन अझै पर सार्नुहोस्।"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"फोन अझै नजिक सार्नुहोस्।"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"फोन अझ माथि उठाउनुहोस्।"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"फोन अझै तल सार्नुहोस्।"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"फोन बायाँतिर सार्नुहोस्।"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"फोन दायाँतिर सार्नुहोस्।"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"अझ उज्यालो ठाउँमा गएर फोटो खिची हेर्नुहोस्"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"फोन अझै पर सार्नुहोस्"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"फोन अझै नजिक सार्नुहोस्"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"फोन अझ माथि उठाउनुहोस्"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"फोन अझै तल सार्नुहोस्"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"फोन आफ्नो बायाँतिर सार्नुहोस्"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"फोन आफ्नो दायाँतिर सार्नुहोस्"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"कृपया अझ सीधा गरी आफ्नो स्क्रिनमा हेर्नुहोस्।"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"आफ्नो अनुहार फोनको सीधा अगाडि पार्नुहोस्।"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"तपाईंको अनुहार देखिएन। तपाईंको फोन आफ्नो आँखाअघि राखी समात्नुहोस्।"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"अत्यधिक हल्लियो। फोन स्थिर राख्नुहोस्।"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्।"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"अब उप्रान्त अनुहार पहिचान गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"अनुहार उस्तै भयो, कृपया आफ्नो पोज बदल्नुहोस्।"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"आफ्नो टाउको अलि थोरै घुमाउनुहोस्।"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"आफ्नो टाउको केही कम झुकाउनुहोस्।"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"आफ्नो टाउको अलि थोरै घुमाउनुहोस्।"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"अनुहार पहिचान गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"आफ्नो टाउको थोरै यताउता सार्नुहोस्"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"आफ्नो फोनमा अझ सीधा हेर्नुहोस्"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"आफ्नो फोनमा अझ सीधा हेर्नुहोस्"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"आफ्नो फोनमा अझ सीधा हेर्नुहोस्"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"तपाईंको अनुहार लुकाउने सबै कुरा हटाउनुहोस्।"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"कालो रङको पट्टीलगायत आफ्नो स्क्रिनको माथिल्लो भाग सफा गर्नुहोस्"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"तपाईंको अनुहार पूरै देखिनु पर्छ"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"तपाईंको अनुहार पूरै देखिनु पर्छ"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"तपाईंको फेस मोडेल सिर्जना गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"कालो चस्मा लगाइएको पाइयो। तपाईंको अनुहार पूरै देखिनु पर्छ।"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"अनुहार छोपिएको पाइयो। तपाईंको अनुहार पूरै देखिनु पर्छ।"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"अनुहार पुष्टि गर्न सकिएन। हार्डवेयर उपलब्ध छैन।"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 2ec06024ab58..bb93aa71eee8 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Ontgrendelen met vingerafdruk"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Kan vingerafdruksensor niet gebruiken"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Ga naar een reparateur."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Geen accurate gegevens. Probeer het nog eens."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Kan gezichtsmodel niet maken. Probeer het opnieuw."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Overbelicht. Probeer een minder felle belichting."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Te donker. Probeer een fellere verlichting."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Beweeg de telefoon verder weg."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Houd de telefoon dichterbij."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Houd de telefoon hoger."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Houd de telefoon lager."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Beweeg je telefoon meer naar links."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Beweeg je telefoon meer naar rechts."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Probeer fellere verlichting"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Houd de telefoon verder weg"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Houd de telefoon dichterbij"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Houd de telefoon hoger"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Houd de telefoon lager"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Beweeg de telefoon naar links"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Beweeg de telefoon naar rechts"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Kijk rechter naar je apparaat."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Houd je gezicht recht voor de telefoon."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Je gezicht is niet te zien. Houd je telefoon op ooghoogte."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Te veel beweging. Houd je telefoon stil."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Registreer je gezicht opnieuw."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Herkent gezicht niet meer. Probeer het nog eens."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Lijkt te veel op elkaar. Verander je pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Draai je hoofd iets minder."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Kantel je hoofd iets minder."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Draai je hoofd iets minder."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Gezicht niet herkend. Probeer het opnieuw."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Verander de positie van je hoofd een beetje"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Kijk goed recht naar je telefoon"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Kijk goed recht naar je telefoon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Kijk goed recht naar je telefoon"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Zorg dat je gezicht volledig zichtbaar is"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Reinig de bovenkant van je scherm, inclusief de zwarte balk"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Je gezicht moet geheel zichtbaar zijn"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Je gezicht moet geheel zichtbaar zijn"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Kan gezichtsmodel niet maken. Probeer het opnieuw."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Donkere bril waargenomen. Je gezicht moet geheel zichtbaar zijn."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Gezichtsbedekking waargenomen. Je gezicht moet geheel zichtbaar zijn."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Kan gezicht niet verifiëren. Hardware niet beschikbaar."</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index dd424a1c50d4..1b4e4e70cf99 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ୍"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"ଟିପଚିହ୍ନ ସେନ୍ସରକୁ ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ଏକ ମରାମତି କେନ୍ଦ୍ରକୁ ଭିଜିଟ୍ କରନ୍ତୁ।"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"ମୁହଁର ଡାଟା କ୍ୟାପଚର୍ ହେଲାନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"ଫେସର ମଡେଲ ତିଆରି କରାଯାଇପାରିବ ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କର।"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"ଅତ୍ୟଧିକ ଉଜ୍ଵଳ। କମ୍ ଉଜ୍ବଳକରଣରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"ଅତ୍ୟଧିକ ଅନ୍ଧକାର। ଉଜ୍ବଳ ଲାଇଟ୍ ବ୍ୟବହାର କରନ୍ତୁ।"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ଫୋନ୍କୁ ଟିକେ ଦୂରକୁ ନିଅନ୍ତୁ।"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ଫୋନକୁ ପାଖକୁ ଆଣନ୍ତୁ।"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ଫୋନକୁ ଉପରକୁ ମୁଭ କରନ୍ତୁ।"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ଫୋନ୍କୁ ତଳକୁ ମୁଭ କରନ୍ତୁ।"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ବାମ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ଡାହାଣ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"ଉଜ୍ଜ୍ୱଳ ଲାଇଟ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ଫୋନକୁ ଟିକେ ଦୂରକୁ ନିଅନ୍ତୁ"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ଫୋନକୁ ପାଖକୁ ଆଣନ୍ତୁ"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ଫୋନକୁ ଉପରକୁ ମୁଭ କରନ୍ତୁ"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ଫୋନ୍କୁ ତଳକୁ ମୁଭ କରନ୍ତୁ"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ଫୋନକୁ ଆପଣଙ୍କ ବାମ ପଟକୁ ମୁଭ କରନ୍ତୁ"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ଫୋନକୁ ଆପଣଙ୍କ ଡାହାଣ ପଟକୁ ମୁଭ କରନ୍ତୁ"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"ଦୟାକରି ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ସିଧାସଳଖ ଦେଖନ୍ତୁ।"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"ଆପଣଙ୍କ ମୁହଁକୁ ଫୋନ୍ ସାମ୍ନାରେ ସିଧାସଳଖ ରଖନ୍ତୁ।"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"ଆପଣଙ୍କ ଫେସ ଦେଖାଯାଉନାହିଁ। ଆପଣଙ୍କ ଫୋନକୁ ଆଖି ସିଧାରେ ଧରି ରଖନ୍ତୁ।"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"ଅତ୍ୟଧିକ ଅସ୍ଥିର। ଫୋନ୍କୁ ସ୍ଥିର ଭାବେ ଧରନ୍ତୁ।"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ।"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"ଆଉ ମୁହଁ ଚିହ୍ନଟ କରିହେଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ଅତ୍ୟନ୍ତ ସମପରି, ଦୟାକରି ଆପଣଙ୍କର ପୋଜ୍ ବଦଳାନ୍ତୁ।"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ଟିକିଏ ବୁଲାନ୍ତୁ।"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"ଆପଣଙ୍କ ମୁଣ୍ଡକୁ ଟିକିଏ କମ୍ ଟିଲ୍ଟ କରନ୍ତୁ।"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ଟିକିଏ ବୁଲାନ୍ତୁ।"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"ଫେସ ଚିହ୍ନଟ କରାଯାଇପାରିବ ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କର।"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"ଆପଣଙ୍କ ମୁଣ୍ଡର ସ୍ଥିତି ସାମାନ୍ୟ ବଦଳାନ୍ତୁ"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"ଆପଣଙ୍କ ଫୋନକୁ ସମ୍ପୂର୍ଣ୍ଣ ସିଧା ଦେଖନ୍ତୁ"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"ଆପଣଙ୍କ ଫୋନକୁ ସମ୍ପୂର୍ଣ୍ଣ ସିଧା ଦେଖନ୍ତୁ"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"ଆପଣଙ୍କ ଫୋନକୁ ସମ୍ପୂର୍ଣ୍ଣ ସିଧା ଦେଖନ୍ତୁ"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"ଆପଣଙ୍କ ମୁହଁକୁ ଲୁଚାଉଥିବା ଯେ କୌଣସି ଜିନିଷକୁ କାଢ଼ି ଦିଅନ୍ତୁ।"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"କଳା ବାର୍ ସମେତ ଆପଣଙ୍କ ସ୍କ୍ରିନ୍ର ଶୀର୍ଷକୁ ସଫା କରନ୍ତୁ"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"ଆପଣଙ୍କ ଫେସ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଦେଖାଯିବା ଆବଶ୍ଯକ"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"ଆପଣଙ୍କ ଫେସ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଦେଖାଯିବା ଆବଶ୍ଯକ"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"ଫେସର ମଡେଲ ତିଆରି କରାଯାଇପାରିବ ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କର।"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"କଳା ଚଷମା ଚିହ୍ନଟ କରାଯାଇଛି। ଆପଣଙ୍କ ଫେସ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଦେଖାଯିବା ଆବଶ୍ଯକ।"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ଫେସରେ କଭରିଂ ଚିହ୍ନଟ କରାଯାଇଛି। ଆପଣଙ୍କ ଫେସ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଦେଖାଯିବା ଆବଶ୍ଯକ।"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ହାର୍ଡୱେୟାର୍ ଉପଲବ୍ଧ ନାହିଁ।"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index f595dba67643..3635e69c2cac 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਅਣਲਾਕ"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ਮੁਰੰਮਤ ਪ੍ਰਦਾਨਕ \'ਤੇ ਜਾਓ।"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"ਸਟੀਕ ਚਿਹਰਾ ਡਾਟਾ ਕੈਪਚਰ ਨਹੀਂ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"ਤੁਹਾਡੇ ਚਿਹਰੇ ਦਾ ਮਾਡਲ ਨਹੀਂ ਬਣਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਚਮਕ। ਹਲਕੀ ਚਮਕ ਵਰਤ ਕੇ ਦੇਖੋ।"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"ਬਹੁਤ ਗੂੜ੍ਹਾ। ਤੇਜ਼ ਰੋਸ਼ਨੀ ਕਰਕੇ ਦੇਖੋ।"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ਫ਼ੋਨ ਨੂੰ ਦੂਰ ਲਿਜਾਓ।"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ਫ਼ੋਨ ਨੇੜੇ ਲਿਜਾਓ।"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ਫ਼ੋਨ ਨੂੰ ਥੋੜ੍ਹਾ ਉੱਤੇ ਕਰੋ।"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ਫ਼ੋਨ ਨੂੰ ਥੋੜ੍ਹਾ ਹੇਠਾਂ ਵੱਲ ਕਰੋ।"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ਫ਼ੋਨ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਲਿਜਾਓ।"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ਫ਼ੋਨ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਲਿਜਾਓ।"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"ਤੇਜ਼ ਰੋਸ਼ਨੀ ਕਰ ਕੇ ਦੇਖੋ"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ਫ਼ੋਨ ਨੂੰ ਦੂਰ ਲਿਜਾਓ"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ਫ਼ੋਨ ਨੇੜੇ ਲਿਜਾਓ"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ਫ਼ੋਨ ਨੂੰ ਥੋੜ੍ਹਾ ਉੱਤੇ ਲਿਜਾਓ"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ਫ਼ੋਨ ਨੂੰ ਥੋੜ੍ਹਾ ਹੇਠਾਂ ਲਿਜਾਓ"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ਫ਼ੋਨ ਨੂੰ ਆਪਣੇ ਖੱਬੇ ਪਾਸੇ ਲਿਜਾਓ"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ਫ਼ੋਨ ਨੂੰ ਆਪਣੇ ਸੱਜੇ ਪਾਸੇ ਲਿਜਾਓ"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"ਕਿਰਪਾ ਕਰਕੇ ਸਿੱਧਾ ਆਪਣੇ ਡੀਵਾਈਸ ਵੱਲ ਦੇਖੋ।"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"ਆਪਣਾ ਚਿਹਰਾ ਫ਼ੋਨ ਦੇ ਬਿਲਕੁਲ ਸਾਹਮਣੇ ਰੱਖੋ।"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"ਤੁਹਾਡਾ ਚਿਹਰਾ ਨਹੀਂ ਦਿਸ ਰਿਹਾ। ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਅੱਖਾਂ ਦੀ ਸੀਧ ਵਿੱਚ ਰੱਖੋ।"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਹਿਲਜੁਲ। ਫ਼ੋਨ ਨੂੰ ਸਥਿਰ ਰੱਖੋ।"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਚਿਹਰਾ ਦੁਬਾਰਾ ਦਰਜ ਕਰੋ।"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"ਹੁਣ ਚਿਹਰਾ ਪਛਾਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ਬਹੁਤ ਮਿਲਦਾ-ਜੁਲਦਾ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਅੰਦਾਜ਼ ਬਦਲੋ।"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"ਆਪਣਾ ਸਿਰ ਥੋੜਾ ਜਿਹਾ ਝੁਕਾਓ।"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"ਆਪਣੇ ਸਿਰ ਨੂੰ ਥੋੜ੍ਹਾ ਜਿਹਾ ਝੁਕਾਓ।"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"ਆਪਣਾ ਸਿਰ ਥੋੜਾ ਜਿਹਾ ਝੁਕਾਓ।"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਨਹੀਂ ਹੋਈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"ਆਪਣੇ ਸਿਰ ਨੂੰ ਥੋੜ੍ਹਾ ਹਿਲਾਓ"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"ਸਿੱਧਾ ਆਪਣੇ ਫ਼ੋਨ ਵੱਲ ਦੇਖੋ"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"ਸਿੱਧਾ ਆਪਣੇ ਫ਼ੋਨ ਵੱਲ ਦੇਖੋ"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"ਸਿੱਧਾ ਆਪਣੇ ਫ਼ੋਨ ਵੱਲ ਦੇਖੋ"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"ਤੁਹਾਡਾ ਚਿਹਰਾ ਲੁਕਾਉਣ ਵਾਲੀ ਕੋਈ ਵੀ ਚੀਜ਼ ਹਟਾਓ।"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"ਕਾਲੀ ਪੱਟੀ ਸਮੇਤ, ਆਪਣੀ ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰ ਨੂੰ ਸਾਫ਼ ਕਰੋ"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"ਤੁਹਾਡਾ ਪੂਰਾ ਚਿਹਰਾ ਦਿਸਣਾ ਲਾਜ਼ਮੀ ਹੈ"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"ਤੁਹਾਡਾ ਪੂਰਾ ਚਿਹਰਾ ਦਿਸਣਾ ਲਾਜ਼ਮੀ ਹੈ"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"ਤੁਹਾਡੇ ਚਿਹਰੇ ਦਾ ਮਾਡਲ ਨਹੀਂ ਬਣਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ਧੁੱਪ ਦੀਆਂ ਐਨਕਾਂ ਦਾ ਪਤਾ ਲੱਗਾ। ਤੁਹਾਡਾ ਪੂਰਾ ਚਿਹਰਾ ਦਿਸਣਾ ਲਾਜ਼ਮੀ ਹੈ।"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ਚਿਹਰਾ ਢੱਕਿਆ ਹੋਣ ਦਾ ਪਤਾ ਲੱਗਾ। ਤੁਹਾਡਾ ਪੂਰਾ ਚਿਹਰਾ ਦਿਸਣਾ ਲਾਜ਼ਮੀ ਹੈ।"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋ ਸਕੀ। ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 9d08c66331ce..2e491b385910 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -636,26 +636,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odblokowywanie odciskiem palca"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Nie można użyć czytnika linii papilarnych"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Odwiedź serwis."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Nie udało się zarejestrować danych twarzy. Spróbuj ponownie."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nie można utworzyć modelu twarzy. Spróbuj ponownie."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Zbyt jasno. Spróbuj przy słabszym świetle."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Zbyt ciemno. Spróbuj w jaśniejszym świetle."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Odsuń telefon."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Przybliż telefon."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Przesuń telefon wyżej."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Przesuń telefon niżej."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Przesuń telefon w lewo."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Przesuń telefon w prawo."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Spróbuj w jaśniejszym świetle"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Odsuń telefon"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Przybliż telefon"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Przesuń telefon wyżej"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Przesuń telefon niżej"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Przesuń telefon w lewo"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Przesuń telefon w prawo"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Patrz prosto na urządzenie."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Ustaw twarz dokładnie na wprost telefonu."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Nie widzę twarzy. Trzymaj telefon na wysokości oczu."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Telefon się porusza. Trzymaj go nieruchomo."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Zarejestruj swoją twarz ponownie."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Nie można już rozpoznać twarzy. Spróbuj ponownie."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Za mała różnica. Zmień pozycję."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Trochę mniej obróć głowę."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Trochę mniej pochyl głowę."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Trochę mniej obróć głowę."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Nie rozpoznaję twarzy. Spróbuj ponownie."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Lekko zmień położenie głowy"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Patrz prosto na telefon"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Patrz prosto na telefon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Patrz prosto na telefon"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Usuń wszystko, co zasłania Ci twarz."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Wyczyść górną krawędź ekranu, w tym czarny pasek"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Twarz musi być widoczna w całości"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Twarz musi być widoczna w całości"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Nie można utworzyć modelu twarzy. Spróbuj ponownie."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Wykryto ciemne okulary. Twarz musi być widoczna w całości."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Wykryto zasłonę twarzy. Twarz musi być widoczna w całości."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nie można zweryfikować twarzy. Sprzęt niedostępny."</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 72b77f16aa58..618558e62ebd 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueio por impressão digital"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Não foi possível usar o sensor de impressão digital"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Entre em contato com uma assistência técnica."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Dados precisos não capturados. Tente novamente."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Falha ao criar o modelo de rosto. Tente de novo."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Muito iluminado. Diminua a iluminação."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Muito escuro. Use uma iluminação mais clara."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Afaste o smartphone."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Aproxime o smartphone."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Mova o smartphone para cima."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Mova o smartphone para baixo."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Mova o smartphone para a esquerda."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Mova o smartphone para a direita."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Use uma iluminação mais intensa"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Afaste o smartphone"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Aproxime o smartphone do seu rosto"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Mova o smartphone para cima"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Mova o smartphone para baixo"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Mova o smartphone para a esquerda"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Mova o smartphone para a direita"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Olhe mais diretamente para o dispositivo."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Deixe o rosto diretamente na frente do smartphone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Rosto não detectado. Segure o smartphone na altura dos olhos."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Muito movimento. Não mova o smartphone."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Registre seu rosto novamente."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"O rosto não é mais reconhecido. Tente novamente."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Muito parecido, mude de posição."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Incline a cabeça um pouco menos."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Incline a cabeça um pouco menos."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Incline a cabeça um pouco menos."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Não foi possível reconhecer o rosto. Tente de novo."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Mude a posição da cabeça ligeiramente"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Olhe diretamente para o smartphone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Olhe diretamente para o smartphone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Olhe diretamente para o smartphone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Remova tudo que esteja ocultando seu rosto."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Limpe a parte superior da tela, inclusive a barra preta"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Seu rosto precisa estar completamente visível"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Seu rosto precisa estar completamente visível"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Falha ao criar o modelo de rosto. Tente de novo."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Óculos escuros detectados. Seu rosto precisa estar completamente visível."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Máscara detectada. Seu rosto precisa estar completamente visível."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Impossível verificar rosto. Hardware indisponível."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 85b37c004684..8ea6b0cc7c98 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueio por impressão digital"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Não é possível utilizar o sensor de impressões digitais"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visite um fornecedor de serviços de reparação."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Imp. capt. dados rosto precisos. Tente novamente."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Impossível criar modelo de rosto. Tente novamente."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Demasiado clara. Experimente uma luz mais suave."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Demasiado escura. Experimente local com mais luz."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Afaste ainda mais o telemóvel."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Aproxime o telemóvel."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Mova o telemóvel mais para cima."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Mova o telemóvel mais para baixo."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Mova o telemóvel para a esquerda."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Mova o telemóvel para a direita."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Experimente um local com mais luz"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Afaste ainda mais o telemóvel"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Aproxime o telemóvel do rosto"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Mova o telemóvel mais para cima"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Mova o telemóvel mais para baixo"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Mova o telemóvel para a sua esquerda"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Mova o telemóvel para a sua direita"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Olhe mais diretamente para o dispositivo."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Posicione o rosto em frente ao telemóvel."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Não é possível ver o seu rosto. Mantenha o telemóvel ao nível dos olhos."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Demasiado movimento. Mantenha o telemóvel firme."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Volte a inscrever o rosto."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Impossível reconhecer o rosto. Tente novamente."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Muito parecida, mude de pose."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Rode a cabeça um pouco menos."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Incline a cabeça um pouco menos."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Rode a cabeça um pouco menos."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Impossível reconhecer o rosto. Tente novamente."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Altere ligeiramente a posição da sua cabeça"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Olhe mais diretamente para o telemóvel"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Olhe mais diretamente para o telemóvel"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Olhe mais diretamente para o telemóvel"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Remova tudo o que esteja a ocultar o seu rosto."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Limpe a parte superior do ecrã, incluindo a barra preta."</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"O seu rosto tem de estar completamente visível"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"O seu rosto tem de estar completamente visível"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Não é possível criar o seu modelo de rosto. Tente novamente."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Óculos escuros detetados. O seu rosto tem de estar completamente visível."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Cobertura facial detetada. O seu rosto tem de estar completamente visível."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Não pode validar o rosto. Hardware não disponível."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 72b77f16aa58..618558e62ebd 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueio por impressão digital"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Não foi possível usar o sensor de impressão digital"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Entre em contato com uma assistência técnica."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Dados precisos não capturados. Tente novamente."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Falha ao criar o modelo de rosto. Tente de novo."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Muito iluminado. Diminua a iluminação."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Muito escuro. Use uma iluminação mais clara."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Afaste o smartphone."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Aproxime o smartphone."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Mova o smartphone para cima."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Mova o smartphone para baixo."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Mova o smartphone para a esquerda."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Mova o smartphone para a direita."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Use uma iluminação mais intensa"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Afaste o smartphone"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Aproxime o smartphone do seu rosto"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Mova o smartphone para cima"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Mova o smartphone para baixo"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Mova o smartphone para a esquerda"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Mova o smartphone para a direita"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Olhe mais diretamente para o dispositivo."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Deixe o rosto diretamente na frente do smartphone."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Rosto não detectado. Segure o smartphone na altura dos olhos."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Muito movimento. Não mova o smartphone."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Registre seu rosto novamente."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"O rosto não é mais reconhecido. Tente novamente."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Muito parecido, mude de posição."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Incline a cabeça um pouco menos."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Incline a cabeça um pouco menos."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Incline a cabeça um pouco menos."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Não foi possível reconhecer o rosto. Tente de novo."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Mude a posição da cabeça ligeiramente"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Olhe diretamente para o smartphone"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Olhe diretamente para o smartphone"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Olhe diretamente para o smartphone"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Remova tudo que esteja ocultando seu rosto."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Limpe a parte superior da tela, inclusive a barra preta"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Seu rosto precisa estar completamente visível"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Seu rosto precisa estar completamente visível"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Falha ao criar o modelo de rosto. Tente de novo."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Óculos escuros detectados. Seu rosto precisa estar completamente visível."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Máscara detectada. Seu rosto precisa estar completamente visível."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Impossível verificar rosto. Hardware indisponível."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index b8d8f648dff0..c9f55d453b2e 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Deblocare cu amprenta"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Nu se poate folosi senzorul de amprentă"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Vizitează un furnizor de servicii de reparații."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Nu s-a putut fotografia fața cu precizie. Încearcă din nou."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Nu se poate crea modelul facial. Reîncearcă."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Prea luminos. Încearcă o lumină mai slabă."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Prea întunecat. Încearcă o lumină mai puternică."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Mută telefonul mai departe."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Mută telefonul mai aproape."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Mută telefonul mai sus."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Mută telefonul mai jos."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Mută telefonul spre stânga."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Mută telefonul spre dreapta."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Încearcă o lumină mai puternică"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Mută telefonul mai departe"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Mută telefonul mai aproape"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Mută telefonul mai sus"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Mută telefonul mai jos"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Mută telefonul spre stânga"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Mută telefonul spre dreapta"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Privește mai direct spre dispozitiv."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Stai cu capul direct în fața telefonului."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Nu ți se vede fața. Ține telefonul la nivelul ochilor."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Prea multă mișcare. Ține telefonul nemișcat."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Reînregistrează-ți chipul."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Nu se mai poate recunoaște fața. Încearcă din nou."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Prea asemănător, schimbă poziția."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Întoarce capul mai puțin."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Înclină capul mai puțin."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Întoarce capul mai puțin."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Chipul nu a fost recunoscut. Reîncearcă."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Schimbă ușor poziția capului"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Priviți direct spre telefon"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Privește mai direct spre telefon"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Privește mai direct spre telefon"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Îndepărtează orice îți ascunde chipul."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Curăță partea de sus a ecranului, inclusiv bara neagră"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Chipul trebuie să fie vizibil în totalitate"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Chipul trebuie să fie vizibil în totalitate"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Nu se poate crea modelul facial. Reîncearcă."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"S-au detectat ochelari de culoare închisă. Chipul trebuie să fie vizibil în totalitate."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"S-a detectat un articol care acoperă chipul. Chipul trebuie să fie vizibil în totalitate."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nu se poate confirma fața. Hardware-ul nu este disponibil."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 92f80ef08c79..aa83144868c4 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -636,26 +636,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Разблокировка по отпечатку пальца"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Невозможно использовать сканер отпечатков пальцев"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Обратитесь в сервисный центр."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Не удалось собрать данные. Повторите попытку."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Невозможно создать модель лица. Повторите попытку."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Слишком светло. Сделайте освещение менее ярким."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Слишком темно. Сделайте освещение ярче"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Переместите телефон дальше."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Переместите телефон ближе."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Переместите телефон выше."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Переместите телефон ниже."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Переместите телефон влево."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Переместите телефон вправо."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Сделайте освещение ярче"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Переместите телефон дальше от лица"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Переместите телефон ближе к лицу"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Переместите телефон выше"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Переместите телефон ниже"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Переместите телефон левее"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Переместите телефон правее"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Смотрите прямо на устройство."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Держите телефон прямо перед лицом."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Вашего лица не видно. Держите телефон на уровне глаз"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Не перемещайте устройство. Держите его неподвижно."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Повторите попытку."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Не удалось распознать лицо. Повторите попытку."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Слишком похожее выражение лица. Измените позу."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Держите голову ровнее."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Не наклоняйте голову слишком сильно."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Держите голову ровнее."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Не удалось распознать лицо. Повторите попытку."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Немного измените положение головы"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Смотрите прямо на телефон"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Смотрите прямо на телефон"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Смотрите прямо на телефон"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Ваше лицо плохо видно"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Протрите верхнюю часть экрана (в том числе черную панель)."</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Лицо должно быть полностью видно"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Лицо должно быть полностью видно"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Невозможно создать модель лица. Повторите попытку."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Обнаружены темные очки. Лицо должно быть полностью видно"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Часть лица закрыта. Оно должно быть полностью видно."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Не удалось распознать лицо. Сканер недоступен."</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index f0cde1dad419..e8d2be9a87cf 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ඇඟිලි සලකුණු අගුළු හැරීම"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"ඇඟිලි සලකුණු සංවේදකය භාවිත කළ නොහැකිය"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"අළුත්වැඩියා සැපයුම්කරුවෙකු බලන්න."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"නිරවද්ය මුහුණු දත්ත ගත නොහැකි විය. නැවත උත්සාහ කරන්න."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"ඔබගේ මුහුණු ආකෘතිය තැනිය නොහැකිය. නැවත උත්සාහ කරන්න."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"දීප්තිය වැඩියි. තවත් මඳ ආලෝකය උත්සාහ කරන්න."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"ඉතා අඳුරුයි. තවත් දීප්තිමත් ආලෝකය උත්සාහ කරන්න."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"දුරකථනය තවත් දුරට ගෙන යන්න."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"දුරකථනය තවත් සමීපව ගෙන යන්න."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"දුරකථනය ඉහළට ගෙන යන්න."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"දුරකථනය පහළට ගෙන යන්න."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"දුරකථනය වමට ගෙන යන්න."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"දුරකථනය දකුණට ගෙන යන්න."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"තවත් දීප්තිමත් ආලෝකය උත්සාහ කරන්න"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"දුරකථනය තවත් ඈතට ගෙන යන්න"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"දුරකථනය තවත් සමීපයට ගෙන එන්න"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"දුරකථනය තවත් ඉහළට ගෙන යන්න"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"දුරකථනය තවත් පහළට ගෙන යන්න"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"දුරකථනය ඔබගේ වම් පසට ගෙන යන්න"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"දුරකථනය ඔබගේ දකුණු පසට ගෙන යන්න"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"ඔබේ උපාංගය වෙත තවත් ඍජුව බලන්න."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"ඔබේ මුහුණ දුරකථනයට සෘජුවම ඉදිරියෙන් ස්ථානගත කරන්න."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"ඔබගේ මුහුණ දැකිය නොහැකිය. ඔබගේ දුරකථනය ඇස් මට්ටමින් අල්ලා ගන්න."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"චලනය ඉතා වැඩියි. දුරකථනය ස්ථිරව අල්ලා සිටින්න."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"තවදුරටත් මුහුණ හඳුනාගත නොහැක. නැවත උත්සාහ කරන්න."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ඉතා සමානයි, ඔබේ හැඩ ගැසීම වෙනස් කරන්න."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"ඔබේ හිස ටිකක් අඩුවෙන් කරකවන්න."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"ඔබගේ හිස ටිකක් අඩුවෙන් ඇල කරන්න."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"ඔබේ හිස ටිකක් අඩුවෙන් කරකවන්න."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"මුහුණ හඳුනා ගත නොහැකිය. නැවත උත්සාහ කරන්න."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"ඔබගේ හිසෙහි පිහිටීම මදක් වෙනස් කරන්න"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"ඔබගේ දුරකථනය දෙස වඩාත් ඍජුව බලන්න"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"ඔබගේ දුරකථනය දෙස වඩාත් ඍජුව බලන්න"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"ඔබගේ දුරකථනය දෙස වඩාත් ඍජුව බලන්න"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"ඔබේ මුහුණ සඟවන කිසිවක් ඉවත් කරන්න."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"කලු තීරුව ඇතුළුව, ඔබේ තිරයෙහි මුදුන පිරිසිදු කරන්න"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"ඔබගේ මුහුණ සම්පූර්ණයෙන් දෘශ්යමාන විය යුතුය"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"ඔබගේ මුහුණ සම්පූර්ණයෙන් දෘශ්යමාන විය යුතුය"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"ඔබගේ මුහුණු ආකෘතිය තැනිය නොහැකිය. නැවත උත්සාහ කරන්න."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"අඳුරු කණ්ණාඩි අනාවරණය කර ගන්නා ලදි. ඔබගේ මුහුණ සම්පූර්ණයෙන් දෘශ්යමාන විය යුතුය."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"මුහුණු ආවරණය අනාවරණය කර ගන්නා ලදි. ඔබගේ මුහුණ සම්පූර්ණයෙන් දෘශ්යමාන විය යුතුය."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"මුහුණ සත්යාපනය කළ නොහැක. දෘඩාංගය නොමැත."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index b5b6e0fee962..50f6846dc942 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -636,26 +636,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odomknutie odtlačkom prsta"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Senzor odtlačkov prstov nie je možné používať"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Navštívte poskytovateľa opráv."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Nepodarilo sa nasnímať presné údaje o tvári. Skúste to znova."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Model tváre sa nedá vytvoriť. Skúste to znova."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Príliš veľa svetla. Skúste jemnejšie osvetlenie."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Príliš veľká tma. Skúste lepšie osvetlenie."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Oddiaľte telefón."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Priblížte telefón."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Posuňte telefón vyššie."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Posuňte telefón nižšie."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Posuňte telefón doľava."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Posuňte telefón doprava."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Skúste lepšie osvetlenie"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Oddiaľte telefón"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Priblížte telefón"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Posuňte telefón vyššie"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Posuňte telefón nižšie"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Posuňte telefón doľava"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Posuňte telefón doprava"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Pozrite sa priamejšie na zariadenie."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Umiestnite svoju tvár priamo pred telefón."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Nie je vidieť vašu tvár. Držte telefón na úrovni očí."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Priveľa pohybu. Nehýbte telefónom."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Znova zaregistrujte svoju tvár."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Tvár už nie je možné rozpoznať. Skúste to znova."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Príliš rovnaké, zmeňte postoj."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Otočte hlavu o niečo menej."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Nakloňte hlavu trocha menej."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Otočte hlavu o niečo menej."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Tvár sa nedá rozpoznať. Skúste to znova."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Trocha zmeňte pozíciu hlavy"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Pozrite sa na telefón priamejšie"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Pozrite sa na telefón priamejšie"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Pozrite sa na telefón priamejšie"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Odstráňte všetko, čo vám zakrýva tvár."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Vyčistite hornú časť obrazovky vrátane čierneho panela"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Musí vám byť vidieť celú tvár"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Musí vám byť vidieť celú tvár"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Model tváre sa nedá vytvoriť. Skúste to znova."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Boli rozpoznané tmavé okuliare. Musí vám byť vidieť celú tvár."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Bolo rozpoznané rúško. Musí vám byť vidieť celú tvár."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Tvár sa nedá overiť. Hardvér nie je k dispozícii."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 9a2941f7ce54..fd1070c59a64 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -636,26 +636,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odklepanje s prstnim odtisom"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Tipala prstnih odtisov ni mogoče uporabiti"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Obiščite ponudnika popravil."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Točnih podatkov o obrazu ni bilo mogoče zajeti. Poskusite znova."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Modela obraza ni mogoče ustvariti. Poskusite znova."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Presvetlo. Poskusite z blažjo osvetlitvijo."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Pretemno. Poskusite z močnejšo osvetlitvijo."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Telefon nekoliko odmaknite."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Bolj približajte telefon."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Telefon pomaknite višje."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Telefon premaknite nižje."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Telefon premaknite v levo."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Telefon premaknite v desno."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Poskusite z močnejšo osvetlitvijo."</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Telefon nekoliko odmaknite."</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Bolj približajte telefon."</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Telefon premaknite višje."</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Telefon premaknite nižje."</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Telefon premaknite v svojo levo."</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Telefon premaknite v svojo desno."</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Glejte bolj naravnost v napravo."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Obraz nastavite naravnost pred telefon."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Obraz ni viden. Držite telefon v višini oči."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Preveč se premikate. Držite telefon pri miru."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Znova registrirajte svoj obraz."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Obraza ni več mogoče prepoznati. Poskusite znova."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Preveč podobno, spremenite položaj."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Glejte malce bolj naravnost."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Obraz nastavite bolj naravnost."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Glejte malce bolj naravnost."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Obraza ni mogoče prepoznati. Poskusite znova."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Nekoliko spremenite položaj glave."</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Glejte bolj naravnost v telefon."</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Glejte bolj naravnost v telefon."</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Glejte bolj naravnost v telefon."</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Umaknite vse, kar vam morda zakriva obraz."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Očistite vrhnji del zaslona, vključno s črno vrstico"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Videti se mora cel obraz."</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Videti se mora cel obraz."</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Modela obraza ni mogoče ustvariti. Poskusite znova."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Zaznana so temna očala. Videti se mora cel obraz."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Zaznano je, da je obraz prekrit. Videti se mora cel obraz."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Obraza ni mogoče preveriti. Str. opr. ni na voljo."</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index acd4b4415b23..41efa8d79e3c 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Shkyçja me gjurmën e gishtit"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Sensori i gjurmës së gishtit nuk mund të përdoret"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Vizito një ofrues të shërbimit të riparimit."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"S\'mund të regjistroheshin të dhëna të sakta të fytyrës. Provo përsëri."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Modeli i fytyrës nuk krijohet. Provo sërish."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Me shumë ndriçim. Provo një ndriçim më të butë."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Shumë i errët. Provo një ndriçim më të fortë."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Lëvize telefonin më larg."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Afroje telefonin."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Ngrije telefonin më lart."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Ule telefonin më poshtë."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Lëvize telefonin majtas."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Lëvize telefonin djathtas"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Provo një ndriçim më të fortë"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Lëvize telefonin më larg"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Lëvize telefonin më afër"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Lëvize telefonin më lart"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Lëvize telefonin më poshtë"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Lëvize telefonin në të majtën tënde"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Lëvize telefonin në të djathtën tënde"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Shiko më drejt në pajisjen tënde."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Pozicionoje fytyrën tënde direkt përpara telefonit."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Fytyra jote nuk mund të shihet. Mbaje telefonin në nivelin e syve."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Ka shumë lëvizje. Mbaje telefonin të palëvizur."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Regjistroje përsëri fytyrën tënde."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Fytyra nuk mund të njihet më. Provo përsëri."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Tepër e ngjashme, ndrysho pozën"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Ktheje kokën pak më pak."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Anoje kokën më pak."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Ktheje kokën pak më pak."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Fytyra nuk mund të njihet. Provo sërish."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Ndrysho pak pozicionin e kokës"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Shiko më drejtpërdrejt telefonin"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Shiko më drejtpërdrejt telefonin"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Shiko më drejtpërdrejt telefonin"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Hiq gjithçka që fsheh fytyrën tënde."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Pastro kreun e ekranit, duke përfshirë shiritin e zi"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Fytyra jote duhet të jetë plotësisht e dukshme"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Fytyra jote duhet të jetë plotësisht e dukshme"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Modeli i fytyrës nuk krijohet. Provo sërish."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"U zbuluan syze të errëta. Fytyra jote duhet të jetë plotësisht e dukshme."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"U zbulua mbulim i fytyrës. Fytyra jote duhet të jetë plotësisht e dukshme."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Fytyra s\'mund të verifikohet. Hardueri nuk ofrohet."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 5586cfe4479e..8c6689ac9c7e 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -635,26 +635,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Откључавање отиском прста"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Не можете да користите сензор за отисак прста"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Посетите добављача за поправке."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Снимање лица није успело. Пробајте поново."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Прављење модела лица није успело. Пробајте поново."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Превише је светло. Пробајте са слабијим осветљењем."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Претамно је. Пробајте са јачим осветљењем."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Удаљите телефон."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Приближите телефон."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Померите телефон нагоре."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Померите телефон надоле."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Померите телефон улево."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Померите телефон удесно."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Пробајте са јачим осветљењем"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Удаљите телефон"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Приближите телефон"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Померите телефон нагоре"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Померите телефон надоле"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Померите телефон улево"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Померите телефон удесно"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Гледајте право у уређај."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Поставите лице директно испред телефона"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Не види се лице. Држите телефон у висини очију."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Много се померате. Држите телефон мирно."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Поново региструјте лице."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Више не може да се препозна лице. Пробајте поново."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Превише је слично, промените позу."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Мало мање померите главу."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Мало мање нагните главу."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Мало мање померите главу."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Лице није препознато. Пробајте поново."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Мало померите главу"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Гледајте право у телефон"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Гледајте право у телефон"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Гледајте право у телефон"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Уклоните све што вам заклања лице."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Очистите горњи део екрана, укључујући црну траку"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Лице мора да буде потпуно видљиво"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Лице мора да буде потпуно видљиво"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Прављење модела лица није успело. Пробајте поново."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Откривене су тамне наочари. Лице мора да буде потпуно видљиво."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Откривено је прекривање лица. Лице мора да буде потпуно видљиво."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Провера лица није успела. Хардвер није доступан."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 01231bb4afaf..92d1ee71c165 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingeravtryckslås"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Det går inte att använda fingeravtryckssensorn"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Besök ett reparationsställe."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Det gick inte att fånga ansiktsdata. Försök igen."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Ansiktsmodellen kunde inte skapas. Försök igen."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Det är för ljust. Testa lägre belysning."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Det är för mörkt. Testa med bättre belysning."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Flytta telefonen längre bort."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"För mobilen närmare."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Höj mobilen."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Sänk mobilen."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Flytta mobilen åt vänster."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Flytta mobilen åt höger."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Testa med bättre belysning"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Flytta telefonen längre bort"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"För telefonen närmare"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Höj telefonen"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Sänk telefonen"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Flytta telefonen åt vänster"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Flytta telefonen åt höger"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Titta rakt på enheten."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Ha ansiktet direkt framför telefonen."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Ansiktet syns inte. Håll telefonen i ögonhöjd."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"För mycket rörelse. Håll mobilen stilla."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Registrera ansiktet på nytt."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Ansiktet kan inte längre kännas igen. Försök igen."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"För likt. Ändra ansiktsposition."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Vrid mindre på huvudet."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Vinkla huvudet mindre."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Vrid mindre på huvudet."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Ansiktet kändes inte igen. Försök igen."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Rör lite på huvudet"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Titta rakt på telefonen"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Titta rakt på telefonen"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Titta rakt på telefonen"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Ta bort allt som täcker ansiktet."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Rengör skärmens överkant, inklusive det svarta fältet"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Hela ansiktet måste synas"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Hela ansiktet måste synas"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Ansiktsmodellen kunde inte skapas. Försök igen."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Mörka glasögon identifierades. Hela ansiktet måste synas."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Något som täcker ansiktet identifierades. Hela ansiktet måste synas."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ansiktsverifiering går ej. Otillgänglig maskinvara."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index a8e75df758fb..49e201294d14 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Kufungua kwa Alama ya Kidole"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Imeshindwa kutumia kitambua alama ya kidole"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Tembelea mtoa huduma za urekebishaji."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Imeshindwa kunasa data sahihi ya uso. Jaribu tena."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Imeshindwa kuunda muundo wa uso wako. Jaribu tena."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Inang\'aa mno. Jaribu mwangaza hafifu"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Hakuna mwangaza wa kutosha. Jaribu kuongeza mwangaza."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Sogeza simu mbali kiasi."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Sogeza simu karibu."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Sogeza simu juu zaidi."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Sogeza simu chini."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Sogeza simu upande wa kushoto."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Sogeza simu upande wa kulia."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Jaribu kuongeza mwangaza"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Sogeza simu mbali kiasi"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Sogeza simu karibu"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Sogeza simu juu zaidi"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Sogeza simu chini"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Sogeza simu upande wako wa kushoto"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Sogeza simu upande wako wa kulia"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Tafadhali angalia kifaa chako moja kwa moja."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Weka uso wako moja kwa moja mbele ya simu."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Imeshindwa kuona uso wako. Shikilia simu yako ikilingana na macho."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Inatikisika sana. Ishike simu iwe thabiti."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Tafadhali sajili uso wako tena."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Haiwezi tena kutambua uso. Jaribu tena."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Inafanana sana, tafadhali badilisha mkao wako."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Geuza kichwa chako kidogo."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Inamisha kichwa chako kiasi."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Geuza kichwa chako kidogo."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Imeshindwa kutambua uso. Jaribu tena."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Badilisha nafasi ya kichwa chako kidogo"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Angalia simu yako moja kwa moja"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Angalia simu yako moja kwa moja"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Angalia simu yako moja kwa moja"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Ondoa kitu chochote kinachoficha uso wako."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Safisha sehemu ya juu ya skrini yako, ikiwa ni pamoja na upau mweusi"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Ni lazima uso wako wote uonekane"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Ni lazima uso wako wote uonekane"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Imeshindwa kuunda muundo wa uso wako. Jaribu tena."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Vioo vyeusi vimetambuliwa. Ni lazima uso wako wote uonekane."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Kifuniko cha uso kimetambuliwa. Ni lazima uso wako wote uonekane."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imeshindwa kuthibitisha uso. Maunzi hayapatikani."</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 6c889f9a2378..f657bd7620b5 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"கைரேகை அன்லாக்"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"கைரேகை சென்சாரைப் பயன்படுத்த முடியவில்லை"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"பழுதுபார்ப்புச் சேவை வழங்குநரைத் தொடர்புகொள்ளவும்."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"முகம் தெளிவாகப் பதிவாகவில்லை. மீண்டும் முயலவும்."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"முகத் தோற்றம் பதிவாகவில்லை. மீண்டும் முயலவும்."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"அதிக ஒளிர்வு. மிதமான ஒளியில் முயலவும்."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"இருட்டாக உள்ளது. பிரகாசமான ஒளியில் முயலவும்."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"மொபைலை முகத்தில் இருந்து தள்ளிப் பிடிக்கவும்."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"மொபைலை அருகில் நகர்த்தவும்."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"மொபைலை மேலே நகர்த்தவும்."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"மொபைலைக் கீழே நகர்த்தவும்."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"மொபைலை இடப்புறம் நகர்த்தவும்."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"மொபைலை வலப்புறம் நகர்த்தவும்."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"பிரகாசமான ஒளியில் முயலவும்"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"மொபைலை முகத்தில் இருந்து தள்ளிப் பிடிக்கவும்"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"மொபைலை அருகில் நகர்த்தவும்"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"மொபைலை மேலே நகர்த்தவும்"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"மொபைலைக் கீழே நகர்த்தவும்"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"மொபைலை இடதுபுறம் நகர்த்தவும்"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"மொபைலை வலதுபுறம் நகர்த்தவும்"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"முழுமுகம் தெரியுமாறு நேராகப் பார்க்கவும்."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"முகத்தை மொபைலுக்கு நேராக வைக்கவும்."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"முகம் சரியாகத் தெரியவில்லை. மொபைலைக் கண்களுக்கு நேராகப் பிடிக்கவும்."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"அதிகமாக அசைகிறது. மொபைலை அசைக்காமல் பிடிக்கவும்."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"உங்கள் முகத்தை மீண்டும் பதிவுசெய்யுங்கள்."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"முகத்தைக் கண்டறிய இயலவில்லை. மீண்டும் முயலவும்."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"மீண்டும் அதே போஸ் தருகிறீர்கள், வேறு முயலுங்கள்."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"தலையை லேசாகத் திருப்பவும்."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"உங்கள் தலையை லேசாகச் சாய்க்கவும்."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"உங்கள் தலையைச் சற்றுத் திருப்பவும்."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"முகத்தை அடையாளம் காண இயலவில்லை. மீண்டும் முயலவும்."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"தலையின் நிலையைச் சிறிதளவு மாற்றவும்"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"உங்கள் மொபைலை நேராகப் பார்க்கவும்"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"உங்கள் மொபைலை நேராகப் பார்க்கவும்"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"உங்கள் மொபைலை நேராகப் பார்க்கவும்"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"உங்கள் முகத்தை மறைக்கும் அனைத்தையும் நீக்குக."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"திரையையும் அதிலுள்ள கருப்புப் பட்டியையும் சுத்தம் செய்யவும்"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"உங்கள் முகத்தை முழுமையாகக் காட்டவும்"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"உங்கள் முகத்தை முழுமையாகக் காட்டவும்"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"முகத் தோற்றம் பதிவாகவில்லை. மீண்டும் முயலவும்."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"அடர் நிறக் கண்ணாடிகள் கண்டறியப்பட்டுள்ளது. உங்கள் முகத்தை முழுமையாகக் காட்டவும்."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"முகம் மறைக்கப்பட்டுள்ளது. உங்கள் முகத்தை முழுமையாகக் காட்டவும்."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"முகத்தைச் சரிபார்க்க இயலவில்லை. வன்பொருள் இல்லை."</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index e576522b0940..f46f36da704d 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"వేలిముద్ర అన్లాక్"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"వేలిముద్ర సెన్సార్ను ఉపయోగించడం సాధ్యం కాదు"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"రిపెయిర్ ప్రొవైడర్ను సందర్శించండి."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"ముఖం డేటా సరిగ్గా రాలేదు. మళ్లీ ప్రయత్నించండి."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"మీ ఫేస్మోడల్ క్రియేషన్ కుదరదు. మళ్లీ ట్రై చేయండి."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"వెలుతురు అధికంగా ఉంది. తక్కువ ఉండేలా చూడండి."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"చాలా చీకటిగా ఉంది. బాగా వెలుతురులో ప్రయత్నించండి."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"ఫోన్ను కాస్త దూరంగా పట్టుకోండి."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"ఫోన్ను దగ్గరగా పట్టుకోండి"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ఫోన్ను పైకి పట్టుకోండి."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ఫోన్ను కిందికి దించండి."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"ఫోన్ను ఎడమవైపునకు జరపండి."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"ఫోన్ను కుడివైపునకు జరపండి."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"ప్రకాశవంతమైన లైటింగ్లో ట్రై చేయండి"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ఫోన్ను కాస్త దూరంగా జరపండి"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ఫోన్ను దగ్గరగా పట్టుకోండి"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ఫోన్ను పైకి పట్టుకోండి"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ఫోన్ను కిందికి దించండి"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"ఫోన్ను మీ ఎడమ వైపునకు జరపండి"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"ఫోన్ను మీ కుడి వైపునకు జరపండి"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"దయచేసి మీ పరికరం వైపు మరింత నేరుగా చూడండి."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"మీ ముఖాన్ని ఫోన్కు ఎదురుగా ఉంచండి."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"మీ ముఖం కనిపించడం లేదు. మీ ఫోన్ను కంటి స్థాయిలో పట్టుకోండి."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"బాగా కదుపుతున్నారు. ఫోన్ను స్థిరంగా పట్టుకోండి"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"దయచేసి మీ ముఖాన్ని మళ్లీ నమోదు చేయండి."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"ఇక ముఖం గుర్తించలేదు. మళ్లీ ప్రయత్నించండి."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ఒకే మాదిరిగా ఉంది, దయచేసి భంగిమను మార్చండి."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"మీ తలను ఇంకాస్త తక్కువ తిప్పండి."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"మీ తలను కొంచెం తక్కువగా వంపండి."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"మీ తలను ఎడమ/కుడి వైపుగా ఇంకాస్త తిప్పండి."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"ముఖం గుర్తించబడలేదు. మళ్లీ ట్రై చేయండి."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"మీ తల స్థానాన్ని కొద్దిగా మార్చండి"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"మీ ఫోన్ వైపు మరింత నేరుగా చూడండి"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"మీ ఫోన్ వైపు మరింత నేరుగా చూడండి"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"మీ ఫోన్ వైపు మరింత నేరుగా చూడండి"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"మీ ముఖానికి అడ్డుగా ఉన్నవాటిని తీసివేయండి."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"నల్లని బార్తో సహా మీ స్క్రీన్ పైభాగం అంతటినీ శుభ్రంగా తుడవండి"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"మీ ముఖం పూర్తిగా కనిపించాలి"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"మీ ముఖం పూర్తిగా కనిపించాలి"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"మీ ఫేస్మోడల్ క్రియేషన్ కుదరదు. మళ్లీ ట్రై చేయండి."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"డార్క్ గ్లాసెస్ గుర్తించబడ్డాయి. మీ ముఖం పూర్తిగా కనిపించాలి."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ముఖం కవర్ చేయబడింది. మీ ముఖం పూర్తిగా కనిపించాలి."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"ముఖం ధృవీకరించలేరు. హార్డ్వేర్ అందుబాటులో లేదు."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 947b3acfc52a..90ba61358faa 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ปลดล็อกด้วยลายนิ้วมือ"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"ใช้เซ็นเซอร์ลายนิ้วมือไม่ได้"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"โปรดติดต่อผู้ให้บริการซ่อม"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"บันทึกข้อมูลใบหน้าที่ถูกต้องไม่ได้ ลองอีกครั้ง"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"สร้างรูปแบบใบหน้าไม่ได้ โปรดลองอีกครั้ง"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"สว่างเกินไป ลองหาตำแหน่งที่แสงน้อยกว่านี้"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"มืดเกินไป ลองหาตำแหน่งที่สว่างขึ้น"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"เลื่อนโทรศัพท์ออกไปไกลกว่านี้"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"เลื่อนโทรศัพท์เข้าไปใกล้กว่านี้"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"ยกโทรศัพท์ให้สูงขึ้น"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"ถือโทรศัพท์ให้ต่ำลง"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"เลื่อนโทรศัพท์ไปทางซ้าย"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"เลื่อนโทรศัพท์ไปทางขวา"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"ลองหาตำแหน่งที่สว่างขึ้น"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"ถือโทรศัพท์ให้ห่างกว่านี้"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"ถือโทรศัพท์ให้ใกล้กว่านี้"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"ยกโทรศัพท์ให้สูงขึ้น"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"ถือโทรศัพท์ให้ต่ำลง"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"เลื่อนโทรศัพท์ไปทางซ้าย"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"เลื่อนโทรศัพท์ไปทางขวา"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"โปรดมองตรงมาที่อุปกรณ์"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"หันหน้าให้ตรงกับโทรศัพท์"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"ไม่เห็นใบหน้า ถือโทรศัพท์ไว้ที่ระดับสายตา"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"มีการเคลื่อนไหวมากเกินไป ถือโทรศัพท์นิ่งๆ"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"โปรดลงทะเบียนใบหน้าอีกครั้ง"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"จำใบหน้าไม่ได้แล้ว ลองอีกครั้ง"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"ใกล้เคียงเกินไป โปรดเปลี่ยนท่าโพส"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"จัดตำแหน่งศีรษะให้ตรง"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"ปรับมุมศีรษะให้ตรง"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"จัดตำแหน่งศีรษะให้ตรง"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"ไม่รู้จักใบหน้า โปรดลองอีกครั้ง"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"เปลี่ยนตำแหน่งของศีรษะเล็กน้อย"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"โปรดมองตรงมาที่โทรศัพท์"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"โปรดมองตรงมาที่โทรศัพท์"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"โปรดมองตรงมาที่โทรศัพท์"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"เอาสิ่งที่ปิดบังใบหน้าออก"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"ทำความสะอาดด้านบนของหน้าจอ รวมถึงแถบสีดำ"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"ต้องมองเห็นใบหน้าของคุณทั้งหมด"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"ต้องมองเห็นใบหน้าของคุณทั้งหมด"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"สร้างรูปแบบใบหน้าไม่ได้ โปรดลองอีกครั้ง"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"ตรวจพบแว่นตาดำ ต้องมองเห็นใบหน้าของคุณทั้งหมด"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"ตรวจพบหน้ากากอนามัย ต้องมองเห็นใบหน้าของคุณทั้งหมด"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"ยืนยันใบหน้าไม่ได้ ฮาร์ดแวร์ไม่พร้อมใช้งาน"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 5179d3eaa40d..be0be63022dd 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Pag-unlock Gamit ang Fingerprint"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Hindi magamit ang sensor para sa fingerprint"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Bumisita sa provider ng pag-aayos."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Hindi makakuha ng tamang face data. Subukang muli."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Hindi magawa ang iyong face model. Subukan ulit."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Masyadong maliwanag. Subukang bawasan ang liwanag."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Masyadong madilim. Subukan sa mas maliwanag."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Ilayo pa ang telepono."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Ilapit pa ang telepono."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Itaas pa ang telepono."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Ibaba pa ang telepono."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Igalaw ang telepono pakaliwa."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Igalaw ang telepono pakanan."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Subukan sa mas maliwanag"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Ilayo pa ang telepono"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Ilapit pa ang telepono"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Itaas pa ang telepono"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Ibaba pa ang telepono"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Iusog pakaliwa ang telepono mo"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Iusog pakanan ang telepono mo"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Tumingin nang mas direkta sa iyong device."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Itapat ang mukha mo sa mismong harap ng telepono."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Hindi makita ang mukha mo. Hawakan ang telepono mo nang kapantay ng mata."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Masyadong magalaw. Hawakang mabuti ang telepono."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Paki-enroll muli ang iyong mukha."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Hindi na makilala ang mukha. Subukang muli."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Masyadong magkatulad, pakibago ang pose mo."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Huwag masyadong lumingon."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Bawasan ang pag-tilt ng iyong ulo."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Huwag masyadong lumingon."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Hindi makilala ang mukha. Subukan ulit."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Bahagyang baguhin ang posisyon ng iyong ulo"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Tumingin nang mas direkta sa iyong telepono"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Tumingin nang mas direkta sa iyong telepono"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Tumingin nang mas direkta sa iyong telepono"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Alisin ang anumang humaharang sa iyong mukha."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Linisin ang itaas ng iyong screen, kasama ang itim na bar"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Dapat ganap na nakikita ang iyong mukha"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Dapat ganap na nakikita ang iyong mukha"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Hindi magawa ang iyong face model. Subukan ulit."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"May na-detect na madilim na salamin. Dapat ganap na nakikita ang iyong mukha."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"May na-detect na pantakip sa mukha. Dapat ganap na nakikita ang iyong mukha."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Di ma-verify ang mukha. Di available ang hardware."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 6cc8774a0f50..35aa79c88b53 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Parmak İzi Kilidi"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Parmak izi sensörü kullanılamıyor"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Bir onarım hizmeti sağlayıcıyı ziyaret edin."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Doğru yüz verileri yakalanamadı. Tekrar deneyin."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Yüzünüzün modeli oluşturulamıyor. Tekrar deneyin."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Çok parlak. Parlaklığı daha az bir ışıklandırma deneyin."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Çok karanlık. Daha parlak ışıkta deneyin."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Telefonu uzaklaştırın."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Telefonu yaklaştırın."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Telefonu yukarı kaldırın."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Telefonu aşağı indirin."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Telefonu sola hareket ettirin."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Telefonu sağa hareket ettirin."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Daha parlak ışıkta deneyin"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Telefonu uzaklaştırın"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Telefonu yaklaştırın"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Telefonu daha yukarı kaldırın"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Telefonu daha aşağı indirin"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Telefonu solunuza kaydırın"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Telefonu sağınıza kaydırın"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Lütfen cihazınıza daha doğrudan bakın."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Yüzünüz telefonun tam karşısına gelmelidir."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Yüzünüz görünmüyor. Telefonunuzu göz hizasında tutun."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Çok fazla hareket ediyorsunuz. Telefonu sabit tutun."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Lütfen yüzünüzü yeniden kaydedin."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Yüz artık tanınamıyor. Tekrar deneyin."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Duruşunuz çok benzer, lütfen pozunuzu değiştirin."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Başınızı biraz daha az çevirin."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Başınızı biraz daha az eğin."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Başınızı biraz daha az çevirin."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Yüz tanınamadı. Tekrar deneyin."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Başınızın konumunu hafifçe değiştirin"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Telefonunuza daha doğrudan bakın"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Telefonunuza daha doğrudan bakın"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Telefonunuza daha doğrudan bakın"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Yüzünüzün görünmesini engelleyen şeyleri kaldırın."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Siyah çubuk da dahil olmak üzere ekranınızın üst kısmını temizleyin"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Yüzünüz tamamen görünür olmalıdır"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Yüzünüz tamamen görünür olmalıdır"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Yüzünüzün modeli oluşturulamıyor. Tekrar deneyin."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Koyu renk gözlükler algılandı. Yüzünüz tamamen görünür olmalıdır."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Yüzünüzü kapattığınız algılandı. Yüzünüz tamamen görünür olmalıdır."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Yüz doğrulanamıyor. Donanım kullanılamıyor."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index d393d2d6b161..7519b592c175 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -636,26 +636,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Розблокування відбитком пальця"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Не вдається скористатися сканером відбитків пальців"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Зверніться до постачальника послуг із ремонту."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Не вдалося чітко зняти обличчя. Повторіть спробу."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Модель обличчя не створено. Повторіть спробу."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Занадто яскраво. Потрібно менше світла."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Занадто темно. Потрібно більше світла."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Тримайте телефон далі від обличчя."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Тримайте телефон ближче до обличчя."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Тримайте телефон вище."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Тримайте телефон нижче."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Посуньте телефон лівіше."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Посуньте телефон правіше."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Потрібно більше світла"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Тримайте телефон далі від обличчя"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Тримайте телефон ближче до обличчя"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Підніміть телефон вище"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Опустіть телефон нижче"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Посуньте телефон лівіше"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Посуньте телефон правіше"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Дивіться просто на пристрій."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Тримайте телефон просто перед обличчям."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Обличчя не видно. Утримуйте телефон на рівні очей."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Забагато рухів. Тримайте телефон нерухомо."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Повторно проскануйте обличчя."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Розпізнати обличчя вже не вдається. Повторіть спробу."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Надто схоже на попередню спробу, змініть позу."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Трохи перемістіть обличчя."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Трохи зменште нахил голови."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Трохи поверніть обличчя."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Обличчя не розпізнано. Повторіть спробу."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Трохи змініть положення голови"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Дивіться на телефон прямо"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Дивіться на телефон прямо"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Дивіться на телефон прямо"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Приберіть об’єкти, які затуляють ваше обличчя."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Очистьте верхню частину екрана, зокрема чорну панель"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Обличчя має бути видно повністю"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Обличчя має бути видно повністю"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Не вдається створити модель обличчя. Повторіть спробу."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Виявлено темні окуляри. Обличчя має бути видно повністю."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Виявлено аксесуар, який закриває обличчя. Обличчя має бути видно повністю."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Не вдається перевірити обличчя. Апаратне забезпечення недоступне."</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 1adb937e6fd5..84476f99b9fa 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"فنگر پرنٹ اَن لاک"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"فنگر پرنٹ سینسر کا استعمال نہیں کر سکتے"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ایک مرمت فراہم کنندہ کو ملاحظہ کریں۔"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"چہرے کا درست ڈيٹا کیپچر نہیں ہو سکا۔ پھر آزمائيں۔"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"آپکے چہرے کا ماڈل تخلیق نہیں ہو سکا۔ پھر کوشش کریں۔"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"کافی روشنی ہے۔ ہلکی روشنی میں آزمائیں۔"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"کافی اندھیرا ہے۔ تیز روشنی میں آزمائیں۔"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"فون کو تھوڑا دور کریں۔"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"فون کو تھوڑا قریب کریں۔"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"فون کو تھوڑا اوپر لے جائیں۔"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"فون تھوڑا نیچے کریں۔"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"فون کو بائیں جانب لے جائيں۔"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"فون کو دائیں جانب لے جائیں۔"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"تیز روشنی میں آزمائیں"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"فون کو تھوڑا دور کریں"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"فون کو تھوڑا قریب کریں"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"فون کو تھوڑا اوپر لے جائیں"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"فون تھوڑا نیچے کریں"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"فون کو اپنی بائیں جانب لے جائیں"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"فون کو اپنی دائیں جانب لے جائیں"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"براہ کرم اپنے آلہ کی طرف چہرے کو سیدھا رکھیں۔"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"اپنے چہرے کو براہ راست فون کے سامنے رکھیں۔"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"آپ کا چہرہ دکھائی نہیں دے رہا۔ اپنے فون کو آنکھ کی سطح پر پکڑیں۔"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"کافی حرکت ہو رہی ہے۔ فون کو مضبوطی سے پکڑیں۔"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"براہ کرم اپنے چہرے کو دوبارہ مندرج کریں۔"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"اب چہرے کی شناخت نہیں کر سکتے۔ پھر آزمائيں۔"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"کافی ملتا جلتا ہے، براہ کرم اپنا پوز بدلیں۔"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"اپنا سر تھوڑا کم کریں۔"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"اپنا سر تھوڑا کم جھکائیں۔"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"اپنا سر تھوڑا کم کریں۔"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"چہرے کی شناخت نہیں ہو سکی۔ پھر کوشش کریں۔"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"اپنے سر کی پوزیشن کو تھوڑا تبدیل کریں"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"اپنے فون کی طرف چہرے کو سیدھا رکھیں"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"اپنے فون کی طرف چہرے کو سیدھا رکھیں"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"اپنے فون کی طرف چہرے کو سیدھا رکھیں"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"آپ کے چہرہ کو چھپانے والی ہر چیز کو ہٹائیں۔"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"سیاہ بار سمیت، اپنی اسکرین کے اوپری حصے کو صاف کریں"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"آپ کا چہرہ مکمل طور پر دکھائی دینا ضروری ہے"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"آپ کا چہرہ مکمل طور پر دکھائی دینا ضروری ہے"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"آپکے چہرے کا ماڈل تخلیق نہیں ہو سکا۔ پھر کوشش کریں۔"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"گہرے چشمے کا پتہ چلا۔ آپ کا چہرہ مکمل طور پر دکھائی دینا ضروری ہے۔"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"چہرے کو ڈھانپنے کا پتہ چلا۔ آپ کا چہرہ مکمل طور پر دکھائی دینا ضروری ہے۔"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"چہرے کی توثیق نہیں کی جا سکی۔ ہارڈ ویئر دستیاب نہیں ہے۔"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index f3dcadd12730..7b490087ac03 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Barmoq izi bilan ochish"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Barmoq izi skaneridan foydalanish imkonsiz"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Xizmat koʻrsatish markaziga murojaat qiling."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Yuz ravshan suratga olinmadi. Qaytadan urining."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Yuzingiz modeli yaratilmadi. Qayta urining."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Juda yorqin. Biroz soyaroq joy tanlang."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Juda qorongʻi. Atrofingizni yoriting."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Telefonni biroz uzoqroq tuting."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Telefonni yaqinroq tuting."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Telefonni teparoq tuting."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Telefonni pastroq tushiring."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Telefonni chapga suring."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Telefonni oʻngga suring."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Atrofingizni yanada yoriting"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Telefonni biroz uzoqroq tuting"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Telefonni yaqinroq tuting"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Telefonni teparoq tuting"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Telefonni pastroq tuting"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Telefonni chaproq tuting"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Telefonni oʻngroq tuting"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Qurilmaga tik qarang."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Telefonni yuzingizga tik qarating."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Yuzingiz koʻrinmayapti. Telefonni koʻz balandligida tuting."</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Ortiqcha harakatlanmoqda. Qimirlatmasdan ushlang."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Yuzingizni qaytadan qayd qildiring."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Yuz tanilmadi. Qaytadan urining."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Yuz ifodasi oldingiday. Holatingizni oʻzgartiring."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Boshingizni asta buring."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Boshingizni asta qiyalang."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Boshingizni asta buring."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Yuz aniqlanmadi. Qayta urining."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Boshingiz holatini biroz oʻzgartiring"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Telefonga tik qarab turing"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Telefonga tik qarab turing"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Telefonga tik qarab turing"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Yuzingizni berkitayotgan narsalarni olib tashlang."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Ekranning yuqori qismini, shuningdek, qora panelni ham tozalang"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Yuzingiz toʻliq koʻrinishi kerak"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Yuzingiz toʻliq koʻrinishi kerak"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Yuzingiz modeli yaratilmadi. Qayta urining."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Qora koʻzoynak aniqlandi. Yuzingiz toʻliq koʻrinishi kerak."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Yuzning bir qismi yopilib qolgan. Yuzingiz toʻliq koʻrinishi kerak."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Yuzingiz tasdiqlanmadi. Qurilma ishlamayapti."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 4a2f0f918b59..5e4de66f6701 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Mở khóa bằng vân tay"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Không thể dùng cảm biến vân tay"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Hãy liên hệ với một nhà cung cấp dịch vụ sửa chữa."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Không thể ghi lại đúng dữ liệu mặt. Hãy thử lại."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Không thể tạo mẫu khuôn mặt của bạn. Hãy thử lại."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Quá sáng. Hãy thử giảm độ sáng."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Quá tối. Hãy thử tăng độ sáng."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Đưa điện thoại ra xa hơn."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Đưa điện thoại lại gần hơn."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Nâng điện thoại lên cao hơn."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Hạ thấp điện thoại xuống."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Đưa điện thoại sang bên trái."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Đưa điện thoại sang bên phải."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Hãy thử tăng độ sáng"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Đưa điện thoại ra xa hơn"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Đưa điện thoại lại gần hơn"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Nâng điện thoại lên cao hơn"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Hạ thấp điện thoại xuống"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Đưa điện thoại sang bên trái"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Đưa điện thoại sang bên phải"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Vui lòng nhìn thẳng vào thiết bị."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Hướng thẳng khuôn mặt về phía trước điện thoại."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Không phát hiện thấy khuôn mặt của bạn. Hãy cầm điện thoại ngang tầm mắt"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Thiết bị di chuyển quá nhiều. Giữ yên thiết bị."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Vui lòng đăng ký lại khuôn mặt của bạn."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Không nhận ra khuôn mặt. Hãy thử lại."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Khuôn mặt quá giống nhau, vui lòng đổi tư thế."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Hãy bớt di chuyển đầu."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Hãy bớt ngửa hoặc cúi đầu."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Hãy bớt di chuyển đầu."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Không thể nhận dạng khuôn mặt. Hãy thử lại."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Nghiêng đầu của bạn một chút"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Nhìn thẳng vào điện thoại"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Nhìn thẳng vào điện thoại"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Nhìn thẳng vào điện thoại"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"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="8968391891086721678">"Vệ sinh phần đầu màn hình, bao gồm cả thanh màu đen"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Bạn cần cho thấy toàn bộ khuôn mặt của mình"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Toàn bộ khuôn mặt của bạn phải được hiển thị"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Không thể tạo mẫu khuôn mặt của bạn. Hãy thử lại."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Đã phát hiện thấy kính râm. Toàn bộ khuôn mặt của bạn phải được trông thấy rõ ràng."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Đã phát hiện khuôn mặt bị che khuất. Toàn bộ khuôn mặt của bạn phải được hiển thị."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Không thể xác minh khuôn mặt. Phần cứng không có sẵn."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 1578baba3a6d..0e6dff0b6f94 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指纹解锁"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"无法使用指纹传感器"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"请联系维修服务提供商。"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"无法捕获准确的人脸数据,请重试。"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"无法创建您的脸部模型,请重试。"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"亮度过高,请尝试使用较柔和的亮度。"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"亮度不足,请尝试将光线调亮。"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"请将手机拿远一点。"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"请将手机拿近一点。"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"请将手机举高一点。"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"请将手机拿低一点。"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"请将手机向左移动。"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"请将手机向右移动。"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"请尝试调亮光线"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"请将手机拿远一点"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"请将手机拿近一点"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"请将手机举高一点"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"请将手机拿低一点"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"请将手机向左移动"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"请将手机向右移动"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"请直视您的设备。"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"请将你的面部正对手机。"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"看不清您的脸部,请将手机举到与眼睛齐平的位置。"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"摄像头过于晃动。请将手机拿稳。"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"请重新注册您的面孔。"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"已无法识别人脸,请重试。"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"与先前的姿势太相近,请换一个姿势。"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"请将您的头稍微上下倾斜。"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"请稍微抬头或低头。"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"请将您的头稍微左右旋转。"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"无法识别人脸,请重试。"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"请略微调整头部的位置"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"请尽量直视手机"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"请尽量直视手机"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"请尽量直视手机"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"请移除所有遮挡您面部的物体。"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"请将屏幕顶部(包括黑色条栏)清理干净"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"您的脸部必须完全可见"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"您的脸部必须完全可见"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"无法创建您的脸部模型,请重试。"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"检测到墨镜,您的脸部必须完全可见。"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"检测到脸部有遮挡物,您的脸部必须完全可见。"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"无法验证人脸。硬件无法使用。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index bae4e4f03fbc..ea659858d972 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋解鎖"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"無法使用指紋感應器"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"請諮詢維修服務供應商。"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"無法擷取準確的臉容資料。請再試一次。"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"無法建立面部模型,請再試一次。"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"影像太亮。請嘗試在更暗的環境下使用。"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"影像太暗。請嘗試在更明亮的環境下使用。"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"請將手機移遠一點。"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"請將手機移近一點。"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"請將手機向上移。"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"請將手機向下移。"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"請將手機向左移。"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"請將手機向右移。"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"請試用更充足的光線"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"請將手機移開一點"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"請將手機移近一點"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"請將手機向上移"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"請將手機向下移"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"請將手機向左移"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"請將手機向右移"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"請以更直視的角度看著裝置。"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"將手機對準您的面孔正面。"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"看不到面孔,請將手機放在視線水平。"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"裝置不夠穩定。請拿穩手機。"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"請重新註冊面孔。"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"無法再識別面孔。請再試一次。"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"面孔位置太相近,請改變您的姿勢。"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"減少頭部左右轉動幅度。"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"減少頭部傾斜幅度。"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"減少頭部左右轉動幅度。"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"無法辨識面孔,請再試一次。"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"請稍為轉換頭部的位置"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"請正面望向手機"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"請正面望向手機"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"請正面望向手機"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"移開遮住面孔的任何物件。"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"請清理螢幕頂部,包括黑色列"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"必須展示整個面孔"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"您必須展示整個面孔。"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"無法建立面部模型,請再試一次。"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"偵測到深色眼鏡。您必須展示整個面孔。"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"偵測到面部遮蓋物。您必須展示整個面孔。"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"無法驗證面孔,硬件無法使用。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index bff44e6955ac..346efb6a5eaa 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋解鎖"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"指紋感應器無法使用"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"請洽詢維修供應商。"</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"無法擷取精準臉孔資料,請再試一次。"</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"無法建立臉部模型,請再試一次。"</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"亮度過高,請嘗試使用較柔和的照明方式。"</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"亮度不足,請嘗試使用較明亮的照明方式。"</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"請將手機拿遠一點。"</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"請將手機拿近一點。"</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"請將手機舉高一點。"</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"請將手機拿低一點。"</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"請將手機向左移動。"</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"請將手機向右移動。"</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"請採用更明亮的光源"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"請將手機拿遠一點"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"請將手機拿近一點"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"請將手機舉高一點"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"請將手機拿低一點"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"請將手機向左移"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"請將手機向右移"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"請儘可能直視裝置正面。"</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"將你的臉孔正對手機。"</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"未偵測到你的臉,請將手機舉到與視線同高。"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"鏡頭過度晃動,請拿穩手機。"</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"請重新註冊你的臉孔。"</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"已無法辨識臉孔,請再試一次。"</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"與先前的姿勢太相似,請換一個姿勢。"</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"請將你的頭部稍微向左或向右轉動。"</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"請稍微抬頭或低頭。"</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"請將你的頭部稍微向左或向右旋轉。"</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"無法辨識這張臉,請再試一次。"</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"請稍微改變頭部位置"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"請盡可能直視手機"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"請盡可能直視手機"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"請盡可能直視手機"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"請移除任何會遮住臉孔的物體。"</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"請清理螢幕頂端,包括黑色橫列"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"請露出整張臉"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"請露出整張臉"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"無法建立臉部模型,請再試一次。"</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"偵測到墨鏡,請露出整張臉。"</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"偵測到有物品遮住臉,請露出整張臉。"</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"相關硬體無法使用,因此無法驗證臉孔。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index d6f4e3dfb390..381f864adf63 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -634,26 +634,31 @@      <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Ukuvula ngesigxivizo somunwe"</string>      <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Ayikwazi ukusebenzisa inzwa yesigxivizo somunwe"</string>      <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Vakashela umhlinzeki wokulungisa."</string> -    <string name="face_acquired_insufficient" msgid="2150805835949162453">"Ayikwazanga ukuthwebula idatha enembile yobuso. Zama futhi."</string> +    <string name="face_acquired_insufficient" msgid="6889245852748492218">"Ayikwazi ukusungula imodeli yobuso bakho. Zama futhi."</string>      <string name="face_acquired_too_bright" msgid="8070756048978079164">"Kukhanya kakhulu. Zama ukukhanya okuthambile."</string> -    <string name="face_acquired_too_dark" msgid="252573548464426546">"Kumnyama kakhulu Zama ukukhanyisa okukhudlwana."</string> -    <string name="face_acquired_too_close" msgid="1628767882971469833">"Hambisa ifoni kude."</string> -    <string name="face_acquired_too_far" msgid="5098567726427173896">"Sondeza ifoni eduze."</string> -    <string name="face_acquired_too_high" msgid="4868033653626081839">"Hambisa ifoni phezulu."</string> -    <string name="face_acquired_too_low" msgid="1512237819632165945">"Hambisa ifoni ngaphansi."</string> -    <string name="face_acquired_too_right" msgid="2513391513020932655">"Hambisa ifoni ngakwesokunxele."</string> -    <string name="face_acquired_too_left" msgid="8882499346502714350">"Hambisa ifoni ngakwesokudla."</string> +    <string name="face_acquired_too_dark" msgid="7919016380747701228">"Zama ukukhanyisa okukhudlwana"</string> +    <string name="face_acquired_too_close" msgid="4453646176196302462">"Yisa ifoni kude"</string> +    <string name="face_acquired_too_far" msgid="2922278214231064859">"Sondeza ifoni eduze"</string> +    <string name="face_acquired_too_high" msgid="8278815780046368576">"Yisa ifoni phezulu"</string> +    <string name="face_acquired_too_low" msgid="4075391872960840081">"Yisa ifoni phansi"</string> +    <string name="face_acquired_too_right" msgid="6245286514593540859">"Yisa ifoni ngakwesokunxele sakho"</string> +    <string name="face_acquired_too_left" msgid="9201762240918405486">"Yisa ifoni ngakwesokudla sakho"</string>      <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Sicela ubheke ngokuqondile kakhulu kudivayisi yakho."</string> -    <string name="face_acquired_not_detected" msgid="2945945257956443257">"Beka ubuso bakho ngqo phambi kwefoni."</string> +    <string name="face_acquired_not_detected" msgid="1057966913397548150">"Ayikwazi ukubona ubuso bakho. Bamba ifoni yakho iqondane namehlo"</string>      <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Ukunyakaza okuningi kakhulu. Bamba ifoni iqine."</string>      <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Sicela uphinde ubhalise ubuso bakho."</string> -    <string name="face_acquired_too_different" msgid="4699657338753282542">"Ayisakwazi ukubona ubuso. Zama futhi."</string> -    <string name="face_acquired_too_similar" msgid="7684650785108399370">"Kufana kakhulu, sicela ushintshe ukuma kwakho."</string> -    <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"Jikisa ikhanda lakho kancane."</string> -    <string name="face_acquired_tilt_too_extreme" msgid="8618210742620248049">"Tshekisa kancane ikhanda lakho."</string> -    <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"Jikisa ikhanda lakho kancane."</string> +    <string name="face_acquired_too_different" msgid="2520389515612972889">"Ayikwazi ukubona ubuso. Zama futhi."</string> +    <string name="face_acquired_too_similar" msgid="8882920552674125694">"Shintsha indawo yekhanda lakho kancane"</string> +    <string name="face_acquired_pan_too_extreme" msgid="5417928604710621088">"Bheka ngqo kakhulu kufoni yakho"</string> +    <string name="face_acquired_tilt_too_extreme" msgid="5715715666540716620">"Bheka ngqo kakhulu kufoni yakho"</string> +    <string name="face_acquired_roll_too_extreme" msgid="8261939882838881194">"Bheka ngqo kakhulu kufoni yakho"</string>      <string name="face_acquired_obscured" msgid="4917643294953326639">"Susa noma yini efihle ubuso bakho."</string>      <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"Hlanza okuphezulu kwesikrini sakho, kufaka phakathi ibha emnyama"</string> +    <string name="face_acquired_dark_glasses_detected" msgid="7263638432128692048">"Ubuso bakho kufanele bubonakale ngokugcwele"</string> +    <string name="face_acquired_mouth_covering_detected" msgid="615991670821926847">"Ubuso bakho kufanele bubonakale ngokugcwele"</string> +    <string name="face_acquired_recalibrate_alt" msgid="5702674220280332115">"Ayikwazi ukusungula imodeli yobuso bakho. Zama futhi."</string> +    <string name="face_acquired_dark_glasses_detected_alt" msgid="4052123776406041972">"Kutholwe izibuko ezimnyama. Ubuso bakho kufanele bubonakale ngokugcwele."</string> +    <string name="face_acquired_mouth_covering_detected_alt" msgid="1122294982850589766">"Kutholwe ukumbozwa kobuso. Ubuso bakho kufanele bubonakale ngokugcwele."</string>    <string-array name="face_acquired_vendor">    </string-array>      <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ayikwazi ukuqinisekisa ubuso. Izingxenyekazi zekhompyutha azitholakali."</string> diff --git a/core/res/res/values/bools.xml b/core/res/res/values/bools.xml index fe296c704095..5fd9dc0ca798 100644 --- a/core/res/res/values/bools.xml +++ b/core/res/res/values/bools.xml @@ -30,4 +30,5 @@           lockscreen, setting this to true should come with customized drawables. -->      <bool name="use_lock_pattern_drawable">false</bool>      <bool name="resolver_landscape_phone">true</bool> +    <bool name="system_server_plays_face_haptics">true</bool>  </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index e5d90f00f327..c6b60f586047 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1798,45 +1798,57 @@      <string name="fingerprint_recalibrate_notification_content">Visit a repair provider.</string>      <!-- Message shown during face acquisition when the face cannot be recognized [CHAR LIMIT=50] --> -    <string name="face_acquired_insufficient">Couldn\u2019t capture accurate face data. Try again.</string> +    <string name="face_acquired_insufficient">Can\u2019t create your face model. Try again.</string>      <!-- Message shown during face acquisition when the image is too bright [CHAR LIMIT=50] -->      <string name="face_acquired_too_bright">Too bright. Try gentler lighting.</string>      <!-- Message shown during face acquisition when the image is too dark [CHAR LIMIT=50] --> -    <string name="face_acquired_too_dark">Too dark. Try brighter lighting.</string> +    <string name="face_acquired_too_dark">Try brighter lighting</string>      <!-- Message shown during face acquisition when the user is too close to sensor [CHAR LIMIT=50] --> -    <string name="face_acquired_too_close">Move phone farther away.</string> +    <string name="face_acquired_too_close">Move phone farther away</string>      <!-- Message shown during face acquisition when the user is too far from sensor [CHAR LIMIT=50] --> -    <string name="face_acquired_too_far">Move phone closer.</string> +    <string name="face_acquired_too_far">Move phone closer</string>      <!-- Message shown during face acquisition when the user is too high relatively to sensor [CHAR LIMIT=50] --> -    <string name="face_acquired_too_high">Move phone higher.</string> +    <string name="face_acquired_too_high">Move phone higher</string>      <!-- Message shown during face acquisition when the user is too low relatively to sensor [CHAR LIMIT=50] --> -    <string name="face_acquired_too_low">Move phone lower.</string> +    <string name="face_acquired_too_low">Move phone lower</string>      <!-- Message shown during face acquisition when only the right part of the user's face was detected [CHAR LIMIT=50] --> -    <string name="face_acquired_too_right">Move phone to the left.</string> +    <string name="face_acquired_too_right">Move phone to your left</string>      <!-- Message shown during face acquisition when only the left part of the user's face was detected [CHAR LIMIT=50] --> -    <string name="face_acquired_too_left">Move phone to the right.</string> +    <string name="face_acquired_too_left">Move phone to your right</string>      <!-- 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">Position your face directly in front of the phone.</string> +    <!-- Message shown during face acquisition when the user is not detected [CHAR LIMIT=75] --> +    <string name="face_acquired_not_detected">Can\u2019t see your face. Hold your phone at eye level.</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] -->      <string name="face_acquired_recalibrate">Please re-enroll your face.</string>      <!-- Message shown during face enrollment when a different person's face is detected [CHAR LIMIT=50] --> -    <string name="face_acquired_too_different">No longer able to recognize face. Try again.</string> +    <string name="face_acquired_too_different">Can\u2019t recognize face. Try again.</string>      <!-- Message shown during face enrollment when the face is too similar to a previous acquisition [CHAR LIMIT=50] --> -    <string name="face_acquired_too_similar">Too similar, please change your pose.</string> +    <string name="face_acquired_too_similar">Change the position of your head slightly</string>      <!-- Message shown during acqusition when the user's face is turned too far left or right [CHAR LIMIT=50] --> -    <string name="face_acquired_pan_too_extreme">Turn your head a little less.</string> +    <string name="face_acquired_pan_too_extreme">Look more directly at your phone</string>      <!-- Message shown during acqusition when the user's face is tilted too high or too low [CHAR LIMIT=50] --> -    <string name="face_acquired_tilt_too_extreme">Tilt your head a little less.</string> +    <string name="face_acquired_tilt_too_extreme">Look more directly at your phone</string>      <!-- Message shown during acquisiton when the user's face is tilted too far left or right [CHAR LIMIT=50] --> -    <string name="face_acquired_roll_too_extreme">Turn your head a little less.</string> +    <string name="face_acquired_roll_too_extreme">Look more directly at your phone</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=100] -->      <string name="face_acquired_sensor_dirty">Clean the top of your screen, including the black bar</string> +    <!-- Message shown during acquisition when dark glasses were detected [CHAR LIMIT=75] --> +    <string name="face_acquired_dark_glasses_detected">Your face must be fully visible</string> +    <!-- Message shown during acquisition when a mouth covering was detected [CHAR LIMIT=75] --> +    <string name="face_acquired_mouth_covering_detected">Your face must be fully visible</string> + +    <!-- Message shown during face acquisition when the sensor needs to be recalibrated [CHAR LIMIT=75] --> +    <string name="face_acquired_recalibrate_alt">Can\u2019t create your face model. Try again.</string> +    <!-- Message shown during acquisition when dark glasses were detected [CHAR LIMIT=100] --> +    <string name="face_acquired_dark_glasses_detected_alt">Dark glasses detected. Your face must be fully visible.</string> +    <!-- Message shown during acquisition when a mouth covering was detected [CHAR LIMIT=100] --> +    <string name="face_acquired_mouth_covering_detected_alt">Face covering detected. Your face must be fully visible.</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> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index fbb2e4afcda4..5dc8ac0ee4d9 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2657,6 +2657,11 @@    <java-symbol type="string" name="face_acquired_roll_too_extreme" />    <java-symbol type="string" name="face_acquired_obscured" />    <java-symbol type="string" name="face_acquired_sensor_dirty" /> +  <java-symbol type="string" name="face_acquired_dark_glasses_detected" /> +  <java-symbol type="string" name="face_acquired_mouth_covering_detected" /> +  <java-symbol type="string" name="face_acquired_recalibrate_alt" /> +  <java-symbol type="string" name="face_acquired_dark_glasses_detected_alt" /> +  <java-symbol type="string" name="face_acquired_mouth_covering_detected_alt" />    <java-symbol type="array" name="face_acquired_vendor" />    <java-symbol type="string" name="face_name_template" />    <java-symbol type="string" name="face_app_setting_name" /> @@ -4798,4 +4803,6 @@    <java-symbol type="id" name="language_picker_header" />    <java-symbol type="dimen" name="status_bar_height_default" /> + +  <java-symbol type="bool" name="system_server_plays_face_haptics" />  </resources> diff --git a/core/tests/coretests/src/android/widget/RemoteViewsTest.java b/core/tests/coretests/src/android/widget/RemoteViewsTest.java index a8f2b1d22aed..eb587a709859 100644 --- a/core/tests/coretests/src/android/widget/RemoteViewsTest.java +++ b/core/tests/coretests/src/android/widget/RemoteViewsTest.java @@ -63,7 +63,6 @@ import org.junit.runner.RunWith;  import java.util.ArrayList;  import java.util.Arrays;  import java.util.Map; -import java.util.HashMap;  import java.util.concurrent.CountDownLatch;  import java.util.function.Consumer; @@ -792,43 +791,4 @@ public class RemoteViewsTest {          verify(visitor, times(1)).accept(eq(icon3P.getUri()));          verify(visitor, times(1)).accept(eq(icon4P.getUri()));      } - -    @Test -    public void visitUris_sizedViews() { -        final RemoteViews large = new RemoteViews(mPackage, R.layout.remote_views_test); -        final Uri imageUriL = Uri.parse("content://large/image"); -        final Icon icon1L = Icon.createWithContentUri("content://large/icon1"); -        final Icon icon2L = Icon.createWithContentUri("content://large/icon2"); -        final Icon icon3L = Icon.createWithContentUri("content://large/icon3"); -        final Icon icon4L = Icon.createWithContentUri("content://large/icon4"); -        large.setImageViewUri(R.id.image, imageUriL); -        large.setTextViewCompoundDrawables(R.id.text, icon1L, icon2L, icon3L, icon4L); - -        final RemoteViews small = new RemoteViews(mPackage, 33); -        final Uri imageUriS = Uri.parse("content://small/image"); -        final Icon icon1S = Icon.createWithContentUri("content://small/icon1"); -        final Icon icon2S = Icon.createWithContentUri("content://small/icon2"); -        final Icon icon3S = Icon.createWithContentUri("content://small/icon3"); -        final Icon icon4S = Icon.createWithContentUri("content://small/icon4"); -        small.setImageViewUri(R.id.image, imageUriS); -        small.setTextViewCompoundDrawables(R.id.text, icon1S, icon2S, icon3S, icon4S); - -        HashMap<SizeF, RemoteViews> sizedViews = new HashMap<>(); -        sizedViews.put(new SizeF(300, 300), large); -        sizedViews.put(new SizeF(100, 100), small); -        RemoteViews views = new RemoteViews(sizedViews); - -        Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class); -        views.visitUris(visitor); -        verify(visitor, times(1)).accept(eq(imageUriL)); -        verify(visitor, times(1)).accept(eq(icon1L.getUri())); -        verify(visitor, times(1)).accept(eq(icon2L.getUri())); -        verify(visitor, times(1)).accept(eq(icon3L.getUri())); -        verify(visitor, times(1)).accept(eq(icon4L.getUri())); -        verify(visitor, times(1)).accept(eq(imageUriS)); -        verify(visitor, times(1)).accept(eq(icon1S.getUri())); -        verify(visitor, times(1)).accept(eq(icon2S.getUri())); -        verify(visitor, times(1)).accept(eq(icon3S.getUri())); -        verify(visitor, times(1)).accept(eq(icon4S.getUri())); -    }  } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java index c94455d9151a..bae23575297f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java @@ -211,24 +211,24 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange      /** Applies new configuration, returns {@code false} if there's no effect to the layout. */      public boolean updateConfiguration(Configuration configuration) { -        // Always update configuration after orientation changed to make sure to render divider bar -        // with proper resources that matching screen orientation. -        final int orientation = configuration.orientation; -        if (mOrientation != orientation) { -            mContext = mContext.createConfigurationContext(configuration); -            mSplitWindowManager.setConfiguration(configuration); -            mOrientation = orientation; -        } -          // Update the split bounds when necessary. Besides root bounds changed, split bounds need to          // be updated when the rotation changed to cover the case that users rotated the screen 180          // degrees. +        // Make sure to render the divider bar with proper resources that matching the screen +        // orientation.          final int rotation = configuration.windowConfiguration.getRotation();          final Rect rootBounds = configuration.windowConfiguration.getBounds(); -        if (mRotation == rotation && mRootBounds.equals(rootBounds)) { +        final int orientation = configuration.orientation; + +        if (mOrientation == orientation +                && mRotation == rotation +                && mRootBounds.equals(rootBounds)) {              return false;          } +        mContext = mContext.createConfigurationContext(configuration); +        mSplitWindowManager.setConfiguration(configuration); +        mOrientation = orientation;          mTempRect.set(mRootBounds);          mRootBounds.set(rootBounds);          mRotation = rotation; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index dad261ad9580..4b1e5f8c0d7c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -542,24 +542,44 @@ public class PipController implements PipTransitionController.PipTransitionCallb              mMenuController.attachPipMenuView();              // Calculate the snap fraction of the current stack along the old movement bounds              final PipSnapAlgorithm pipSnapAlgorithm = mPipBoundsAlgorithm.getSnapAlgorithm(); -            final Rect postChangeStackBounds = new Rect(mPipBoundsState.getBounds()); -            final float snapFraction = pipSnapAlgorithm.getSnapFraction(postChangeStackBounds, -                    mPipBoundsAlgorithm.getMovementBounds(postChangeStackBounds), +            final Rect postChangeBounds = new Rect(mPipBoundsState.getBounds()); +            final float snapFraction = pipSnapAlgorithm.getSnapFraction(postChangeBounds, +                    mPipBoundsAlgorithm.getMovementBounds(postChangeBounds),                      mPipBoundsState.getStashedState()); +            // Scale PiP on density dpi change, so it appears to be the same size physically. +            final boolean densityDpiChanged = mPipBoundsState.getDisplayLayout().densityDpi() != 0 +                    && (mPipBoundsState.getDisplayLayout().densityDpi() != layout.densityDpi()); +            if (densityDpiChanged) { +                final float scale = (float) layout.densityDpi() +                        / mPipBoundsState.getDisplayLayout().densityDpi(); +                postChangeBounds.set(0, 0, +                        (int) (postChangeBounds.width() * scale), +                        (int) (postChangeBounds.height() * scale)); +            } +              updateDisplayLayout.run(); -            // Calculate the stack bounds in the new orientation based on same fraction along the +            // Calculate the PiP bounds in the new orientation based on same fraction along the              // rotated movement bounds.              final Rect postChangeMovementBounds = mPipBoundsAlgorithm.getMovementBounds( -                    postChangeStackBounds, false /* adjustForIme */); -            pipSnapAlgorithm.applySnapFraction(postChangeStackBounds, postChangeMovementBounds, +                    postChangeBounds, false /* adjustForIme */); +            pipSnapAlgorithm.applySnapFraction(postChangeBounds, postChangeMovementBounds,                      snapFraction, mPipBoundsState.getStashedState(),                      mPipBoundsState.getStashOffset(),                      mPipBoundsState.getDisplayBounds(),                      mPipBoundsState.getDisplayLayout().stableInsets()); -            mTouchHandler.getMotionHelper().movePip(postChangeStackBounds); +            if (densityDpiChanged) { +                // Using PipMotionHelper#movePip directly here may cause race condition since +                // the app content in PiP mode may or may not be updated for the new density dpi. +                final int duration = mContext.getResources().getInteger( +                        R.integer.config_pipEnterAnimationDuration); +                mPipTaskOrganizer.scheduleAnimateResizePip( +                        postChangeBounds, duration, null /* updateBoundsCallback */); +            } else { +                mTouchHandler.getMotionHelper().movePip(postChangeBounds); +            }          } else {              updateDisplayLayout.run();          } diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java index 190e1cc083bd..fba4249260ef 100644 --- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java +++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java @@ -142,6 +142,14 @@ public class GpsNetInitiatedHandler {          public int textEncoding;      } +    /** Callbacks for Emergency call events. */ +    public interface EmergencyCallCallback { +        /** Callback invoked when an emergency call starts */ +        void onEmergencyCallStart(int subId); +        /** Callback invoked when an emergency call ends */ +        void onEmergencyCallEnd(); +    } +      private class EmergencyCallListener extends TelephonyCallback implements              TelephonyCallback.OutgoingEmergencyCallListener,              TelephonyCallback.CallStateListener { @@ -152,6 +160,7 @@ public class GpsNetInitiatedHandler {                  int subscriptionId) {              mIsInEmergencyCall = true;              if (DEBUG) Log.d(TAG, "onOutgoingEmergencyCall(): inEmergency = " + getInEmergency()); +            mEmergencyCallCallback.onEmergencyCallStart(subscriptionId);          }          @Override @@ -163,6 +172,7 @@ public class GpsNetInitiatedHandler {                  if (mIsInEmergencyCall) {                      mCallEndElapsedRealtimeMillis = SystemClock.elapsedRealtime();                      mIsInEmergencyCall = false; +                    mEmergencyCallCallback.onEmergencyCallEnd();                  }              }          } @@ -180,8 +190,11 @@ public class GpsNetInitiatedHandler {       */      private Notification.Builder mNiNotificationBuilder; +    private final EmergencyCallCallback mEmergencyCallCallback; +      public GpsNetInitiatedHandler(Context context,                                    INetInitiatedListener netInitiatedListener, +                                  EmergencyCallCallback emergencyCallCallback,                                    boolean isSuplEsEnabled) {          mContext = context; @@ -190,6 +203,7 @@ public class GpsNetInitiatedHandler {          } else {              mNetInitiatedListener = netInitiatedListener;          } +        mEmergencyCallCallback = emergencyCallCallback;          setSuplEsEnabled(isSuplEsEnabled);          mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); diff --git a/media/java/android/media/AudioDeviceAttributes.java b/media/java/android/media/AudioDeviceAttributes.java index af3c295b8d6c..5a274353f68e 100644 --- a/media/java/android/media/AudioDeviceAttributes.java +++ b/media/java/android/media/AudioDeviceAttributes.java @@ -68,7 +68,7 @@ public final class AudioDeviceAttributes implements Parcelable {      /**       * The unique address of the device. Some devices don't have addresses, only an empty string.       */ -    private final @NonNull String mAddress; +    private @NonNull String mAddress;      /**       * The non-unique name of the device. Some devices don't have names, only an empty string.       * Should not be used as a unique identifier for a device. @@ -188,6 +188,21 @@ public final class AudioDeviceAttributes implements Parcelable {      /**       * @hide +     * Copy Constructor. +     * @param ada the copied AudioDeviceAttributes +     */ +    public AudioDeviceAttributes(AudioDeviceAttributes ada) { +        mRole = ada.getRole(); +        mType = ada.getType(); +        mAddress = ada.getAddress(); +        mName = ada.getName(); +        mNativeType = ada.getInternalType(); +        mAudioProfiles = ada.getAudioProfiles(); +        mAudioDescriptors = ada.getAudioDescriptors(); +    } + +    /** +     * @hide       * Returns the role of a device       * @return the role       */ @@ -218,6 +233,15 @@ public final class AudioDeviceAttributes implements Parcelable {      /**       * @hide +     * Sets the device address. Only used by audio service. +     */ +    public void setAddress(@NonNull String address) { +        Objects.requireNonNull(address); +        mAddress = address; +    } + +    /** +     * @hide       * Returns the name of the audio device, or an empty string for devices without one       * @return the device name       */ diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 955bfcc902a4..467464093e10 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -1208,6 +1208,9 @@ public class AudioSystem      public static final Set<Integer> DEVICE_IN_ALL_SCO_SET;      /** @hide */      public static final Set<Integer> DEVICE_IN_ALL_USB_SET; +    /** @hide */ +    public static final Set<Integer> DEVICE_IN_ALL_BLE_SET; +      static {          DEVICE_IN_ALL_SET = new HashSet<>();          DEVICE_IN_ALL_SET.add(DEVICE_IN_COMMUNICATION); @@ -1247,6 +1250,66 @@ public class AudioSystem          DEVICE_IN_ALL_USB_SET.add(DEVICE_IN_USB_ACCESSORY);          DEVICE_IN_ALL_USB_SET.add(DEVICE_IN_USB_DEVICE);          DEVICE_IN_ALL_USB_SET.add(DEVICE_IN_USB_HEADSET); + +        DEVICE_IN_ALL_BLE_SET = new HashSet<>(); +        DEVICE_IN_ALL_BLE_SET.add(DEVICE_IN_BLE_HEADSET); +    } + +    /** @hide */ +    public static boolean isBluetoothDevice(int deviceType) { +        return isBluetoothA2dpOutDevice(deviceType) +                || isBluetoothScoDevice(deviceType) +                || isBluetoothLeDevice(deviceType); +    } + +    /** @hide */ +    public static boolean isBluetoothOutDevice(int deviceType) { +        return isBluetoothA2dpOutDevice(deviceType) +                || isBluetoothScoOutDevice(deviceType) +                || isBluetoothLeOutDevice(deviceType); +    } + +    /** @hide */ +    public static boolean isBluetoothInDevice(int deviceType) { +        return isBluetoothScoInDevice(deviceType) +                || isBluetoothLeInDevice(deviceType); +    } + +    /** @hide */ +    public static boolean isBluetoothA2dpOutDevice(int deviceType) { +        return DEVICE_OUT_ALL_A2DP_SET.contains(deviceType); +    } + +    /** @hide */ +    public static boolean isBluetoothScoOutDevice(int deviceType) { +        return DEVICE_OUT_ALL_SCO_SET.contains(deviceType); +    } + +    /** @hide */ +    public static boolean isBluetoothScoInDevice(int deviceType) { +        return DEVICE_IN_ALL_SCO_SET.contains(deviceType); +    } + +    /** @hide */ +    public static boolean isBluetoothScoDevice(int deviceType) { +        return isBluetoothScoOutDevice(deviceType) +                || isBluetoothScoInDevice(deviceType); +    } + +    /** @hide */ +    public static boolean isBluetoothLeOutDevice(int deviceType) { +        return DEVICE_OUT_ALL_BLE_SET.contains(deviceType); +    } + +    /** @hide */ +    public static boolean isBluetoothLeInDevice(int deviceType) { +        return DEVICE_IN_ALL_BLE_SET.contains(deviceType); +    } + +    /** @hide */ +    public static boolean isBluetoothLeDevice(int deviceType) { +        return isBluetoothLeOutDevice(deviceType) +                || isBluetoothLeInDevice(deviceType);      }      /** @hide */ diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java index 89e10c4b5e11..fc70ba40fb47 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java @@ -20,15 +20,19 @@ import android.bluetooth.BluetoothCsipSetCoordinator;  import android.bluetooth.BluetoothDevice;  import android.bluetooth.BluetoothProfile;  import android.bluetooth.BluetoothUuid; +import android.os.Build;  import android.os.ParcelUuid;  import android.util.Log; +import androidx.annotation.ChecksSdkIntAtLeast; +  import com.android.internal.annotations.VisibleForTesting;  import java.util.HashSet;  import java.util.List;  import java.util.Map;  import java.util.Set; +import java.util.stream.Collectors;  /**   * CsipDeviceManager manages the set of remote CSIP Bluetooth devices. @@ -126,32 +130,84 @@ public class CsipDeviceManager {          }      } +    @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.TIRAMISU) +    private static boolean isAtLeastT() { +        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU; +    } +      // Group devices by groupId      @VisibleForTesting      void onGroupIdChanged(int groupId) { -        int firstMatchedIndex = -1; -        CachedBluetoothDevice mainDevice = null; +        if (!isValidGroupId(groupId)) { +            log("onGroupIdChanged: groupId is invalid"); +            return; +        } +        log("onGroupIdChanged: mCachedDevices list =" + mCachedDevices.toString()); +        final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager(); +        final CachedBluetoothDeviceManager deviceManager = mBtManager.getCachedDeviceManager(); +        final LeAudioProfile leAudioProfile = profileManager.getLeAudioProfile(); +        final BluetoothDevice mainBluetoothDevice = (leAudioProfile != null && isAtLeastT()) ? +                leAudioProfile.getConnectedGroupLeadDevice(groupId) : null; +        CachedBluetoothDevice newMainDevice = +                mainBluetoothDevice != null ? deviceManager.findDevice(mainBluetoothDevice) : null; +        if (newMainDevice != null) { +            final CachedBluetoothDevice finalNewMainDevice = newMainDevice; +            final List<CachedBluetoothDevice> memberDevices = mCachedDevices.stream() +                    .filter(cachedDevice -> !cachedDevice.equals(finalNewMainDevice) +                            && cachedDevice.getGroupId() == groupId) +                    .collect(Collectors.toList()); +            if (memberDevices == null || memberDevices.isEmpty()) { +                log("onGroupIdChanged: There is no member device in list."); +                return; +            } +            log("onGroupIdChanged: removed from UI device =" + memberDevices +                    + ", with groupId=" + groupId + " mainDevice= " + newMainDevice); +            for (CachedBluetoothDevice memberDeviceItem : memberDevices) { +                Set<CachedBluetoothDevice> memberSet = memberDeviceItem.getMemberDevice(); +                if (!memberSet.isEmpty()) { +                    log("onGroupIdChanged: Transfer the member list into new main device."); +                    for (CachedBluetoothDevice memberListItem : memberSet) { +                        if (!memberListItem.equals(newMainDevice)) { +                            newMainDevice.addMemberDevice(memberListItem); +                        } +                    } +                    memberSet.clear(); +                } -        for (int i = mCachedDevices.size() - 1; i >= 0; i--) { -            final CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); -            if (cachedDevice.getGroupId() != groupId) { -                continue; +                newMainDevice.addMemberDevice(memberDeviceItem); +                mCachedDevices.remove(memberDeviceItem); +                mBtManager.getEventManager().dispatchDeviceRemoved(memberDeviceItem);              } -            if (firstMatchedIndex == -1) { -                // Found the first one -                firstMatchedIndex = i; -                mainDevice = cachedDevice; -                continue; +            if (!mCachedDevices.contains(newMainDevice)) { +                mCachedDevices.add(newMainDevice); +                mBtManager.getEventManager().dispatchDeviceAdded(newMainDevice);              } +        } else { +            log("onGroupIdChanged: There is no main device from the LE profile."); +            int firstMatchedIndex = -1; -            log("onGroupIdChanged: removed from UI device =" + cachedDevice -                    + ", with groupId=" + groupId + " firstMatchedIndex=" + firstMatchedIndex); +            for (int i = mCachedDevices.size() - 1; i >= 0; i--) { +                final CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); +                if (cachedDevice.getGroupId() != groupId) { +                    continue; +                } + +                if (firstMatchedIndex == -1) { +                    // Found the first one +                    firstMatchedIndex = i; +                    newMainDevice = cachedDevice; +                    continue; +                } + +                log("onGroupIdChanged: removed from UI device =" + cachedDevice +                        + ", with groupId=" + groupId + " firstMatchedIndex=" + firstMatchedIndex); -            mainDevice.addMemberDevice(cachedDevice); -            mCachedDevices.remove(i); -            mBtManager.getEventManager().dispatchDeviceRemoved(cachedDevice); -            break; +                newMainDevice.addMemberDevice(cachedDevice); +                mCachedDevices.remove(i); +                mBtManager.getEventManager().dispatchDeviceRemoved(cachedDevice); +                break; +            }          }      } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LeAudioProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LeAudioProfile.java index 19df1e9c0730..0f57d8785de9 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LeAudioProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LeAudioProfile.java @@ -21,6 +21,7 @@ import static android.bluetooth.BluetoothAdapter.ACTIVE_DEVICE_ALL;  import static android.bluetooth.BluetoothProfile.CONNECTION_POLICY_ALLOWED;  import static android.bluetooth.BluetoothProfile.CONNECTION_POLICY_FORBIDDEN; +import android.annotation.Nullable;  import android.bluetooth.BluetoothAdapter;  import android.bluetooth.BluetoothClass;  import android.bluetooth.BluetoothCodecConfig; @@ -183,6 +184,37 @@ public class LeAudioProfile implements LocalBluetoothProfile {          return mBluetoothAdapter.getActiveDevices(BluetoothProfile.LE_AUDIO);      } +    /** +     * Get Lead device for the group. +     * +     * Lead device is the device that can be used as an active device in the system. +     * Active devices points to the Audio Device for the Le Audio group. +     * This method returns the Lead devices for the connected LE Audio +     * group and this device should be used in the setActiveDevice() method by other parts +     * of the system, which wants to set to active a particular Le Audio group. +     * +     * Note: getActiveDevice() returns the Lead device for the currently active LE Audio group. +     * Note: When Lead device gets disconnected while Le Audio group is active and has more devices +     * in the group, then Lead device will not change. If Lead device gets disconnected, for the +     * Le Audio group which is not active, a new Lead device will be chosen +     * +     * @param groupId The group id. +     * @return group lead device. +     * +     * @hide +     */ +    @RequiresApi(Build.VERSION_CODES.TIRAMISU) +    public @Nullable BluetoothDevice getConnectedGroupLeadDevice(int groupId) { +        if (DEBUG) { +            Log.d(TAG,"getConnectedGroupLeadDevice"); +        } +        if (mService == null) { +            Log.e(TAG,"No service."); +            return null; +        } +        return mService.getConnectedGroupLeadDevice(groupId); +    } +      @Override      public boolean isEnabled(BluetoothDevice device) {          if (mService == null || device == null) { diff --git a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java index 8b34cf3d624f..44a37f4ccaca 100644 --- a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java @@ -25,6 +25,7 @@ import android.util.DisplayMetrics;  import android.util.Log;  import android.util.MathUtils;  import android.view.Display; +import android.view.DisplayInfo;  import android.view.IWindowManager;  import android.view.WindowManagerGlobal; @@ -87,14 +88,14 @@ public class DisplayDensityUtils {          }          final Resources res = context.getResources(); -        final DisplayMetrics metrics = new DisplayMetrics(); -        context.getDisplayNoVerify().getRealMetrics(metrics); +        DisplayInfo info = new DisplayInfo(); +        context.getDisplayNoVerify().getDisplayInfo(info); -        final int currentDensity = metrics.densityDpi; +        final int currentDensity = info.logicalDensityDpi;          int currentDensityIndex = -1;          // Compute number of "larger" and "smaller" scales for this display. -        final int minDimensionPx = Math.min(metrics.widthPixels, metrics.heightPixels); +        final int minDimensionPx = Math.min(info.logicalWidth, info.logicalHeight);          final int maxDensity = DisplayMetrics.DENSITY_MEDIUM * minDimensionPx / MIN_DIMENSION_DP;          final float maxScaleDimen = context.getResources().getFraction(                  R.fraction.display_density_max_scale, 1, 1); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index cd667ca05f61..528af2ec2528 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -48,7 +48,6 @@ import android.util.Xml;  import android.util.proto.ProtoOutputStream;  import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.VisibleForTesting;  import com.android.internal.util.ArrayUtils;  import com.android.internal.util.FrameworkStatsLog; @@ -377,8 +376,8 @@ final class SettingsState {              Setting newSetting = new Setting(name, oldSetting.getValue(), null,                      oldSetting.getPackageName(), oldSetting.getTag(), false,                      oldSetting.getId()); -            int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), 0, -                    oldValue, newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); +            int newSize = getNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, +                    newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue());              checkNewMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize);              mSettings.put(name, newSetting);              updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), newSize); @@ -415,9 +414,8 @@ final class SettingsState {          String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null;          String newDefaultValue = makeDefault ? value : oldDefaultValue; -        int newSize = getNewMemoryUsagePerPackageLocked(packageName, -                oldValue == null ? name.length() : 0 /* deltaKeySize */, -                oldValue, value, oldDefaultValue, newDefaultValue); +        int newSize = getNewMemoryUsagePerPackageLocked(packageName, oldValue, value, +                oldDefaultValue, newDefaultValue);          checkNewMemoryUsagePerPackageLocked(packageName, newSize);          Setting newState; @@ -561,12 +559,8 @@ final class SettingsState {          }          Setting oldState = mSettings.remove(name); -        if (oldState == null) { -            return false; -        } -        int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, -                -name.length() /* deltaKeySize */, -                oldState.value, null, oldState.defaultValue, null); +        int newSize = getNewMemoryUsagePerPackageLocked(oldState.packageName, oldState.value, +                null, oldState.defaultValue, null);          FrameworkStatsLog.write(FrameworkStatsLog.SETTING_CHANGED, name, /* value= */ "",                  /* newValue= */ "", oldState.value, /* tag */ "", false, getUserIdFromKey(mKey), @@ -589,16 +583,15 @@ final class SettingsState {          }          Setting setting = mSettings.get(name); -        if (setting == null) { -            return false; -        }          Setting oldSetting = new Setting(setting);          String oldValue = setting.getValue();          String oldDefaultValue = setting.getDefaultValue(); +        String newValue = oldDefaultValue; +        String newDefaultValue = oldDefaultValue; -        int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, 0, oldValue, -                oldDefaultValue, oldDefaultValue, oldDefaultValue); +        int newSize = getNewMemoryUsagePerPackageLocked(setting.packageName, oldValue, +                newValue, oldDefaultValue, newDefaultValue);          checkNewMemoryUsagePerPackageLocked(setting.packageName, newSize);          if (!setting.reset()) { @@ -732,8 +725,8 @@ final class SettingsState {      }      @GuardedBy("mLock") -    private int getNewMemoryUsagePerPackageLocked(String packageName, int deltaKeySize, -            String oldValue, String newValue, String oldDefaultValue, String newDefaultValue) { +    private int getNewMemoryUsagePerPackageLocked(String packageName, String oldValue, +            String newValue, String oldDefaultValue, String newDefaultValue) {          if (isExemptFromMemoryUsageCap(packageName)) {              return 0;          } @@ -742,7 +735,7 @@ final class SettingsState {          final int newValueSize = (newValue != null) ? newValue.length() : 0;          final int oldDefaultValueSize = (oldDefaultValue != null) ? oldDefaultValue.length() : 0;          final int newDefaultValueSize = (newDefaultValue != null) ? newDefaultValue.length() : 0; -        final int deltaSize = deltaKeySize + newValueSize + newDefaultValueSize +        final int deltaSize = newValueSize + newDefaultValueSize                  - oldValueSize - oldDefaultValueSize;          return Math.max((currentSize != null) ? currentSize + deltaSize : deltaSize, 0);      } @@ -1584,11 +1577,4 @@ final class SettingsState {          }          return false;      } - -    @VisibleForTesting -    public int getMemoryUsage(String packageName) { -        synchronized (mLock) { -            return mPackageToMemoryUsage.getOrDefault(packageName, 0); -        } -    }  } diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index cce515444c1f..da0689c6d177 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -687,6 +687,7 @@ public class SettingsBackupTest {                   Settings.Secure.ASSIST_SCREENSHOT_ENABLED,                   Settings.Secure.ASSIST_STRUCTURE_ENABLED,                   Settings.Secure.ATTENTIVE_TIMEOUT, +                 Settings.Secure.AUDIO_DEVICE_INVENTORY, // setting not controllable by user                   Settings.Secure.AUTOFILL_FEATURE_FIELD_CLASSIFICATION,                   Settings.Secure.AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT,                   Settings.Secure.AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE, diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index f6d43292eafe..66b809aeae30 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -295,7 +295,7 @@ public class SettingsStateTest extends AndroidTestCase {          settingsState.deleteSettingLocked(SETTING_NAME);          // Should not throw if usage is under the cap -        settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19975), +        settingsState.insertSettingLocked(SETTING_NAME, Strings.repeat("A", 19999),                  null, false, "p1");          settingsState.deleteSettingLocked(SETTING_NAME);          try { @@ -313,97 +313,5 @@ public class SettingsStateTest extends AndroidTestCase {              assertTrue(ex.getMessage().contains("p1"));          }          assertTrue(settingsState.getSettingLocked(SETTING_NAME).isNull()); -        try { -            settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", -                    null, false, "p1"); -            fail("Should throw because it exceeded per package memory usage"); -        } catch (IllegalStateException ex) { -            assertTrue(ex.getMessage().contains("You are adding too many system settings")); -        } -    } - -    public void testMemoryUsagePerPackage() { -        SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, -                SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper()); - -        // Test inserting one key with default -        final String testKey1 = SETTING_NAME; -        final String testValue1 = Strings.repeat("A", 100); -        settingsState.insertSettingLocked(testKey1, testValue1, null, true, TEST_PACKAGE); -        int expectedMemUsage = testKey1.length() + testValue1.length() -                + testValue1.length() /* size for default */; -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); - -        // Test inserting another key -        final String testKey2 = SETTING_NAME + "2"; -        settingsState.insertSettingLocked(testKey2, testValue1, null, false, TEST_PACKAGE); -        expectedMemUsage += testKey2.length() + testValue1.length(); -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); - -        // Test updating first key with new default -        final String testValue2 = Strings.repeat("A", 300); -        settingsState.insertSettingLocked(testKey1, testValue2, null, true, TEST_PACKAGE); -        expectedMemUsage += (testValue2.length() - testValue1.length()) * 2; -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); - -        // Test updating first key without new default -        final String testValue3 = Strings.repeat("A", 50); -        settingsState.insertSettingLocked(testKey1, testValue3, null, false, TEST_PACKAGE); -        expectedMemUsage -= testValue2.length() - testValue3.length(); -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); - -        // Test updating second key -        settingsState.insertSettingLocked(testKey2, testValue2, null, false, TEST_PACKAGE); -        expectedMemUsage -= testValue1.length() - testValue2.length(); -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); - -        // Test resetting key -        settingsState.resetSettingLocked(testKey1); -        expectedMemUsage += testValue2.length() - testValue3.length(); -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); - -        // Test resetting default value -        settingsState.resetSettingDefaultValueLocked(testKey1); -        expectedMemUsage -= testValue2.length(); -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); - -        // Test deletion -        settingsState.deleteSettingLocked(testKey2); -        expectedMemUsage -= testValue2.length() + testKey2.length() /* key is deleted too */; -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); - -        // Test another package with a different key -        final String testPackage2 = TEST_PACKAGE + "2"; -        final String testKey3 = SETTING_NAME + "3"; -        settingsState.insertSettingLocked(testKey3, testValue1, null, true, testPackage2); -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); -        final int expectedMemUsage2 = testKey3.length() + testValue1.length() * 2; -        assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); - -        // Test system package -        settingsState.insertSettingLocked(testKey1, testValue1, null, true, SYSTEM_PACKAGE); -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); -        assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2)); -        assertEquals(0, settingsState.getMemoryUsage(SYSTEM_PACKAGE)); - -        // Test invalid value -        try { -            settingsState.insertSettingLocked(testKey1, Strings.repeat("A", 20001), null, false, -                    TEST_PACKAGE); -            fail("Should throw because it exceeded per package memory usage"); -        } catch (IllegalStateException ex) { -            assertTrue(ex.getMessage().contains("You are adding too many system settings")); -        } -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE)); - -        // Test invalid key -        try { -            settingsState.insertSettingLocked(Strings.repeat("A", 20001), "", null, false, -                    TEST_PACKAGE); -            fail("Should throw because it exceeded per package memory usage"); -        } catch (IllegalStateException ex) { -            assertTrue(ex.getMessage().contains("You are adding too many system settings")); -        } -        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE));      }  } diff --git a/packages/SystemUI/TEST_MAPPING b/packages/SystemUI/TEST_MAPPING index 3bd6d51eecc6..edb5ee30524f 100644 --- a/packages/SystemUI/TEST_MAPPING +++ b/packages/SystemUI/TEST_MAPPING @@ -91,7 +91,7 @@    //    // If you don't use @Staging or @Postsubmit, your new test will immediately    // block presubmit, which is probably not what you want! -  "platinum-postsubmit": [ +  "sysui-platinum-postsubmit": [      {        "name": "PlatformScenarioTests",        "options": [ @@ -110,7 +110,7 @@        ]      }    ], -  "staged-platinum-postsubmit": [ +  "sysui-staged-platinum-postsubmit": [      {        "name": "PlatformScenarioTests",        "options": [ diff --git a/packages/SystemUI/animation/res/values/ids.xml b/packages/SystemUI/animation/res/values/ids.xml index 03ca462beb76..f7150ab548dd 100644 --- a/packages/SystemUI/animation/res/values/ids.xml +++ b/packages/SystemUI/animation/res/values/ids.xml @@ -21,6 +21,7 @@      <!-- ViewBoundsAnimator -->      <item type="id" name="tag_animator"/> +    <item type="id" name="tag_alpha_animator"/>      <item type="id" name="tag_layout_listener"/>      <item type="id" name="tag_override_bottom"/>      <item type="id" name="tag_override_left"/> diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt index bb6eb78aac65..323db8526470 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt @@ -494,9 +494,10 @@ class ActivityLaunchAnimator(          }          private fun applyStateToWindow(window: RemoteAnimationTarget, state: LaunchAnimator.State) { -            if (transactionApplierView.viewRootImpl == null) { -                // If the view root we synchronize with was detached, don't apply any transaction -                // (as [SyncRtSurfaceTransactionApplier.scheduleApply] would otherwise throw). +            if (transactionApplierView.viewRootImpl == null || !window.leash.isValid) { +                // Don't apply any transaction if the view root we synchronize with was detached or +                // if the SurfaceControl associated with [window] is not valid, as +                // [SyncRtSurfaceTransactionApplier.scheduleApply] would otherwise throw.                  return              } @@ -557,9 +558,10 @@ class ActivityLaunchAnimator(              state: LaunchAnimator.State,              linearProgress: Float          ) { -            if (transactionApplierView.viewRootImpl == null) { -                // If the view root we synchronize with was detached, don't apply any transaction -                // (as [SyncRtSurfaceTransactionApplier.scheduleApply] would otherwise throw). +            if (transactionApplierView.viewRootImpl == null || !navigationBar.leash.isValid) { +                // Don't apply any transaction if the view root we synchronize with was detached or +                // if the SurfaceControl associated with [navigationBar] is not valid, as +                // [SyncRtSurfaceTransactionApplier.scheduleApply] would otherwise throw.                  return              } diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt index 093589f8c636..4c3cd3c2b441 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt @@ -39,6 +39,7 @@ class ViewHierarchyAnimator {          private val DEFAULT_INTERPOLATOR = Interpolators.STANDARD          private val DEFAULT_ADDITION_INTERPOLATOR = Interpolators.STANDARD_DECELERATE          private val DEFAULT_REMOVAL_INTERPOLATOR = Interpolators.STANDARD_ACCELERATE +        private val DEFAULT_FADE_IN_INTERPOLATOR = Interpolators.ALPHA_IN          /** The properties used to animate the view bounds. */          private val PROPERTIES = mapOf( @@ -162,6 +163,10 @@ class ViewHierarchyAnimator {           * animate an already visible view, see [animate] and [animateNextUpdate].           *           * Then animator unregisters itself once the first addition animation is complete. +         * +         * @param includeFadeIn true if the animator should also fade in the view and child views. +         * @param fadeInInterpolator the interpolator to use when fading in the view. Unused if +         *     [includeFadeIn] is false.           */          @JvmOverloads          fun animateAddition( @@ -169,7 +174,9 @@ class ViewHierarchyAnimator {              origin: Hotspot = Hotspot.CENTER,              interpolator: Interpolator = DEFAULT_ADDITION_INTERPOLATOR,              duration: Long = DEFAULT_DURATION, -            includeMargins: Boolean = false +            includeMargins: Boolean = false, +            includeFadeIn: Boolean = false, +            fadeInInterpolator: Interpolator = DEFAULT_FADE_IN_INTERPOLATOR          ): Boolean {              if (isVisible(                      rootView.visibility, @@ -186,6 +193,42 @@ class ViewHierarchyAnimator {                  origin, interpolator, duration, ignorePreviousValues = !includeMargins              )              addListener(rootView, listener, recursive = true) + +            if (!includeFadeIn) { +                return true +            } + +            if (rootView is ViewGroup) { +                // First, fade in the container view +                val containerDuration = duration / 6 +                createAndStartFadeInAnimator( +                    rootView, containerDuration, startDelay = 0, interpolator = fadeInInterpolator +                ) + +                // Then, fade in the child views +                val childDuration = duration / 3 +                for (i in 0 until rootView.childCount) { +                    val view = rootView.getChildAt(i) +                    createAndStartFadeInAnimator( +                        view, +                        childDuration, +                        // Wait until the container fades in before fading in the children +                        startDelay = containerDuration, +                        interpolator = fadeInInterpolator +                    ) +                } +                // For now, we don't recursively fade in additional sub views (e.g. grandchild +                // views) since it hasn't been necessary, but we could add that functionality. +            } else { +                // Fade in the view during the first half of the addition +                createAndStartFadeInAnimator( +                    rootView, +                    duration / 2, +                    startDelay = 0, +                    interpolator = fadeInInterpolator +                ) +            } +              return true          } @@ -834,6 +877,27 @@ class ViewHierarchyAnimator {              view.setTag(R.id.tag_animator, animator)              animator.start()          } + +        private fun createAndStartFadeInAnimator( +            view: View, +            duration: Long, +            startDelay: Long, +            interpolator: Interpolator +        ) { +            val animator = ObjectAnimator.ofFloat(view, "alpha", 1f) +            animator.startDelay = startDelay +            animator.duration = duration +            animator.interpolator = interpolator +            animator.addListener(object : AnimatorListenerAdapter() { +                override fun onAnimationEnd(animation: Animator) { +                    view.setTag(R.id.tag_alpha_animator, null /* tag */) +                } +            }) + +            (view.getTag(R.id.tag_alpha_animator) as? ObjectAnimator)?.cancel() +            view.setTag(R.id.tag_alpha_animator, animator) +            animator.start() +        }      }      /** An enum used to determine the origin of addition animations. */ diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml index f2ad66dd7afa..5184c1cb02f5 100644 --- a/packages/SystemUI/res-keyguard/values-af/strings.xml +++ b/packages/SystemUI/res-keyguard/values-af/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Toestel is deur administrateur gesluit"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Toestel is handmatig gesluit"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nie herken nie"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Skakel "<b>"kameratoegang"</b>" in Instellings > Privaatheid aan om Gesigslot te gebruik"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Skakel kameratoegang aan om Gesigslot te gebruik"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Voer SIM-PIN in. Jy het <xliff:g id="NUMBER_1">%d</xliff:g> pogings oor.</item>        <item quantity="one">Voer SIM-PIN in. Jy het <xliff:g id="NUMBER_0">%d</xliff:g> poging oor voordat jy jou diensverskaffer moet kontak om jou toestel te ontsluit.</item> diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml index 7f4f6fd3b7ad..11a2be59d9b8 100644 --- a/packages/SystemUI/res-keyguard/values-am/strings.xml +++ b/packages/SystemUI/res-keyguard/values-am/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"መሣሪያ በአስተዳዳሪ ተቆልፏል"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"መሣሪያ በተጠቃሚው ራሱ ተቆልፏል"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"አልታወቀም"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"በመልክ መክፈትን ለመጠቀም "<b>"የካሜራ መዳረሻ"</b>"ን በቅንብሮች እና ግላዊነት ውስጥ ያብሩ"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"በመልክ መክፈትን ለመጠቀም በቅንብሮች ውስጥ የካሜራ መዳረሻን ያብሩ"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">የሲም ፒን ያስገቡ። <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item>        <item quantity="other">የሲም ፒን ያስገቡ። <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item> diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index f0bbf516eaa1..5e3bc324568e 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -98,7 +98,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"اختار المشرف قفل الجهاز"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"تم حظر الجهاز يدويًا"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"لم يتم التعرّف عليه."</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"لاستخدام ميزة \"فتح الجهاز بالتعرف على الوجه\"، عليك منح إذن "<b>"الوصول إلى الكاميرا"</b>" في الإعدادات > الخصوصية."</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"يجب منح الكاميرا إذن الوصول في \"الإعدادات\"."</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="zero">أدخل رقم التعريف الشخصي لشريحة SIM. تتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولة.</item>        <item quantity="two">أدخل رقم التعريف الشخصي لشريحة SIM. تتبقى لديك محاولتان (<xliff:g id="NUMBER_1">%d</xliff:g>).</item> diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml index 186f47a461ac..d60c564adcb4 100644 --- a/packages/SystemUI/res-keyguard/values-as/strings.xml +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"প্ৰশাসকে ডিভাইচ লক কৰি ৰাখিছে"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইচটো মেনুৱেলভাৱে লক কৰা হৈছিল"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"চিনাক্ত কৰিব পৰা নাই"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ফেচ আনলক সুবিধাটো ব্যৱহাৰ কৰিবলৈ ছেটিং > গোপনীয়তাত "<b>"কেমেৰাৰ এক্সেছ"</b>" অন কৰক"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"ফেচ আনলক ব্যৱহাৰ কৰিবলৈ ছেটিঙত কেমেৰাৰ এক্সেছ অন কৰক"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">ছিমৰ পিন দিয়ক। আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g>বাৰ প্ৰয়াস কৰিব পাৰে।</item>        <item quantity="other">ছিমৰ পিন দিয়ক। আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g>বাৰ প্ৰয়াস কৰিব পাৰে।</item> diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index 71fd47ba0026..fe35bbc34bfa 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Cihaz admin tərəfindən kilidlənib"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihaz əl ilə kilidləndi"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmır"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Üz ilə Kiliddən Açma funksiyasını istifadə etmək üçün Ayarlar > Məxfilik bölməsində "<b>"Kameraya girişi"</b>" aktiv edin"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Üz ilə Kiliddən Açmanı istifadə etmək üçün Ayarlarda kameraya girişi aktiv edin"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM PIN-ni daxil edin. <xliff:g id="NUMBER_1">%d</xliff:g> cəhdiniz qalır.</item>        <item quantity="one">SIM PIN-ni daxil edin. Cihazınızı kiliddən çıxarmaq üçün operatorunuzla əlaqə saxlamadan öncə <xliff:g id="NUMBER_0">%d</xliff:g> cəhdiniz qalır.</item> 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 c04a766c31c2..5e83a153ff76 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrator je zaključao uređaj"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznat"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Da biste koristili otključavanje licem, uključite "<b>"pristup kameri"</b>" u odeljku Podešavanja > Privatnost"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Otključavanje licem traži pristup kameri u Podešavanjima"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>        <item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item> diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml index eda5497fe44a..0e6681ce8b3a 100644 --- a/packages/SystemUI/res-keyguard/values-be/strings.xml +++ b/packages/SystemUI/res-keyguard/values-be/strings.xml @@ -94,7 +94,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Прылада заблакіравана адміністратарам"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Прылада была заблакіравана ўручную"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распазнана"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Каб выкарыстоўваць распазнаванне твару, уключыце "<b>"доступ да камеры"</b>" праз раздзел \"Налады > Прыватнасць\""</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Для распазнавання твару ўключыце доступ да камеры"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Увядзіце PIN-код SIM-карты. У вас засталася <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item>        <item quantity="few">Увядзіце PIN-код SIM-карты. У вас засталося <xliff:g id="NUMBER_1">%d</xliff:g> спробы.</item> diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index b108a326e4d2..6983ceba9b6d 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Устройството е заключено от администратора"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Устройството бе заключено ръчно"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не е разпознато"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"За да използвате функцията „Отключване с лице“, включете "<b>"достъпа до камерата"</b>" от „Настройки > Поверителност“"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"За да ползвате „Отключване с лице“, вкл. достъпа до камерата от настройките"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Въведете ПИН кода за SIM картата – остават ви <xliff:g id="NUMBER_1">%d</xliff:g> опита.</item>        <item quantity="one">Въведете ПИН кода за SIM картата – остава ви <xliff:g id="NUMBER_0">%d</xliff:g> опит, преди да се наложи да се свържете с оператора си, за да отключите устройството.</item> diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index f96db50eefde..bbc025fe08bb 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"প্রশাসক ডিভাইসটি লক করেছেন"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইসটিকে ম্যানুয়ালি লক করা হয়েছে"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"শনাক্ত করা যায়নি"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"\'ফেস আনলক\' ফিচার ব্যবহার করতে \'সেটিংস ও গোপনীয়তা\' বিকল্পে গিয়ে "<b>"ক্যামেরায় অ্যাক্সেস দিন"</b></string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"\'ফেস আনলক\' ফিচার ব্যবহার করতে, \'সেটিংস\' থেকে ক্যামেরার অ্যাক্সেস চালু করুন"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">সিমের পিন লিখুন। আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন।</item>        <item quantity="other">সিমের পিন লিখুন। আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন।</item> diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 4a471579c9b0..e0bec8463ed5 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Uređaj je zaključao administrator"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Da koristite otključavanje licem, uključite "<b>"Pristup kameri"</b>" u meniju Postavke > Privatnost"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Za otključavanje licem uključite pristup kameri"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>        <item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item> diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index 9cc855ab3dee..1e30e788ed3a 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"L\'administrador ha bloquejat el dispositiu"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositiu s\'ha bloquejat manualment"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"No s\'ha reconegut"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Per utilitzar Desbloqueig facial, activa "<b>"Accés a la càmera"</b>" a Configuració > Privadesa"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Desbloqueig facial necessita accés a la càmera"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Introdueix el PIN de la SIM. Et queden <xliff:g id="NUMBER_1">%d</xliff:g> intents.</item>        <item quantity="one">Introdueix el PIN de la SIM. Et queda <xliff:g id="NUMBER_0">%d</xliff:g> intent; si no l\'encertes, contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu.</item> diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml index 606bff513d77..3c37bba3fe81 100644 --- a/packages/SystemUI/res-keyguard/values-cs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml @@ -94,7 +94,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Zařízení je uzamknuto administrátorem"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zařízení bylo ručně uzamčeno"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznáno"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pokud chcete používat odemknutí obličejem, v Nastavení > Soukromí zapnetě "<b>"přístup k fotoaparátu"</b></string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"V Nastavení zapněte přístup k fotoaparátu"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="few">Zadejte PIN SIM karty. Zbývají <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item>        <item quantity="many">Zadejte PIN SIM karty. Zbývá <xliff:g id="NUMBER_1">%d</xliff:g> pokusu.</item> diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index 8f7b8d0c4758..0774c520cb62 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Enheden er blevet låst af administratoren"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheden blev låst manuelt"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke genkendt"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Hvis du vil bruge ansigtslåsen, skal du aktivere "<b>"Kameraadgang"</b>" under Indstillinger > Privatliv"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Aktivér kameraadgang i Indstillinger for at bruge ansigtslås"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Angiv pinkoden til SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item>        <item quantity="other">Angiv pinkoden til SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item> diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index 6391ed001a05..c46c08f0e7e9 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Gerät vom Administrator gesperrt"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Gerät manuell gesperrt"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nicht erkannt"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Wenn du die Entsperrung per Gesichtserkennung verwenden möchtest, aktiviere in den Einstellungen unter „Datenschutz“ die Option "<b>"Kamerazugriff"</b></string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Die Gesichtsentsperrung benötigt Kamerazugriff"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Gib die PIN für die SIM-Karte ein. Du hast noch <xliff:g id="NUMBER_1">%d</xliff:g> Versuche.</item>        <item quantity="one">Gib die PIN für die SIM-Karte ein. Du hast noch <xliff:g id="NUMBER_0">%d</xliff:g> Versuch, bevor das Gerät nur noch vom Mobilfunkanbieter entsperrt werden kann.</item> diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml index a5bbb9a07e29..73afafa7e0cb 100644 --- a/packages/SystemUI/res-keyguard/values-el/strings.xml +++ b/packages/SystemUI/res-keyguard/values-el/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Η συσκευή κλειδώθηκε από τον διαχειριστή"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Η συσκευή κλειδώθηκε με μη αυτόματο τρόπο"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Δεν αναγνωρίστηκε"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Για να χρησιμοποιήσετε τη λειτουργία Ξεκλείδωμα με το πρόσωπο, ενεργοποιήστε την επιλογή "<b>"Πρόσβαση στην κάμερα"</b>" από το μενού Ρυθμίσεις > Απόρρητο"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Ενεργοπ. πρόσβ. κάμ. στις Ρυθμ. για Ξεκλείδ. με το πρόσωπο."</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Εισαγάγετε τον αριθμό PIN της κάρτας SIM. Απομένουν άλλες <xliff:g id="NUMBER_1">%d</xliff:g> προσπάθειες.</item>        <item quantity="one">Εισαγάγετε τον αριθμό PIN της κάρτας SIM. Απομένει άλλη <xliff:g id="NUMBER_0">%d</xliff:g> προσπάθεια. Στη συνέχεια, θα πρέπει να επικοινωνήσετε με τον πάροχο κινητής τηλεφωνίας, για να ξεκλειδώσετε τη συσκευή.</item> diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml index abfe5be358e4..0d08c428307c 100644 --- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"To use Face Unlock, turn on camera access in Settings"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>        <item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item> diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml index d96d2940c5bb..3356ec98ad2c 100644 --- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"To use Face Unlock, turn on camera access in Settings"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>        <item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your carrier to unlock your device.</item> diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml index abfe5be358e4..0d08c428307c 100644 --- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"To use Face Unlock, turn on camera access in Settings"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>        <item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item> diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml index abfe5be358e4..0d08c428307c 100644 --- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"To use Face Unlock, turn on camera access in Settings"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>        <item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item> diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml index 804b6ae3e26f..3c3194283be4 100644 --- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognized"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"To use Face Unlock, turn on camera access in Settings"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>        <item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your carrier to unlock your device.</item> diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index 1246b430ae66..07ce2a9815d9 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado por el administrador"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se bloqueó de forma manual"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoció"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar Desbloqueo facial, activa el "<b>"Acceso a la cámara"</b>" en Configuración y privacidad"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Activa acceso a cámara en Config. y usa Desb. facial"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>        <item quantity="other">Ingresa el PIN de la SIM. Quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos más.</item> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 4f61f3f1a6d2..2b5ee7ba14cf 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado por el administrador"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se ha bloqueado manualmente"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoce"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar Desbloqueo Facial, habilita el "<b>"acceso a la cámara"</b>" en Ajustes y privacidad"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Desbloqueo facial: activa el acceso a la cámara"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>        <item quantity="other">Introduce el PIN de la tarjeta SIM. Te quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item> diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index 9488054322d0..74ce06c3a00a 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administraator lukustas seadme"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Seade lukustati käsitsi"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tuvastatud"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Näoga avamise kasutamiseks lülitage menüüs Seaded > Privaatsus sisse "<b>"juurdepääs kaamerale"</b>"."</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Näoga avamise kasutamiseks andke seadetes juurdepääs kaamerale"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Sisestage SIM-kaardi PIN-kood. Jäänud on <xliff:g id="NUMBER_1">%d</xliff:g> katset.</item>        <item quantity="one">Sisestage SIM-kaardi PIN-kood. Jäänud on <xliff:g id="NUMBER_0">%d</xliff:g> katse enne, kui peate seadme avamiseks ühendust võtma operaatoriga.</item> diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index 41d467a8341b..19fc68a40ca0 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administratzaileak blokeatu egin du gailua"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Eskuz blokeatu da gailua"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ez da ezagutu"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Aurpegi bidez desblokeatzeko aukera erabiltzeko, aktibatu "<b>"kamera atzitzeko baimena"</b>" Ezarpenak > Pribatutasuna atalean"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Aurpegi bidezko desblokeoak kamera atzitzeko baimena behar du"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Idatzi SIMaren PINa. <xliff:g id="NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu.</item>        <item quantity="one">Idatzi SIMaren PINa. <xliff:g id="NUMBER_0">%d</xliff:g> saiakera geratzen zaizu; oker idatziz gero, operadoreari eskatu beharko diozu gailua desblokeatzeko.</item> diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index 11e401e40b33..6b90e8936199 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"دستگاه توسط سرپرست سیستم قفل شده است"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"دستگاه بهصورت دستی قفل شده است"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"شناسایی نشد"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"برای استفاده از «قفلگشایی با چهره»، "<b>"دسترسی به دوربین"</b>" را در «تنظیمات > حریم خصوصی» روشن کنید"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"برای استفاده از قفلگشایی با چهره، دسترسی دوربین را در تنظیمات روشن کنید"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">پین سیمکارت را وارد کنید. <xliff:g id="NUMBER_1">%d</xliff:g> تلاش دیگری باقی مانده است.</item>        <item quantity="other">پین سیمکارت را وارد کنید. <xliff:g id="NUMBER_1">%d</xliff:g> تلاش دیگری باقی مانده است.</item> diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml index 2fbb8ab2265d..f8aa5de1f268 100644 --- a/packages/SystemUI/res-keyguard/values-fi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Järjestelmänvalvoja lukitsi laitteen."</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Laite lukittiin manuaalisesti"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tunnistettu"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Jos haluat käyttää kasvojentunnistusavausta, valitse Asetukset > Yksityisyys ja laita "<b>"Pääsy kameraan"</b>" päälle"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Kasvojentunnistusavaus: Asetukset > pääsy kameraan"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Anna SIM-kortin PIN-koodi. Sinulla on <xliff:g id="NUMBER_1">%d</xliff:g> yritystä jäljellä.</item>        <item quantity="one">Anna SIM-kortin PIN-koodi. <xliff:g id="NUMBER_0">%d</xliff:g> yrityksen jälkeen laite lukittuu, ja vain operaattori voi avata sen.</item> diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index bfc8991ea6fb..827a9f036f29 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"L\'appareil a été verrouillé par l\'administrateur"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"L\'appareil a été verrouillé manuellement"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Doigt non reconnu"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pour utiliser le déverrouillage par reconnaissance faciale, activez l\'"<b>"accès à l\'appareil photo"</b>" dans Paramètres > Confidentialité"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Déverr. rec. faciale : activez accès app. photo dans Param."</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Entrez le NIP de votre carte SIM. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>        <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item> diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index 750e2bd25f7a..7dd24a508b57 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Appareil verrouillé par l\'administrateur"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Appareil verrouillé manuellement"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non reconnu"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pour utiliser le déverrouillage par reconnaissance faciale, activez "<b>"Accès à l\'appareil photo"</b>" dans Paramètres > Confidentialité"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Pour le déverrouillage par reconnaissance faciale, activez l\'accès à l\'app. photo dans Paramètres"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Saisissez le code de la carte SIM. <xliff:g id="NUMBER_1">%d</xliff:g> tentative restante.</item>        <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item> diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index b1c14fe59c9e..0d06dd8bb232 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"O administrador bloqueou o dispositivo"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo bloqueouse manualmente"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non se recoñeceu"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar o desbloqueo facial, activa "<b>"Acceso á cámara"</b>" en Configuración > Privacidade"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"O Desbloqueo facial necesita acceso á cámara"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Introduce o código PIN da SIM. Quédanche <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item>        <item quantity="one">Introduce o código PIN da SIM. Quédache <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que teñas que contactar co operador para desbloquear o dispositivo.</item> diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index 5dc4a1c77b3d..6142aa15049e 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"વ્યવસ્થાપકે ઉપકરણ લૉક કરેલું છે"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ઉપકરણ મેન્યુઅલી લૉક કર્યું હતું"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"ઓળખાયેલ નથી"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ફેસ અનલૉક સુવિધાનો ઉપયોગ કરવા માટે, સેટિંગ > પ્રાઇવસીમાં જઈને "<b>"કૅમેરા ઍક્સેસ"</b>" ચાલુ કરો"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"ફેસ અનલૉક વાપરવા સેટિંગમાં કૅમેરા ઍક્સેસ ચાલુ કરો"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">સિમનો પિન દાખલ કરો, તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે.</item>        <item quantity="other">સિમનો પિન દાખલ કરો, તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસો બાકી છે.</item> diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index 69a9dc93febb..742493aa1887 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"व्यवस्थापक ने डिवाइस को लॉक किया है"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिवाइस को मैन्युअल रूप से लॉक किया गया था"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"पहचान नहीं हो पाई"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"फ़ेस अनलॉक की सुविधा का इस्तेमाल करने के लिए, सेटिंग और निजता में जाकर, "<b>"कैमरे का ऐक्सेस"</b>" चालू करें"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"\'फ़ेस अनलॉक\' इस्तेमाल करने के लिए, सेटिंग में जाकर कैमरे का ऐक्सेस चालू करें"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">सिम का पिन डालें. आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> मौके बचे हैं.</item>        <item quantity="other">सिम का पिन डालें. आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> मौके बचे हैं.</item> diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml index de660d8cf8fd..292bfd18637b 100644 --- a/packages/SystemUI/res-keyguard/values-hr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrator je zaključao uređaj"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Da biste koristili otključavanje licem, uključite opciju "<b>"Pristup kameri"</b>" u odjeljku Postavke > Privatnost"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Za otključavanje licem uključite pristup kameri"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>        <item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item> diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index 88547404e168..b647f168ea0a 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"A rendszergazda zárolta az eszközt"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Az eszközt manuálisan lezárták"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nem ismerhető fel"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Az Arcalapú feloldás funkció használatához kapcsolja be a "<b>"Hozzáférés a kamerához"</b>" beállítást a Beállítások > Adatvédelem szakaszban."</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Arcalapú feloldáshoz Hozzáférés a kamerához szükséges"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Adja meg a SIM-kártya PIN-kódját. <xliff:g id="NUMBER_1">%d</xliff:g> próbálkozása maradt.</item>        <item quantity="one">Adja meg a SIM-kártya PIN-kódját. <xliff:g id="NUMBER_0">%d</xliff:g> próbálkozása maradt. Ha elfogynak a próbálkozási lehetőségek, az eszköz feloldásához fel kell vennie a kapcsolatot szolgáltatójával.</item> diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index 94fdedde0b8d..2af6e7bbf619 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Սարքը կողպված է ադմինիստրատորի կողմից"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Սարքը կողպվել է ձեռքով"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Չհաջողվեց ճանաչել"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Դեմքով ապակողպումն օգտագործելու համար անցեք Կարգավորումներ > Գաղտնիություն և տրամադրեք "<b>"տեսախցիկն օգտագործելու թույլտվություն"</b>"։"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Դեմքով ապակողպման համար թույլատրեք տեսախցիկի օգտագործումը"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Մուտքագրեք SIM քարտի PIN կոդը: Մնացել է <xliff:g id="NUMBER_1">%d</xliff:g> փորձ:</item>        <item quantity="other">Մուտքագրեք SIM քարտի PIN կոդը: Մնացել է <xliff:g id="NUMBER_1">%d</xliff:g> փորձ:</item> diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index b16031ab9a71..1bd0db26d27c 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Perangkat dikunci oleh admin"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Perangkat dikunci secara manual"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Untuk menggunakan Face Unlock, aktifkan "<b>"Akses kamera"</b>" di Setelan > Privasi"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Untuk pakai Face Unlock, beri akses kamera di Setelan"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Masukkan PIN SIM. Tersisa <xliff:g id="NUMBER_1">%d</xliff:g> percobaan.</item>        <item quantity="one">Masukkan PIN SIM. Tersisa <xliff:g id="NUMBER_0">%d</xliff:g> percobaan sebelum Anda harus menghubungi operator untuk membuka kunci perangkat.</item> diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index 8f6b18b9ab4f..fc3af8403558 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Kerfisstjóri læsti tæki"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Tækinu var læst handvirkt"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Þekktist ekki"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Þú verður að kveikja á "<b>"aðgangi að myndavél"</b>" í „Stillingar > persónuvernd“ til að nota andlitskenni"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Kveiktu á myndavélaaðgangi í stillingum til að nota andlitskenni"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Sláðu inn PIN-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraun eftir.</item>        <item quantity="other">Sláðu inn PIN-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraunir eftir.</item> diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index bbfb0b51294e..f8f3fd288039 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloccato dall\'amministratore"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Il dispositivo è stato bloccato manualmente"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non riconosciuto"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Per utilizzare lo sblocco con il volto, attiva "<b>"l\'accesso alla fotocamera"</b>" in Impostazioni > Privacy"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Sblocco con volto richiede l\'accesso alla fotocamera"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>        <item quantity="other">Inserisci il codice PIN della SIM. Hai ancora <xliff:g id="NUMBER_1">%d</xliff:g> tentativi a disposizione.</item> diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index ce43b15c7839..90b48289d802 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -94,7 +94,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"המנהל של המכשיר נהל אותו"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"המכשיר ננעל באופן ידני"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"לא זוהתה"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"כדי להשתמש בתכונה \'פתיחה ע\"י זיהוי הפנים\', יש להפעיל את ה"<b>"גישה למצלמה"</b>" בהגדרות > פרטיות"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"לזיהוי הפנים יש להפעיל את הגישה למצלמה בהגדרות"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="two">יש להזין קוד אימות של כרטיס SIM. נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות נוספים.</item>        <item quantity="many">יש להזין קוד אימות של כרטיס SIM. נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות נוספים.</item> diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index 07b3c87053d7..471bc12a2568 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"デバイスは管理者によりロックされています"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"デバイスは手動でロックされました"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"認識されませんでした"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"顔認証を使用するには、[設定] > [プライバシー] で"<b>"カメラへのアクセス"</b>"を有効にしてください"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"顔認証の使用: 設定でカメラアクセスを有効にしてください"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM PIN を入力してください。入力できるのはあと <xliff:g id="NUMBER_1">%d</xliff:g> 回です。</item>        <item quantity="one">SIM PIN を入力してください。入力できるのはあと <xliff:g id="NUMBER_0">%d</xliff:g> 回です。この回数を超えた場合は、携帯通信会社にお問い合わせください。</item> diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index f2341c6f56d2..6f9fed978296 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"მოწყობილობა ჩაკეტილია ადმინისტრატორის მიერ"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"მოწყობილობა ხელით ჩაიკეტა"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"არ არის ამოცნობილი"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"იმისთვის, რომ სახით განბლოკვით ისარგებლოთ, ჩართეთ "<b>"კამერაზე წვდომა"</b>" პარამეტრებსა და კონფიდენციალურობაში"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"სახით განბლოკვით სარგებლობისთვის, ჩართეთ კამერაზე წვდომა პარამეტრებში"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">შეიყვანეთ SIM ბარათის PIN-კოდი. თქვენ დაგრჩათ <xliff:g id="NUMBER_1">%d</xliff:g> მცდელობა.</item>        <item quantity="one">შეიყვანეთ SIM ბარათის PIN-კოდი. თქვენ დაგრჩათ <xliff:g id="NUMBER_0">%d</xliff:g> მცდელობა, რომლის შემდეგაც მოწყობილობის განსაბლოკად დაგჭირდებათ თქვენს ოპერატორთან დაკავშირება.</item> diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index 20bba0f9f271..f4a51bd9173f 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Құрылғыны әкімші құлыптаған"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Құрылғы қолмен құлыпталды"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Танылмады"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Face Unlock функциясын пайдалану үшін \"Параметрлер > Құпиялылық\" бөлімінен "<b>"Камераны пайдалану рұқсатын"</b>" қосыңыз."</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Face Unlock функциясын пайдалану үшін параметрлерден камераны пайдалану рұқсатын қосыңыз."</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM PIN кодын енгізіңіз. <xliff:g id="NUMBER_1">%d</xliff:g> мүмкіндік қалды, одан кейін оператордан SIM картасының құлпын ашуды сұрауға тура келеді.</item>        <item quantity="one">SIM PIN кодын енгізіңіз. <xliff:g id="NUMBER_0">%d</xliff:g> мүмкіндік қалды, одан кейін оператордан SIM картасының құлпын ашуды сұрауға тура келеді.</item> diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index 236c3189c2d2..8c90dec4f5fe 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ឧបករណ៍ត្រូវបានចាក់សោដោយអ្នកគ្រប់គ្រង"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ឧបករណ៍ត្រូវបានចាក់សោដោយអ្នកប្រើផ្ទាល់"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"មិនអាចសម្គាល់បានទេ"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ដើម្បីប្រើមុខងារដោះសោតាមទម្រង់មុខ សូមបើក"<b>"ការចូលប្រើកាមេរ៉ា"</b>"នៅក្នុងការកំណត់ > ឯកជនភាព"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"ដើម្បីដោះសោតាមទម្រង់មុខ សូមបើកសិទ្ធិចូលប្រើកាមេរ៉ានៅក្នុងការកំណត់"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">បញ្ចូលកូដ PIN របស់ស៊ីម។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="NUMBER_1">%d</xliff:g> ដងទៀត។</item>        <item quantity="one">បញ្ចូលកូដ PIN របស់ស៊ីម។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="NUMBER_0">%d</xliff:g> ដងទៀត មុនពេលដែលអ្នកត្រូវទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នកដើម្បីដោះសោឧបករណ៍របស់អ្នក។</item> diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index 716cbf616c99..3299872b3f3c 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ನಿರ್ವಾಹಕರು ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಿದ್ದಾರೆ"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ಸಾಧನವನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಬಳಸಲು, ಸೆಟ್ಟಿಂಗ್ಗಳು > ಗೌಪ್ಯತೆ ಎಂಬಲ್ಲಿ "<b>"ಕ್ಯಾಮರಾ ಪ್ರವೇಶವನ್ನು"</b>" ಆನ್ ಮಾಡಿ"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಬಳಸಲು, ಸೆಟ್ಟಿಂಗ್ಸ್ನಲ್ಲಿ ಕ್ಯಾಮರಾ ಪ್ರವೇಶ ಆನ್ ಮಾಡಿ"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ. ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ.</item>        <item quantity="other">ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ. ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ.</item> diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index e698017a95e4..ebddae216413 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"관리자가 기기를 잠갔습니다."</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"기기가 수동으로 잠금 설정되었습니다."</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"인식할 수 없음"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"얼굴 인식 잠금 해제를 사용하려면 설정 > 개인 정보 보호에서 "<b>"카메라 액세스"</b>"를 사용 설정하세요."</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"얼굴 인식 잠금 해제를 사용하려면 설정에서 카메라 액세스를 사용 설정하세요."</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM PIN을 입력하세요. 입력은 <xliff:g id="NUMBER_1">%d</xliff:g>번 더 시도할 수 있습니다.</item>        <item quantity="one">SIM PIN을 입력하세요. 입력에 <xliff:g id="NUMBER_0">%d</xliff:g>번 더 실패하면 이동통신사에 문의하여 기기를 잠금 해제해야 합니다.</item> diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index 1df29e1b7c2d..f6ed69dc3958 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Түзмөктү администратор кулпулап койгон"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Түзмөк кол менен кулпуланды"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Таанылган жок"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Жүзүнөн таанып ачуу функциясын колдонуу үчүн Жөндөөлөр > Купуялык бөлүмүнө өтүп, "<b>"Камераны колдонууну"</b>" күйгүзүңүз"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Жөндөөлөрдөн камерага уруксат беришиңиз керек"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM-картанын PIN кодун киргизиңиз. Сизде <xliff:g id="NUMBER_1">%d</xliff:g> аракет калды.</item>        <item quantity="one">SIM-картанын PIN кодун киргизиңиз. Сизде <xliff:g id="NUMBER_0">%d</xliff:g> аракет калды, андан кийин түзмөктү бөгөттөн чыгаруу үчүн байланыш операторуна кайрылышыңыз керек болот.</item> diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index a01cd7ccfe6c..1948f233fa41 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ອຸປະກອນຖືກລັອກໂດຍຜູ້ເບິ່ງແຍງລະບົບ"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ອຸປະກອນຖືກສັ່ງໃຫ້ລັອກ"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"ບໍ່ຮູ້ຈັກ"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ເພື່ອໃຊ້ການປົດລັອກດ້ວຍໜ້າ, ກະລຸນາເປີດໃຊ້ "<b>"ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ"</b>" ໃນການຕັ້ງຄ່າ > ຄວາມເປັນສ່ວນຕົວ"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"ເພື່ອໃຊ້ການປົດລັອກດ້ວຍໜ້າ, ໃຫ້ເປີດໃຊ້ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບໃນການຕັ້ງຄ່າ"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">ລະຫັດ SIM PIN ບໍ່ຖືກຕ້ອງ. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ.</item>        <item quantity="one">ໃສ່ລະຫັດ SIM PIN. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ຈະຕ້ອງຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການເພື່ອປົດລັອກ.</item> diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index 64e600e4cfde..59135a9ab3f8 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -94,7 +94,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Įrenginį užrakino administratorius"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Įrenginys užrakintas neautomatiškai"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Neatpažinta"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Jei norite naudoti atrakinimą pagal veidą, įjunkite parinktį "<b>"Prieiga prie fotoaparato"</b>" skiltyje „Nustatymai“ > „Privatumas“"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Jei nor. naud. atr. pagal veidą, įj. pr. prie fotoap. sk. „Nustatymai“"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymas.</item>        <item quantity="few">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymai.</item> diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index 9cd30a1f4ff7..88bb11422d74 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrators bloķēja ierīci."</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Ierīce tika bloķēta manuāli."</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nav atpazīts"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Lai izmantotu autorizāciju pēc sejas, sadaļā Iestatījumi > Konfidencialitāte ieslēdziet opciju "<b>"Piekļuve kamerai"</b>"."</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Lai izmantotu autorizāciju pēc sejas, iestatījumos ieslēdziet piekļuvi kamerai."</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="zero">Ievadiet SIM kartes PIN. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizes.</item>        <item quantity="one">Ievadiet SIM kartes PIN. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizi.</item> diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index c5cad18a2e6e..7eb7a00ae013 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Уредот е заклучен од администраторот"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уредот е заклучен рачно"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Непознат"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"За да користите „Отклучување со лик“, вклучете "<b>"Пристап до камерата"</b>" во „Поставки > Приватност“"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"За „Отклучување со лик“, вклучете пристап до камерата"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Внесете PIN-код за SIM-картичката. Ви преостанува уште <xliff:g id="NUMBER_1">%d</xliff:g> обид.</item>        <item quantity="other">Внесете PIN-код за SIM-картичката. Ви преостануваат уште <xliff:g id="NUMBER_1">%d</xliff:g> обиди.</item> diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 2b0efc8d0817..32bf03c252b3 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ഉപകരണം അഡ്മിൻ ലോക്കുചെയ്തു"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ഉപകരണം നേരിട്ട് ലോക്കുചെയ്തു"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"തിരിച്ചറിയുന്നില്ല"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ഫെയ്സ് അൺലോക്ക് ഉപയോഗിക്കാൻ, ക്രമീകരണം > സ്വകാര്യത എന്നതിൽ "<b>"ക്യാമറാ ആക്സസ്"</b>" ഓണാക്കുക"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"ഫെയ്സ് അൺലോക്കിന് ക്രമീകരണത്തിൽ ക്യാമറാ ആക്സസ് ഓണാക്കൂ"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">സിം പിൻ നൽകുക. നിങ്ങൾക്ക് <xliff:g id="NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു.</item>        <item quantity="one">സിം പിൻ നൽകുക. ഉപകരണം അൺലോക്ക് ചെയ്യാൻ കാരിയറുമായി ബന്ധപ്പെടേണ്ടിവരുന്നതിന് മുമ്പ് <xliff:g id="NUMBER_0">%d</xliff:g> ശ്രമം കൂടി ശേഷിക്കുന്നു.</item> diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index 82fbaf1ac029..ba167cf1bc24 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Админ төхөөрөмжийг түгжсэн"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Төхөөрөмжийг гараар түгжсэн"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Таньж чадсангүй"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Царайгаар түгжээ тайлахыг ашиглахын тулд Тохиргоо > Нууцлал хэсэгт "<b>" Камерын хандалтыг "</b>" асаана уу"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Царайгаар түгжээ тайлахыг ашиглахын тулд Тохиргоо хэсэгт камерын хандалтыг асаана уу"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM-н ПИН кодыг оруулна уу. Танд <xliff:g id="NUMBER_1">%d</xliff:g> оролдлого үлдлээ.</item>        <item quantity="one">SIM-н ПИН кодыг оруулна уу. Танд оператор компанитайгаа холбогдохгүйгээр төхөөрөмжийн түгжээг тайлах <xliff:g id="NUMBER_0">%d</xliff:g> оролдлого үлдлээ.</item> diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index 012c83b468de..28368f9038dd 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"प्रशासकाद्वारे लॉक केलेले डिव्हाइस"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिव्हाइस मॅन्युअली लॉक केले होते"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"ओळखले नाही"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"फेस अनलॉक वापरण्यासाठी, सेटिंग्ज > गोपनीयता येथे "<b>"कॅमेरा अॅक्सेस"</b>" सुरू करा"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"फेस अनलॉक साठी, सेटिंग्ज मध्ये कॅमेराचा अॅक्सेस द्या"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">सिम पिन एंटर करा, तुमच्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत.</item>        <item quantity="one">सिम पिन एंटर करा. तुम्ही तुमचे डिव्हाइस अनलॉक करण्यासाठी तुमच्या वाहकाशी संपर्क साधण्यापूर्वी, तुमच्याकडे <xliff:g id="NUMBER_0">%d</xliff:g> प्रयत्न शिल्लक आहे.</item> diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index 29672c16240d..e2efa906627e 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Peranti dikunci oleh pentadbir"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Peranti telah dikunci secara manual"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Untuk menggunakan Buka Kunci Wajah, hidupkan "<b>"akses Kamera"</b>" dalam Tetapan > Privasi"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Hidupkan kamera dalam Tetapan untuk Buka Kunci Wajah"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Masukkan PIN SIM. Tinggal <xliff:g id="NUMBER_1">%d</xliff:g> percubaan lagi.</item>        <item quantity="one">Masukkan PIN SIM. Tinggal <xliff:g id="NUMBER_0">%d</xliff:g> percubaan lagi sebelum anda perlu menghubungi pembawa anda untuk membuka kunci peranti.</item> diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index 91dcb9c43789..fd624502a276 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"စက်ပစ္စည်းကို စီမံခန့်ခွဲသူက လော့ခ်ချထားပါသည်"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"စက်ပစ္စည်းကို ကိုယ်တိုင်ကိုယ်ကျ လော့ခ်ချထားခဲ့သည်"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"မသိ"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်းကို သုံးရန် "<b>"ကင်မရာ သုံးခွင့်"</b>" ကို ‘ဆက်တင်များ > ကန့်သတ်ဆက်တင်’ တွင်ဖွင့်ပါ"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"‘မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း’ သုံးရန် ‘ဆက်တင်များ’ တွင်ကင်မရာသုံးခွင့်ကိုဖွင့်ပါ"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">ဆင်းမ်ကတ် ပင်နံပါတ် ထည့်ပါ။ <xliff:g id="NUMBER_1">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့်ရှိပါသေးသည်။</item>        <item quantity="one">ဆင်းမ်ကတ် ပင်နံပါတ် ထည့်ပါ။ သင့်စက်ကို လော့ခ်ဖွင့်ပေးရန်အတွက် ဝန်ဆောင်မှုပေးသူသို့ မဆက်သွယ်မီ <xliff:g id="NUMBER_0">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့်ရှိပါသေးသည်။</item> diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index c8d6b71eb485..474700c88e22 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Enheten er låst av administratoren"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten ble låst manuelt"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke gjenkjent"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"For å bruke ansiktslås, slå på "<b>"Kameratilgang"</b>" i Innstillinger > Personvern"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Slå på kameratilgang i Innstillinger for å bruke ansiktslås"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Skriv inn PIN-koden for SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøk igjen.</item>        <item quantity="one">Skriv inn PIN-koden for SIM-kortet. Du har <xliff:g id="NUMBER_0">%d</xliff:g> forsøk igjen før du må kontakte operatøren din for å låse opp enheten.</item> diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index 39548de38f73..c55aa8f24951 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"प्रशासकले यन्त्रलाई लक गर्नुभएको छ"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"यन्त्रलाई म्यानुअल तरिकाले लक गरिएको थियो"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"पहिचान भएन"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"फेस अनलक प्रयोग गर्न \"सेटिङ तथा गोपनीयता\" मा गई "<b>"क्यामेरा प्रयोग गर्ने अनुमति"</b>" दिनुहोस्"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"तपाईं \"फेस अनलक\" प्रयोग गर्न चाहनुहुन्छ भने सेटिङमा गई क्यामेरा प्रयोग गर्ने अनुमति दिनुहोस्"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM को PIN प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="NUMBER_1">%d</xliff:g>  प्रयासहरू बाँकी छन्।</item>        <item quantity="one">SIM को PIN प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="NUMBER_0">%d</xliff:g> प्रयास बाँकी छ, त्यसपछि भने आफ्नो डिभाइस अनलक गर्नका लागि तपाईंले अनिवार्य रूपमा आफ्नो सेवा प्रदायकलाई सम्पर्क गर्नु पर्ने हुन्छ।</item> diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index e97fde489361..18558eb3dbe7 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Apparaat vergrendeld door beheerder"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Apparaat is handmatig vergrendeld"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Niet herkend"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Als je Ontgrendelen via gezichtsherkenning wilt gebruiken, zet je "<b>"Cameratoegang"</b>" aan via Instellingen > Privacy"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Zet cameratoegang aan in Instellingen om Ontgrendelen via gezichtsherkenning te gebruiken"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Geef de pincode van de simkaart op. Je hebt nog <xliff:g id="NUMBER_1">%d</xliff:g> pogingen over.</item>        <item quantity="one">Geef de pincode van de simkaart op. Je hebt nog <xliff:g id="NUMBER_0">%d</xliff:g> poging over voordat je contact met je provider moet opnemen om het apparaat te ontgrendelen.</item> diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml index 9f8c7d98129a..239cc8ff66f2 100644 --- a/packages/SystemUI/res-keyguard/values-or/strings.xml +++ b/packages/SystemUI/res-keyguard/values-or/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ଡିଭାଇସ୍ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଲକ୍ କରାଯାଇଛି"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ଡିଭାଇସ୍ ମାନୁଆଲ ଭାବେ ଲକ୍ କରାଗଲା"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ଫେସ ଅନଲକ ବ୍ୟବହାର କରିବା ପାଇଁ, ସେଟିଂସ ଏବଂ ଗୋପନୀୟତାରେ "<b>"କ୍ୟାମେରା ଆକ୍ସେସ"</b>"କୁ ଚାଲୁ କରନ୍ତୁ"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"ଫେସ ଅନଲକର ବ୍ୟବହାର ପାଇଁ ସେଟିଂସରେ କ୍ୟାମେରାକୁ ଆକ୍ସେସ ଦିଅ"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM PIN ଲେଖନ୍ତୁ। ଆପଣଙ୍କ ଡିଭାଇସକୁ ଅନଲକ କରିବା ପାଇଁ ପାଖରେ ବଳକା ଥିବା <xliff:g id="NUMBER_1">%d</xliff:g>ଟି ପ୍ରୟାସର ବ୍ୟବହାର କରିବା ପୂର୍ବରୁ ନିଜର କ୍ଯାରିଅରଙ୍କ ସହ କଣ୍ଟାକ୍ଟ କରନ୍ତୁ।</item>        <item quantity="one">SIM PIN ଲେଖନ୍ତୁ। ଆପଣଙ୍କ ଡିଭାଇସକୁ ଅନଲକ କରିବା ପାଇଁ ପାଖରେ ବଳକା ଥିବା <xliff:g id="NUMBER_0">%d</xliff:g>ଟି ପ୍ରୟାସର ବ୍ୟବହାର କରିବା ପୂର୍ବରୁ ନିଜର କ୍ଯାରିଅରଙ୍କ ସହ କଣ୍ଟାକ୍ଟ କରନ୍ତୁ।</item> diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index 858682c96e2a..243bbc3b6291 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਡੀਵਾਈਸ ਨੂੰ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ਡੀਵਾਈਸ ਨੂੰ ਹੱਥੀਂ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ਫ਼ੇਸ ਅਣਲਾਕ ਨੂੰ ਵਰਤਣ ਲਈ, ਸੈਟਿੰਗਾਂ > ਪਰਦੇਦਾਰੀ ਵਿੱਚ ਜਾ ਕੇ "<b>"ਕੈਮਰਾ ਪਹੁੰਚ"</b>" ਨੂੰ ਚਾਲੂ ਕਰੋ"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"ਫ਼ੇਸ ਅਣਲਾਕ ਵਰਤਣ ਲਈ, ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਕੈਮਰਾ ਪਹੁੰਚ ਚਾਲੂ ਕਰੋ"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ। ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ।</item>        <item quantity="other">ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ। ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ।</item> diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index f1a53e03abd2..5165b10f02d0 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -94,7 +94,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Urządzenie zablokowane przez administratora"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Urządzenie zostało zablokowane ręcznie"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nie rozpoznano"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Aby używać rozpoznawania twarzy, włącz "<b>"dostęp do aparatu"</b>" w Ustawieniach i prywatności"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Aby używać rozpoznawania twarzy, włącz w Ustawieniach dostęp do aparatu"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="few">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> próby.</item>        <item quantity="many">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> prób.</item> diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index 6bf242e6a813..c30f1d1e490f 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo administrador"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar o Desbloqueio facial, ative o "<b>"acesso à câmera"</b>" em Configurações > Privacidade"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Para usar o Desbloqueio facial, ative o acesso à câmera nas Configurações"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Informe o PIN do chip. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativa restante.</item>        <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item> diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index 8851067b946b..b1725864d286 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo gestor"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido."</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para utilizar o Desbloqueio facial, ative o "<b>"Acesso à câmara"</b>" em Definições > Privacidade"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Ative acesso à câmara nas Def. p/ usar Desbl. facial"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>        <item quantity="other">Introduza o PIN do cartão SIM. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item> diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index 6bf242e6a813..c30f1d1e490f 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo administrador"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar o Desbloqueio facial, ative o "<b>"acesso à câmera"</b>" em Configurações > Privacidade"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Para usar o Desbloqueio facial, ative o acesso à câmera nas Configurações"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Informe o PIN do chip. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativa restante.</item>        <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item> diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 8379f3f7ffa2..5ff8de002cb0 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispozitiv blocat de administrator"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Dispozitivul a fost blocat manual"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nu este recunoscut"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pentru a folosi Deblocarea facială, activează "<b>"Accesul la cameră"</b>" în Setări și confidențialitate"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Pentru Deblocare facială, activează accesul la cameră"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="few">Introdu codul PIN pentru cardul SIM. Ți-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> încercări.</item>        <item quantity="other">Introdu codul PIN pentru cardul SIM. Ți-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> de încercări.</item> diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml index 364c8b70fc6f..435a40cf3c9a 100644 --- a/packages/SystemUI/res-keyguard/values-ru/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml @@ -94,7 +94,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Устройство заблокировано администратором"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Устройство было заблокировано вручную"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распознано"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Чтобы использовать фейсконтроль, разрешите "<b>"доступ к камере"</b>". Для этого перейдите в настройки и нажмите \"Конфиденциальность\"."</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"В настройках разрешите фейсконтролю доступ к камере."</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Введите PIN-код. Осталась <xliff:g id="NUMBER_1">%d</xliff:g> попытка.</item>        <item quantity="few">Введите PIN-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попытки.</item> diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 5e934cc230ec..ada19dd42602 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ඔබගේ පරිපාලක විසින් උපාංගය අගුළු දමා ඇත"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"උපාංගය හස්තීයව අගුලු දමන ලදී"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"හඳුනා නොගන්නා ලදී"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"මුහුණෙන් අගුලු හැරීම භාවිත කිරීමට, සැකසීම් > පෞද්ගලිකත්වය තුළ "<b>"කැමරා ප්රවේශය"</b>" ක්රියාත්මක කරන්න"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"මුහුණෙන් අගුලු හැරීමට, සැකසීම් තුළ කැමරා ප්රවේශය සක්රීය කරන්න"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">SIM PIN ඇතුළු කරන්න, ඔබ සතුව උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item>        <item quantity="other">SIM PIN ඇතුළු කරන්න, ඔබ සතුව උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item> diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index 187683fa3841..b1bff53ea513 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -94,7 +94,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Zariadenie zamkol správca"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zariadenie bolo uzamknuté ručne"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznané"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Ak chcete používať odomknutie tvárou, v sekcii Nastavenia > Ochrana súkromia zapnite "<b>"prístup ku kamere"</b></string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"V nastaveniach zapnite prístup ku kamere"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="few">Zadajte kód PIN SIM karty. Zostávajú vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item>        <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item> diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index 17c590f399a1..274a24ea4717 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -94,7 +94,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Napravo je zaklenil skrbnik"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Naprava je bila ročno zaklenjena"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ni prepoznano"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Če želite uporabljati odklepanje z obrazom, v meniju »Nastavitve« > »Zasebnost« vklopite možnost "<b>"Dostop do fotoaparata"</b>"."</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Odklepanje z obrazom potrebuje dostop do fotoaparata."</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskus.</item>        <item quantity="two">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskusa.</item> diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index 16adc13a4bb7..58773aeea473 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Pajisja është e kyçur nga administratori"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Pajisja është kyçur manualisht"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nuk njihet"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Për të përdorur \"Shkyçjen me fytyrë\", aktivizo "<b>"Qasjen te kamera"</b>" te \"Cilësimet\" > \"Privatësia\""</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Për \"Shkyçjen me fytyrë\", aktivizo qasjen te kamera te \"Cilësimet\""</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Fut kodin PIN të kartës SIM. Të kanë mbetur edhe <xliff:g id="NUMBER_1">%d</xliff:g> tentativa.</item>        <item quantity="one">Fut kodin PIN të kartës SIM. Të ka mbetur edhe <xliff:g id="NUMBER_0">%d</xliff:g> tentativë para se të duhet të kontaktosh me operatorin tënd celular për ta shkyçur pajisjen.</item> diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index 2fb293952672..15c31a0eb981 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -92,7 +92,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Администратор је закључао уређај"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уређај је ручно закључан"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Није препознат"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Да бисте користили откључавање лицем, укључите "<b>"приступ камери"</b>" у одељку Подешавања > Приватност"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Откључавање лицем тражи приступ камери у Подешавањима"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Унесите PIN за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушај.</item>        <item quantity="few">Унесите PIN за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушаја.</item> diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml index 8e58b901223c..8f8bddeed051 100644 --- a/packages/SystemUI/res-keyguard/values-sv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administratören har låst enheten"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten har låsts manuellt"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Identifierades inte"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Om du vill använda ansiktslås aktiverar du "<b>"Kameraåtkomst"</b>" i Inställningar > Integritet"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"För ansiktslås aktiverar du kameraåtkomst i Inställn."</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Ange pinkod för SIM-kortet. <xliff:g id="NUMBER_1">%d</xliff:g> försök återstår.</item>        <item quantity="one">Ange pinkod för SIM-kortet. <xliff:g id="NUMBER_0">%d</xliff:g> försök återstår innan du måste kontakta operatören för att låsa upp enheten.</item> diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index 193bb606bb62..06d168b488c5 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Msimamizi amefunga kifaa"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Umefunga kifaa mwenyewe"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Haitambuliwi"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Ili utumie kipengele cha kufungua kwa uso, washa kipengele cha "<b>"ufikiaji wa Kamera"</b>" katika Mipangilio na Faragha"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Ili ufungue kwa Uso, ruhusu kamera ifikiwe"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Weka PIN ya SIM. Zimesalia mara <xliff:g id="NUMBER_1">%d</xliff:g> za kujaribu.</item>        <item quantity="one">Weka PIN ya SIM. Ukijaribu tena mara <xliff:g id="NUMBER_0">%d</xliff:g> bila kufaulu, kifaa chako kitafungwa na utalazimika uwasiliane na mtoa huduma wako ili akifungue.</item> diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index cfa865a91c83..3531aa367ec4 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"நிர்வாகி சாதனத்தைப் பூட்டியுள்ளார்"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"பயனர் சாதனத்தைப் பூட்டியுள்ளார்"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"அடையாளங்காணபடவில்லை"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"முகம் காட்டித் திறத்தல் அம்சத்தைப் பயன்படுத்த, அமைப்புகள் > தனியுரிமை என்பதற்குச் சென்று "<b>"கேமரா அணுகலை"</b>" இயக்கவும்"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"முகம் காட்டித் திறத்தல் அம்சத்தைப் பயன்படுத்த, அமைப்புகளில் கேமரா அணுகலை இயக்கவும்"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">சிம் பின்னை உள்ளிடவும். மேலும், <xliff:g id="NUMBER_1">%d</xliff:g> வாய்ப்புகள் மீதமுள்ளன.</item>        <item quantity="one">சிம் பின்னை உள்ளிடவும். மீதமுள்ள <xliff:g id="NUMBER_0">%d</xliff:g> வாய்ப்பில் தவறுதலான பின் உள்ளிடப்பட்டால், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தை அன்லாக் செய்ய முடியும்.</item> diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index 4d2085b2d4a5..9a9e803cb72a 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"పరికరం నిర్వాహకుల ద్వారా లాక్ చేయబడింది"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"పరికరం మాన్యువల్గా లాక్ చేయబడింది"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"గుర్తించలేదు"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ఫేస్ అన్లాక్ను ఉపయోగించడానికి, సెట్టింగ్లు > గోప్యతలో "<b>"కెమెరా యాక్సెస్"</b>"ను ఆన్ చేయండి"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"ఫేస్ అన్లాక్ వాడేందుకు కెమెరా యాక్సెస్ ఆన్లో ఉండాలి"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM పిన్ని నమోదు చేయండి. మీకు <xliff:g id="NUMBER_1">%d</xliff:g> ప్రయత్నలు మిగిలి ఉన్నాయి.</item>        <item quantity="one">SIM పిన్ని నమోదు చేయండి, మీరు మీ పరికరాన్ని అన్లాక్ చేయడానికి తప్పనిసరిగా మీ క్యారియర్ను సంప్రదించడానికి ముందు మీకు <xliff:g id="NUMBER_0">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది.</item> diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index 10bdd0c3eba8..69920542d20f 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ผู้ดูแลระบบล็อกอุปกรณ์"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"มีการล็อกอุปกรณ์ด้วยตัวเอง"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"ไม่รู้จัก"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"หากต้องการใช้ปลดล็อกด้วยใบหน้า ให้เปิด"<b>"การเข้าถึงกล้อง"</b>"ในการตั้งค่าและความเป็นส่วนตัว"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"เปิดการเข้าถึงกล้องในการตั้งค่าเพื่อใช้การปลดล็อกด้วยใบหน้า"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">โปรดป้อน PIN ของซิม คุณพยายามได้อีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง</item>        <item quantity="one">โปรดป้อน PIN ของซิม คุณพยายามได้อีก <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งก่อนที่จะต้องติดต่อผู้ให้บริการเพื่อปลดล็อกอุปกรณ์</item> diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 85fcb7a4aac0..12b7635fe637 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Na-lock ng admin ang device"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Manual na na-lock ang device"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Hindi nakilala"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para magamit ang Pag-unlock Gamit ang Mukha, i-on ang "<b>"Access sa camera"</b>" sa Mga Setting > Privacy"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Para sa Pag-unlock Gamit ang Mukha, i-on ang access ng camera sa Mga Setting"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Ilagay ang PIN ng SIM. Mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> natitirang pagsubok.</item>        <item quantity="other">Ilagay ang PIN ng SIM. Mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> na natitirang pagsubok.</item> diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index e9c3d5a0bfe6..fb08042a81f0 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Cihaz, yönetici tarafından kilitlendi"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihazın manuel olarak kilitlendi"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmadı"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Yüz Tanıma Kilidi\'ni kullanmak için Ayarlar > Gizlilik bölümünden "<b>"Kamera erişimi"</b>"\'ni açın"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Yüz Tanıma Kilidi için Ayarlar\'da kamera erişimini açın"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM PIN\'inizi girin. <xliff:g id="NUMBER_1">%d</xliff:g> deneme hakkınız kaldı.</item>        <item quantity="one">SIM PIN\'inizi girin. Cihazınızın kilidini açmak için operatörünüzle bağlantı kurmak zorunda kalmadan önce <xliff:g id="NUMBER_0">%d</xliff:g> deneme hakkınız kaldı.</item> diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index ae2131c8fdd1..2aa4efc482b7 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -94,7 +94,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Адміністратор заблокував пристрій"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Пристрій заблоковано вручну"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не розпізнано"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Щоб використовувати фейсконтроль, увімкніть "<b>"Доступ до камери"</b>" в розділі \"Налаштування\" > \"Конфіденційність\""</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Для фейсконтролю надайте доступ до камери"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Введіть PIN-код SIM-карти. Залишилася <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item>        <item quantity="few">Введіть PIN-код SIM-карти. Залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроби.</item> diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index 3e1245e07df6..dafa2f638898 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"آلہ منتظم کی جانب سے مقفل ہے"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"آلہ کو دستی طور پر مقفل کیا گیا تھا"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"تسلیم شدہ نہیں ہے"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"فیس اَنلاک کا استعمال کرنے کے لیے، ترتیبات اور رازداری میں "<b>"کیمرے تک رسائی"</b>" کو آن کریں"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"فیس اَنلاک استعمال کرنے کیلئے، ترتیبات میں کیمرا تک رسائی کو آن کریں"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM کا PIN درج کریں، آپ کے پاس <xliff:g id="NUMBER_1">%d</xliff:g> کوششیں بچی ہیں۔</item>        <item quantity="one">SIM کا PIN درج کریں، آپ کے پاس <xliff:g id="NUMBER_0">%d</xliff:g> کوشش بچی ہے، اس کے بعد آپ کو اپنا آلہ غیر مقفل کرنے کے لیے اپنے کیریئر سے رابطہ کرنا ہوگا۔</item> diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index e1169196d66e..df537ab67442 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Qurilma administrator tomonidan bloklangan"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Qurilma qo‘lda qulflangan"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Aniqlanmadi"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Yuz bilan ochish uchun Sozlamalar va maxfiylik orqali "<b>"kameraga kirishga ruxsat bering"</b></string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Yuz bilan ochish uchun kamera ruxsatini bering"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">SIM PIN kodini kiriting, sizda <xliff:g id="NUMBER_1">%d</xliff:g> ta urinish bor.</item>        <item quantity="one">SIM PIN kodini kiriting, qurilmani qulfdan chiqarish uchun sizda <xliff:g id="NUMBER_0">%d</xliff:g> ta urinish bor.</item> diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index 15e35c4c4932..5d6fc50bd237 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Thiết bị đã bị quản trị viên khóa"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Thiết bị đã bị khóa theo cách thủ công"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Không nhận dạng được"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Để dùng tính năng Mở khoá bằng khuôn mặt, hãy bật tuỳ chọn "<b>"Truy cập máy ảnh"</b>" trong phần Cài đặt > Quyền riêng tư"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Cho phép truy cập máy ảnh để dùng Mở khóa bằng khuôn mặt"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">Hãy nhập mã PIN của SIM. Bạn còn <xliff:g id="NUMBER_1">%d</xliff:g> lần thử.</item>        <item quantity="one">Hãy nhập mã PIN của SIM. Bạn còn <xliff:g id="NUMBER_0">%d</xliff:g> lần thử trước khi phải liên hệ với nhà mạng để mở khóa thiết bị của mình.</item> diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index 0deee1775c30..e74fa75e7b44 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"管理员已锁定设备"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"此设备已手动锁定"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"无法识别"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"如需使用人脸解锁功能,请在“设置”>“隐私权”中开启"<b>"摄像头使用权限"</b></string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"如需使用人脸解锁功能,请在“设置”中开启摄像头使用权限"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>        <item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item> diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index 145bd2b9f6d4..c22ecdc28fce 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"裝置已由管理員鎖定"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"使用者已手動將裝置上鎖"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"未能識別"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"如要使用「面孔解鎖」,請在 [設定] > [私隱] 開啟"<b>"相機存取權"</b></string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"如要使用「面孔解鎖」,請在「設定」開啟相機存取權"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">輸入 SIM 卡的 PIN,您還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>        <item quantity="one">輸入 SIM 卡的 PIN,您還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然輸入錯誤,您必須聯絡流動網絡供應商解鎖您的裝置。</item> diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index f34f78e9a330..498f74834090 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"管理員已鎖定裝置"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"裝置已手動鎖定"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"無法識別"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"如要使用人臉解鎖功能,請前往「設定」>「隱私權」開啟"<b>"攝影機存取權"</b></string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"如要使用人臉解鎖功能,請在「設定」中開啟相機存取權。"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="other">請輸入 SIM 卡的 PIN 碼,你還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>        <item quantity="one">請輸入 SIM 卡的 PIN 碼,你還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然失敗,就必須請電信業者為裝置解鎖。</item> diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml index 76e05807011f..70bed322cc53 100644 --- a/packages/SystemUI/res-keyguard/values-zu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml @@ -90,7 +90,7 @@      <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Idivayisi ikhiywe ngumlawuli"</string>      <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Idivayisi ikhiywe ngokwenza"</string>      <string name="kg_face_not_recognized" msgid="7903950626744419160">"Akwaziwa"</string> -    <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Ukuze usebenzise Ukuvula ngobuso, vula "<b>"Ukufinyelela kwekhamera"</b>" kokuthi Amasethingi > Ubumfihlo"</string> +    <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Ukuze usebenzise Ukuvula Ngobuso, vula ukufinyelela kwekhamera Kumasethingi"</string>      <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">        <item quantity="one">Faka i-PIN ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item>        <item quantity="other">Faka i-PIN ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item> diff --git a/packages/SystemUI/res-keyguard/values/config.xml b/packages/SystemUI/res-keyguard/values/config.xml index a25ab5109fa8..b1d33758f1b3 100644 --- a/packages/SystemUI/res-keyguard/values/config.xml +++ b/packages/SystemUI/res-keyguard/values/config.xml @@ -28,6 +28,11 @@      <!-- Will display the bouncer on one side of the display, and the current user icon and           user switcher on the other side -->      <bool name="config_enableBouncerUserSwitcher">false</bool> +    <!-- Whether to show the face scanning animation on devices with face auth supported. +         The face scanning animation renders in a SW layer in ScreenDecorations. +         Enabling this will also render the camera protection in the SW layer +         (instead of HW, if relevant)."=--> +    <bool name="config_enableFaceScanningAnimation">true</bool>      <!-- Time to be considered a consecutive fingerprint failure in ms -->      <integer name="fp_consecutive_failure_time_ms">3500</integer>  </resources> diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml index 64aa8ee84423..1be2d997719d 100644 --- a/packages/SystemUI/res-keyguard/values/strings.xml +++ b/packages/SystemUI/res-keyguard/values/strings.xml @@ -220,8 +220,8 @@      <!-- Face hint message when finger was not recognized. [CHAR LIMIT=20] -->      <string name="kg_face_not_recognized">Not recognized</string> -     <!-- Error message indicating that the camera privacy sensor has been turned on [CHAR LIMIT=NONE] --> -    <string name="kg_face_sensor_privacy_enabled">To use Face Unlock, turn on <b>Camera access</b> in Settings > Privacy</string> +     <!-- Error message indicating that the camera privacy sensor has been turned on [CHAR LIMIT=53] --> +    <string name="kg_face_sensor_privacy_enabled">To use Face Unlock, turn on camera access in Settings</string>      <!-- Instructions telling the user remaining times when enter SIM PIN view.  -->      <plurals name="kg_password_default_pin_message"> diff --git a/packages/SystemUI/res-product/values-ro/strings.xml b/packages/SystemUI/res-product/values-ro/strings.xml index 807ebfe03bef..471f01e678e1 100644 --- a/packages/SystemUI/res-product/values-ro/strings.xml +++ b/packages/SystemUI/res-product/values-ro/strings.xml @@ -19,16 +19,16 @@  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="dock_alignment_slow_charging" product="default" msgid="6997633396534416792">"Repoziționați telefonul pentru încărcare mai rapidă"</string> -    <string name="dock_alignment_not_charging" product="default" msgid="3980752926226749808">"Repoziționați telefonul pentru încărcarea wireless"</string> +    <string name="dock_alignment_slow_charging" product="default" msgid="6997633396534416792">"Repoziționează telefonul pentru încărcare mai rapidă"</string> +    <string name="dock_alignment_not_charging" product="default" msgid="3980752926226749808">"Repoziționează telefonul pentru încărcarea wireless"</string>      <string name="inattentive_sleep_warning_message" product="tv" msgid="6844464574089665063">"Dispozitivul Android TV se va opri în curând. Apasă un buton pentru a-l menține pornit."</string>      <string name="inattentive_sleep_warning_message" product="default" msgid="5693904520452332224">"Dispozitivul se va opri în curând. Apasă pentru a-l menține pornit."</string>      <string name="keyguard_missing_sim_message" product="tablet" msgid="5018086454277963787">"Nu există card SIM în tabletă."</string>      <string name="keyguard_missing_sim_message" product="default" msgid="7053347843877341391">"Nu există card SIM în telefon."</string>      <string name="kg_invalid_confirm_pin_hint" product="default" msgid="6278551068943958651">"Codurile PIN nu coincid"</string> -    <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="302165994845009232">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a tabletei. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, această tabletă va fi resetată, iar toate datele acesteia vor fi șterse."</string> +    <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="302165994845009232">"Ai făcut <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a tabletei. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, tableta va fi resetată, iar toate datele vor fi șterse."</string>      <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="2594813176164266847">"Ai făcut <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a telefonului. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, acest telefon va fi resetat, iar toate datele acestuia vor fi șterse."</string> -    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="8710104080409538587">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a tabletei. Această tabletă va fi resetată, iar toate datele acesteia vor fi șterse."</string> +    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="8710104080409538587">"Ai făcut <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a tabletei. Această tabletă va fi resetată, iar toate datele vor fi șterse."</string>      <string name="kg_failed_attempts_now_wiping" product="default" msgid="6381835450014881813">"Ai făcut <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Acest telefon va fi resetat, iar toate datele acestuia vor fi șterse."</string>      <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="7325071812832605911">"Ai făcut <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a tabletei. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse."</string>      <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="8110939900089863103">"Ai făcut <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a telefonului. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, acest utilizator va fi eliminat, iar toate datele utilizatorului vor fi șterse."</string> @@ -38,8 +38,8 @@      <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"Ai făcut <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a telefonului. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string>      <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"Ai făcut <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a tabletei. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string>      <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Ai făcut <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string> -    <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string> -    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string> +    <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Ai desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, ți se va solicita să deblochezi tableta cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string> +    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ai desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string>      <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Deblochează telefonul pentru mai multe opțiuni"</string>      <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Deblochează tableta pentru mai multe opțiuni"</string>      <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Deblochează dispozitivul pentru mai multe opțiuni"</string> diff --git a/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml b/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml index 3a08a7111d9a..41123c84ded1 100644 --- a/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml +++ b/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml @@ -16,19 +16,13 @@  * limitations under the License.  */  --> -<ripple +<shape      xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" -    android:color="?android:attr/textColorPrimary"> -  <item> -    <shape -        android:shape="rectangle"> -      <solid android:color="?androidprv:attr/colorSurface"/> -      <size -          android:width="@dimen/keyguard_affordance_width" -          android:height="@dimen/keyguard_affordance_height"/> -      <corners android:radius="@dimen/keyguard_affordance_fixed_radius"/> -    </shape> -  </item> -</ripple> - +    android:shape="rectangle"> +  <solid android:color="?androidprv:attr/colorSurface"/> +  <size +      android:width="@dimen/keyguard_affordance_width" +      android:height="@dimen/keyguard_affordance_height"/> +  <corners android:radius="@dimen/keyguard_affordance_fixed_radius"/> +</shape> diff --git a/packages/SystemUI/res/layout/auth_biometric_view.xml b/packages/SystemUI/res/layout/auth_biometric_view.xml deleted file mode 100644 index ee4da25f2284..000000000000 --- a/packages/SystemUI/res/layout/auth_biometric_view.xml +++ /dev/null @@ -1,26 +0,0 @@ -<!-- -  ~ Copyright (C) 2022 The Android Open Source Project -  ~ -  ~ Licensed under the Apache License, Version 2.0 (the "License"); -  ~ you may not use this file except in compliance with the License. -  ~ You may obtain a copy of the License at -  ~ -  ~      http://www.apache.org/licenses/LICENSE-2.0 -  ~ -  ~ Unless required by applicable law or agreed to in writing, software -  ~ distributed under the License is distributed on an "AS IS" BASIS, -  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -  ~ See the License for the specific language governing permissions and -  ~ limitations under the License. -  --> - -<com.android.systemui.biometrics.AuthBiometricView -    xmlns:android="http://schemas.android.com/apk/res/android" -    android:id="@+id/contents" -    android:layout_width="match_parent" -    android:layout_height="wrap_content" -    android:orientation="vertical"> - -    <include layout="@layout/auth_biometric_contents"/> - -</com.android.systemui.biometrics.AuthBiometricView>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/media_ttt_chip.xml b/packages/SystemUI/res/layout/media_ttt_chip.xml index a502d33a0be1..4d24140abbf4 100644 --- a/packages/SystemUI/res/layout/media_ttt_chip.xml +++ b/packages/SystemUI/res/layout/media_ttt_chip.xml @@ -13,71 +13,85 @@    ~ See the License for the specific language governing permissions and    ~ limitations under the License.    --> -<LinearLayout +<!-- Wrap in a frame layout so that we can update the margins on the inner layout. (Since this view +     is the root view of a window, we cannot change the root view's margins.) --> +<!-- Alphas start as 0 because the view will be animated in. --> +<FrameLayout      xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"      android:id="@+id/media_ttt_sender_chip" -    android:orientation="horizontal"      android:layout_width="wrap_content" -    android:layout_height="wrap_content" -    android:padding="@dimen/media_ttt_chip_outer_padding" -    android:background="@drawable/media_ttt_chip_background" -    android:layout_marginTop="50dp" -    android:clipToPadding="false" -    android:gravity="center_vertical" -    > +    android:layout_height="wrap_content"> -    <com.android.internal.widget.CachingIconView -        android:id="@+id/app_icon" -        android:layout_width="@dimen/media_ttt_app_icon_size" -        android:layout_height="@dimen/media_ttt_app_icon_size" -        android:layout_marginEnd="12dp" -        /> - -    <TextView -        android:id="@+id/text" +    <LinearLayout +        android:id="@+id/media_ttt_sender_chip_inner" +        android:orientation="horizontal"          android:layout_width="wrap_content"          android:layout_height="wrap_content" -        android:textSize="@dimen/media_ttt_text_size" -        android:textColor="?android:attr/textColorPrimary" -        /> +        android:padding="@dimen/media_ttt_chip_outer_padding" +        android:background="@drawable/media_ttt_chip_background" +        android:layout_marginTop="20dp" +        android:clipToPadding="false" +        android:gravity="center_vertical" +        android:alpha="0.0" +        > -    <!-- At most one of [loading, failure_icon, undo] will be visible at a time. --> +        <com.android.internal.widget.CachingIconView +            android:id="@+id/app_icon" +            android:layout_width="@dimen/media_ttt_app_icon_size" +            android:layout_height="@dimen/media_ttt_app_icon_size" +            android:layout_marginEnd="12dp" +            android:alpha="0.0" +            /> -    <ProgressBar -        android:id="@+id/loading" -        android:indeterminate="true" -        android:layout_width="@dimen/media_ttt_status_icon_size" -        android:layout_height="@dimen/media_ttt_status_icon_size" -        android:layout_marginStart="@dimen/media_ttt_last_item_start_margin" -        android:indeterminateTint="?androidprv:attr/colorAccentPrimaryVariant" -        style="?android:attr/progressBarStyleSmall" -        /> +        <TextView +            android:id="@+id/text" +            android:layout_width="wrap_content" +            android:layout_height="wrap_content" +            android:textSize="@dimen/media_ttt_text_size" +            android:textColor="?android:attr/textColorPrimary" +            android:alpha="0.0" +            /> -    <ImageView -        android:id="@+id/failure_icon" -        android:layout_width="@dimen/media_ttt_status_icon_size" -        android:layout_height="@dimen/media_ttt_status_icon_size" -        android:layout_marginStart="@dimen/media_ttt_last_item_start_margin" -        android:src="@drawable/ic_warning" -        android:tint="@color/GM2_red_500" -        /> +        <!-- At most one of [loading, failure_icon, undo] will be visible at a time. --> +        <ProgressBar +            android:id="@+id/loading" +            android:indeterminate="true" +            android:layout_width="@dimen/media_ttt_status_icon_size" +            android:layout_height="@dimen/media_ttt_status_icon_size" +            android:layout_marginStart="@dimen/media_ttt_last_item_start_margin" +            android:indeterminateTint="?androidprv:attr/colorAccentPrimaryVariant" +            style="?android:attr/progressBarStyleSmall" +            android:alpha="0.0" +            /> -    <TextView -        android:id="@+id/undo" -        android:layout_width="wrap_content" -        android:layout_height="wrap_content" -        android:text="@string/media_transfer_undo" -        android:textColor="?androidprv:attr/textColorOnAccent" -        android:layout_marginStart="@dimen/media_ttt_last_item_start_margin" -        android:textSize="@dimen/media_ttt_text_size" -        android:paddingStart="@dimen/media_ttt_chip_outer_padding" -        android:paddingEnd="@dimen/media_ttt_chip_outer_padding" -        android:paddingTop="@dimen/media_ttt_undo_button_vertical_padding" -        android:paddingBottom="@dimen/media_ttt_undo_button_vertical_padding" -        android:layout_marginTop="@dimen/media_ttt_undo_button_vertical_negative_margin" -        android:layout_marginBottom="@dimen/media_ttt_undo_button_vertical_negative_margin" -        android:background="@drawable/media_ttt_undo_background" -        /> +        <ImageView +            android:id="@+id/failure_icon" +            android:layout_width="@dimen/media_ttt_status_icon_size" +            android:layout_height="@dimen/media_ttt_status_icon_size" +            android:layout_marginStart="@dimen/media_ttt_last_item_start_margin" +            android:src="@drawable/ic_warning" +            android:tint="@color/GM2_red_500" +            android:alpha="0.0" +            /> + +        <TextView +            android:id="@+id/undo" +            android:layout_width="wrap_content" +            android:layout_height="wrap_content" +            android:text="@string/media_transfer_undo" +            android:textColor="?androidprv:attr/textColorOnAccent" +            android:layout_marginStart="@dimen/media_ttt_last_item_start_margin" +            android:textSize="@dimen/media_ttt_text_size" +            android:paddingStart="@dimen/media_ttt_chip_outer_padding" +            android:paddingEnd="@dimen/media_ttt_chip_outer_padding" +            android:paddingTop="@dimen/media_ttt_undo_button_vertical_padding" +            android:paddingBottom="@dimen/media_ttt_undo_button_vertical_padding" +            android:layout_marginTop="@dimen/media_ttt_undo_button_vertical_negative_margin" +            android:layout_marginBottom="@dimen/media_ttt_undo_button_vertical_negative_margin" +            android:background="@drawable/media_ttt_undo_background" +            android:alpha="0.0" +            /> -</LinearLayout> +    </LinearLayout> +</FrameLayout> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 3e4397b32273..3eb73e09688b 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Bevestig"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tik op Bevestig om te voltooi"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Ontsluit met gesig. Druk die ontsluitikoon om voort te gaan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Ontsluit met gesig. Druk om voort te gaan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Gesig is herken. Druk om voort te gaan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gesig is herken. Druk die ontsluitikoon om voort te gaan."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Gestaaf"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gebruik PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gebruik patroon"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Swiep op om oop te maak"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Druk die onsluitikoon om oop te maak"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Ontsluit met gesig. Druk die ontsluitikoon om oop te maak."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Ontsluit met gesig. Druk om oop te maak."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Gesig is herken. Druk om oop te maak."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Gesig is herken. Druk die ontsluitikoon om oop te maak."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Beweeg links"</item>      <item msgid="5558598599408514296">"Beweeg af"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Beweeg nader aan <xliff:g id="DEVICENAME">%1$s</xliff:g> om hier te speel"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Speel tans op <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Iets is fout. Probeer weer."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> loop tans"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Onaktief, gaan program na"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nie gekry nie"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrole is nie beskikbaar nie"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 2a246f986035..7fa8604dc2e5 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"ተረጋግጧል"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"ለማጠናቀቅ አረጋግጥን መታ ያድርጉ"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"በመልክ ተከፍቷል። ለመቀጠል የመክፈቻ አዶውን ይጫኑ።"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"በመልክ ተከፍቷል። ለመቀጠል ይጫኑ።"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"መልክ ተለይቶ ታውቋል። ለመቀጠል ይጫኑ።"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"መልክ ተለይቶ ታውቋል። ለመቀጠል የመክፈቻ አዶውን ይጫኑ።"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"የተረጋገጠ"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ፒን ይጠቀሙ"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ሥርዓተ ጥለትን ተጠቀም"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"ለመክፈት በጣት ወደ ላይ ጠረግ ያድርጉ"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"ለመክፈት የመክፈቻ አዶውን ይጫኑ"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"በመልክ ተከፍቷል። ለመክፈት የመክፈቻ አዶውን ይጫኑ።"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"በመልክ ተከፍቷል። ለመክፈት ይጫኑ።"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"መልክ ተለይቶ ታውቋል። ለመክፈት ይጫኑ።"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"መልክ ተለይቶ ታውቋል። ለመክፈት የመክፈቻ አዶውን ይጫኑ።"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ወደ ግራ ውሰድ"</item>      <item msgid="5558598599408514296">"ወደ ታች ውሰድ"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"እዚህ ለመጫወት ወደ <xliff:g id="DEVICENAME">%1$s</xliff:g> ቀረብ ይበሉ"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"በ<xliff:g id="DEVICENAME">%1$s</xliff:g> ላይ በማጫወት ላይ"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"የሆነ ችግር ተፈጥሯል። እንደገና ይሞክሩ።"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> እያሄደ ነው"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"ንቁ ያልኾነ፣ መተግበሪያን ይፈትሹ"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"አልተገኘም"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"መቆጣጠሪያ አይገኝም"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 87a7615eb0a2..01dee74055c6 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"تمّ التأكيد."</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"يمكنك النقر على \"تأكيد\" لإكمال المهمة."</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"تم فتح القفل بالتعرّف على وجهك. للمتابعة، اضغط على رمز فتح القفل."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"تم فتح قفل جهازك عند تقريبه من وجهك. اضغط للمتابعة."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"تم التعرّف على الوجه. اضغط للمتابعة."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"تم التعرّف على الوجه. للمتابعة، اضغط على رمز فتح القفل."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"مصادقة"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"استخدام رقم تعريف شخصي"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"استخدام نقش"</string> @@ -321,6 +324,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"يمكنك الفتح بالتمرير سريعًا لأعلى."</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"اضغط على رمز فتح القفل لفتح قفل الشاشة."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"تم فتح القفل بالتعرّف على وجهك. لفتح الجهاز، اضغط على رمز فتح القفل."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"تم فتح قفل جهازك عند تقريبه من وجهك. اضغط لفتح الجهاز."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"تم التعرّف على الوجه. اضغط لفتح الجهاز."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"تم التعرّف على الوجه. اضغط على رمز فتح القفل لفتح الجهاز."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"نقل لليسار"</item>      <item msgid="5558598599408514296">"نقل للأسفل"</item> @@ -849,7 +855,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"يُرجى الاقتراب من <xliff:g id="DEVICENAME">%1$s</xliff:g> لتشغيل الوسائط هنا."</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"جارٍ تشغيل الوسائط على <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"حدث خطأ. يُرجى إعادة المحاولة."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قيد التشغيل"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"غير نشط، تحقّق من التطبيق."</string>      <string name="controls_error_removed" msgid="6675638069846014366">"لم يتم العثور عليه."</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"عنصر التحكّم غير متوفّر"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index a5812da704e4..7b8e325d21a0 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"নিশ্চিত কৰিলে"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"সম্পূৰ্ণ কৰিবলৈ নিশ্চিত কৰক-ত টিপক"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"মুখাৱয়বৰ জৰিয়তে আনলক কৰা হৈছে। অব্যাহত ৰাখিবলৈ আনলক কৰক চিহ্নটোত টিপক।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"মুখাৱয়বৰ জৰিয়তে আনলক কৰা হৈছে। অব্যাহত ৰাখিবলৈ টিপক।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"মুখাৱয়ব চিনাক্ত কৰা হৈছে। অব্যাহত ৰাখিবলৈ টিপক।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"মুখাৱয়ব চিনাক্ত কৰা হৈছে। অব্যাহত ৰাখিবলৈ আনলক কৰক চিহ্নটোত টিপক।"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ’ল"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"পিন ব্যৱহাৰ কৰক"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"আৰ্হি ব্যৱহাৰ কৰক"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"খুলিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"খুলিবলৈ আনলক কৰক চিহ্নটোত টিপক"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"মুখাৱয়বৰ জৰিয়তে আনলক কৰা হৈছে। খুলিবলৈ আনলক কৰক চিহ্নটোত টিপক।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"মুখাৱয়বৰ জৰিয়তে আনলক কৰা হৈছে। খুলিবলৈ টিপক।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"মুখাৱয়ব চিনাক্ত কৰা হৈছে। খুলিবলৈ টিপক।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"মুখাৱয়ব চিনাক্ত কৰা হৈছে। খুলিবলৈ আনলক কৰক চিহ্নটোত টিপক।"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"বাওঁফাললৈ নিয়ক"</item>      <item msgid="5558598599408514296">"তললৈ নিয়ক"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ইয়াত খেলিবলৈ <xliff:g id="DEVICENAME">%1$s</xliff:g>ৰ আৰু ওচৰলৈ যাওক"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>ত প্লে কৰি থকা হৈছে"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"কিবা ভুল হ’ল। পুনৰ চেষ্টা কৰক।"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> চলি আছে"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"সক্ৰিয় নহয়, এপ্টো পৰীক্ষা কৰক"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"বিচাৰি পোৱা নগ’ল"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"নিয়ন্ত্ৰণটো উপলব্ধ নহয়"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index ed6fec142354..5bc28954230e 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Təsdiqləndi"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tamamlamaq üçün \"Təsdiq edin\" seçiminə toxunun"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Üzlə kilidi açılıb. \"Kilidi aç\" ikonasına basıb davam edin."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Üz ilə kiliddən çıxarılıb. Davam etmək üçün basın."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Üz tanınıb. Davam etmək üçün basın."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Üz tanınıb. \"Kiliddən çıxar\" ikonasına basıb davam edin."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Doğrulandı"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN istifadə edin"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Model istifadə edin"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Açmaq üçün yuxarı sürüşdürün"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"\"Kilidi aç\" ikonasına basıb açın"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Üzlə kilidi açılıb. \"Kilidi aç\" ikonasına basıb açın."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Üz ilə kiliddən çıxarılıb. Açmaq üçün basın."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Üz tanınıb. Açmaq üçün basın."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Üz tanınıb. \"Kiliddən çıxar\" ikonasına basıb açın."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Sola köçürün"</item>      <item msgid="5558598599408514296">"Aşağı köçürün"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Burada oxutmaq üçün <xliff:g id="DEVICENAME">%1$s</xliff:g> cihazına yaxınlaşın"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> cihazında oxudulur"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Xəta oldu. Yenə cəhd edin."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> işləyir"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Aktiv deyil, tətbiqi yoxlayın"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Tapılmadı"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Nəzarət əlçatan deyil"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 82b62402af30..9437fb137cfc 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Potvrđeno"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Dodirnite Potvrdi da biste završili"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Otključano je licem. Pritisnite ikonu otključavanja za nastavak"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Otključano je licem. Pritisnite da biste nastavili."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Lice je prepoznato. Pritisnite da biste nastavili."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice prepoznato. Pritisnite ikonu otključavanja za nastavak."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Identitet je potvrđen"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristite PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristite šablon"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Prevucite nagore da biste otvorili"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Pritisnite ikonu otključavanja da biste otvorili."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Otključano je licem. Pritisnite ikonu otključavanja da biste otvorili."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Otključano je licem. Pritisnite da biste otvorili."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Lice je prepoznato. Pritisnite da biste otvorili."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Lice prepoznato. Pritisnite ikonu otključavanja da biste otvorili."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Pomerite nalevo"</item>      <item msgid="5558598599408514296">"Pomerite nadole"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Približite se uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g> da biste na njemu puštali"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Pušta se na uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Došlo je do greške. Probajte ponovo."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je pokrenuta"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno. Vidite aplikaciju"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrola nije dostupna"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 2dce9c4cd336..d1596937c7bf 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Пацверджана"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Націсніце \"Пацвердзіць\", каб завяршыць"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Твар распазнаны. Для працягу націсніце значок разблакіроўкі."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Разблакіравана распазнаваннем твару. Націсніце для працягу."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Твар распазнаны. Націсніце для працягу."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Твар распазнаны. Для працягу націсніце значок разблакіроўкі."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Распазнана"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Увесці PIN-код"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Выкарыстаць узор разблакіроўкі"</string> @@ -317,6 +320,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Каб адкрыць, прагарніце ўверх"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Каб адкрыць, націсніце значок разблакіроўкі"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Твар распазнаны. Для адкрыцця націсніце значок разблакіроўкі"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Разблакіравана распазнаваннем твару. Націсніце, каб адкрыць."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Твар распазнаны. Націсніце, каб адкрыць."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Твар распазнаны. Для адкрыцця націсніце значок разблакіроўкі."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Перамясціце палец улева"</item>      <item msgid="5558598599408514296">"Перамясціце палец ніжэй"</item> @@ -837,7 +843,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Падыдзіце бліжэй да прылады \"<xliff:g id="DEVICENAME">%1$s</xliff:g>\", каб прайграць на гэтай"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Прайграецца на прыладзе \"<xliff:g id="DEVICENAME">%1$s</xliff:g>\""</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Нешта пайшло не так. Паўтарыце спробу."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> працуе"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Неактыўна, праверце праграму"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Не знойдзена"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Кіраванне недаступнае"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 1c2437b5108c..2e0fb3700c4f 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Потвърдено"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Докоснете „Потвърждаване“ за завършване"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Отключено с лице. Натиснете иконата за отключване, за да продължите."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Отключено с лице. Натиснете, за да продължите."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Лицето бе разпознато. Натиснете, за да продължите."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицето бе разпознато. Продължете чрез иконата за отключване."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Удостоверено"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Използване на ПИН"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Използване на фигура"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Прекарайте пръст нагоре, за да отключите"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Натиснете иконата за отключване, за да отворите"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Отключено с лице. Натиснете иконата за отключване, за да отворите."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Отключено с лице. Натиснете за отваряне."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Лицето бе разпознато. Натиснете за отваряне."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Лицето бе разпознато. Отворете чрез иконата за отключване."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Преместване наляво"</item>      <item msgid="5558598599408514296">"Преместване надолу"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Приближете се до <xliff:g id="DEVICENAME">%1$s</xliff:g> за възпроизвеждане на това устройство"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Възпроизвежда се на <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Нещо се обърка. Опитайте отново."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> се изпълнява"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Неактивно, проверете прилож."</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Не е намерено"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Контролата не е налице"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 867918802bb4..3ec1aa465ffc 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"কনফার্ম করা হয়েছে"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"সম্পূর্ণ করতে \'কনফার্ম করুন\' বোতামে ট্যাপ করুন"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"ফেসের সাহায্যে আনলক করা হয়েছে। চালিয়ে যাওয়ার জন্য আনলক আইকনে প্রেস করুন।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"ফেসের সাহায্যে আনলক করা হয়েছে। চালিয়ে যেতে প্রেস করুন।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ফেস শনাক্ত করা হয়েছে। চালিয়ে যেতে প্রেস করুন।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ফেস শনাক্ত করা হয়েছে। চালিয়ে যেতে আনলক আইকন প্রেস করুন।"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"প্রমাণীকৃত"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"পিন ব্যবহার করুন"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"প্যাটার্ন ব্যবহার করুন"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"খোলার জন্য উপরে সোয়াইপ করুন"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"খোলার জন্য আনলক আইকন প্রেস করুন"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"ফেসের সাহায্যে আনলক করা হয়েছে। খোলার জন্য আনলক আইকন প্রেস করুন।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"ফেসের সাহায্যে আনলক করা হয়েছে। খোলার জন্য প্রেস করুন।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"ফেস শনাক্ত করা হয়েছে। খোলার জন্য প্রেস করুন।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"ফেস শনাক্ত করা হয়েছে। খোলার জন্য আনলক আইকন প্রেস করুন।"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"বাঁদিকে সরান"</item>      <item msgid="5558598599408514296">"নিচে নামান"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"এখান থেকে চালাতে <xliff:g id="DEVICENAME">%1$s</xliff:g>-এর কাছে নিয়ে যান"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>-এ ভিডিও চালানো হচ্ছে"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"কোনও সমস্যা হয়েছে। আবার চেষ্টা করুন।"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> চলছে"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"বন্ধ আছে, অ্যাপ চেক করুন"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"খুঁজে পাওয়া যায়নি"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"কন্ট্রোল উপলভ্য নেই"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 521f602ea0f2..79442f8c8330 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Potvrđeno"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Dodirnite Potvrdi da završite"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Otključano licem. Pritisnite ikonu za otklj. da nastavite."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Otključano licem. Pritisnite da nastavite."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Lice prepoznato. Pritisnite da nastavite."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice prepoznato. Pritisnite ikonu za otklj. da nastavite."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentificirano"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristi PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristi uzorak"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Prevucite da otvorite"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Pritisnite ikonu za otključavanje da otvorite."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Otključano licem. Pritisnite ikonu za otklj. da otvorite."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Otključano licem. Pritisnite da otvorite."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Lice prepoznato. Pritisnite da otvorite."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Lice prepoznato. Pritisnite ikonu za otklj. da otvorite."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Pomjeranje ulijevo"</item>      <item msgid="5558598599408514296">"Pomjeranje nadolje"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Približite se uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g> da na njemu reproducirate"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproducira se na uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Nešto nije uredu. Pokušajte ponovo."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je pokrenuta"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, vidite aplikaciju"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrola nije dostupna"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 4e9208936ac5..c34086428f21 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmat"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Toca Confirma per completar"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"S\'ha desbloquejat amb la cara. Prem la icona per continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"S\'ha desbloquejat amb la cara. Prem per continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"S\'ha reconegut la cara. Prem per continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"S\'ha reconegut la cara. Prem la icona per continuar."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticat"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utilitza el PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utilitza el patró"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Llisca cap amunt per obrir"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Prem la icona de desbloqueig per obrir"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"S\'ha desbloquejat amb la cara. Prem la icona per obrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"S\'ha desbloquejat amb la cara. Prem per obrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"S\'ha reconegut la cara. Prem per obrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"S\'ha reconegut la cara. Prem la icona per obrir."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Mou cap a l\'esquerra"</item>      <item msgid="5558598599408514296">"Mou cap avall"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Acosta\'t a <xliff:g id="DEVICENAME">%1$s</xliff:g> per reproduir el contingut aquí"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"S\'està reproduint a <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"S\'ha produït un error. Torna-ho a provar."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> s\'està executant"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactiu; comprova l\'aplicació"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"No s\'ha trobat"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"El control no està disponible"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 785a7c2dbe71..e9f3a64d9fae 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Potvrzeno"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Ověření dokončíte klepnutím na Potvrdit"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Odemknuto obličejem. Klepněte na ikonu odemknutí."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Odemknuto obličejem. Pokračujte stisknutím."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Obličej rozpoznán. Pokračujte stisknutím."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Obličej rozpoznán. Klepněte na ikonu odemknutí."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Ověřeno"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Použít kód PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Použít gesto"</string> @@ -317,6 +320,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Otevřete přejetím prstem nahoru"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Otevřete klepnutím na ikonu odemknutí"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Odemknuto obličejem. Klepněte na ikonu odemknutí."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Odemknuto obličejem. Stisknutím otevřete."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Obličej rozpoznán. Stisknutím otevřete."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Obličej rozpoznán. Klepněte na ikonu odemknutí."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Přesunout doleva"</item>      <item msgid="5558598599408514296">"Přesunout dolů"</item> @@ -837,7 +843,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Pokud zde chcete přehrávat média, přibližte se k zařízení <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Přehrávání v zařízení <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Došlo k chybě. Zkuste to znovu."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> je spuštěna"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Neaktivní, zkontrolujte aplikaci"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nenalezeno"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Ovládání není k dispozici"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index fdf1b478d1d9..d56cb9b0282a 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Bekræftet"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tryk på Bekræft for at udføre"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Låst op vha. ansigt. Tryk på oplåsningsikonet for at fortsætte."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Låst op ved hjælp af ansigt. Tryk for at fortsætte."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ansigt genkendt. Tryk for at fortsætte."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansigt genkendt. Tryk på oplåsningsikonet for at fortsætte."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Godkendt"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Brug pinkode"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Brug mønster"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Stryg opad for at åbne"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Tryk på oplåsningsikonet for at åbne"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Låst op vha. ansigt. Tryk på oplåsningsikonet for at åbne."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Låst op ved hjælp af ansigt. Tryk for at åbne."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Ansigt genkendt. Tryk for at åbne."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Ansigt genkendt. Tryk på oplåsningsikonet for at åbne."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Flyt til venstre"</item>      <item msgid="5558598599408514296">"Flyt ned"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Ryk tættere på <xliff:g id="DEVICENAME">%1$s</xliff:g> for at afspille her"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Afspilles på <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Noget gik galt. Prøv igen."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> kører"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv. Tjek appen"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Ikke fundet"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Styringselement ikke tilgængeligt"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index a1da2560bda7..97e403844c59 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Bestätigt"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Zum Abschließen auf \"Bestätigen\" tippen"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Per Gesichtserkennung entsperrt. Tippe auf das Symbol „Entsperren“, um fortzufahren."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Gerät mit dem Gesicht entsperrt. Tippe, um fortzufahren."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Gesicht erkannt. Tippe, um fortzufahren."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gesicht erkannt. Tippe zum Fortfahren auf das Symbol „Entsperren“."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifiziert"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN verwenden"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Muster verwenden"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Zum Öffnen nach oben wischen"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Tippe zum Öffnen auf das Symbol „Entsperren“"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Gerät mit dem Gesicht entsperrt. Tippe zum Öffnen auf das Symbol „Entsperren“."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Gerät mit dem Gesicht entsperrt. Tippe zum Öffnen."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Gesicht erkannt. Tippe zum Öffnen."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Gesicht erkannt. Tippe zum Öffnen auf das Symbol „Entsperren“."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Nach links bewegen"</item>      <item msgid="5558598599408514296">"Nach unten bewegen"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Platziere für die Wiedergabe dein Gerät näher an „<xliff:g id="DEVICENAME">%1$s</xliff:g>“"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Wird auf „<xliff:g id="DEVICENAME">%1$s</xliff:g>“ abgespielt"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Es gab ein Problem. Versuch es noch einmal."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> wird ausgeführt"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv – sieh in der App nach"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nicht gefunden"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Steuerelement nicht verfügbar"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 381572c8d517..fe349b47caaf 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Επιβεβαιώθηκε"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Πατήστε Επιβεβαίωση για ολοκλήρωση"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Ξεκλείδωμα με πρόσωπο. Πατήστε το εικονίδιο ξεκλειδώματος."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Ξεκλείδωμα με αναγνώριση προσώπου. Πατήστε για συνέχεια."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Το πρόσωπο αναγνωρίστηκε. Πατήστε για συνέχεια."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Το πρόσωπο αναγνωρ. Πατήστε το εικον. ξεκλειδ. για συνέχεια."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Ολοκληρώθηκε ο έλεγχος ταυτότητας"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Χρήση PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Χρήση μοτίβου"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Σύρετε προς τα επάνω για άνοιγμα"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Πατήστε το εικονίδιο ξεκλειδώματος για άνοιγμα"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Ξεκλείδωμα με πρόσωπο. Πατήστε το εικονίδιο ξεκλειδώματος."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Ξεκλείδωμα με αναγνώριση προσώπου. Πατήστε για άνοιγμα."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Το πρόσωπο αναγνωρίστηκε. Πατήστε για άνοιγμα."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Το πρόσωπο αναγνωρ. Πατήστ. το εικον. ξεκλειδ. για άνοιγμα."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Μετακίνηση αριστερά"</item>      <item msgid="5558598599408514296">"Μετακίνηση κάτω"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Μετακινηθείτε πιο κοντά στη συσκευή <xliff:g id="DEVICENAME">%1$s</xliff:g> για αναπαραγωγή εδώ"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Αναπαραγωγή στη συσκευή <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Παρουσιάστηκε κάποιο πρόβλημα. Δοκιμάστε ξανά."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> εκτελείται"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Ανενεργό, έλεγχος εφαρμογής"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Δεν βρέθηκε."</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Μη διαθέσιμο στοιχείο ελέγχου"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index f51bd3af6e7d..2c9d49510f46 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmed"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tap Confirm to complete"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Unlocked by face. Press the unlock icon to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Unlocked by face. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Face recognised. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Swipe up to open"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Press the unlock icon to open"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Unlocked by face. Press the unlock icon to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Unlocked by face. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Face recognised. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Face recognised. Press the unlock icon to open."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Move left"</item>      <item msgid="5558598599408514296">"Move down"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Move closer to <xliff:g id="DEVICENAME">%1$s</xliff:g> to play here"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Playing on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Something went wrong. Try again."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> is running"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Not found"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Control is unavailable"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index e4f4b0041114..5abb16cd6443 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmed"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tap Confirm to complete"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Unlocked by face. Press the unlock icon to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Unlocked by face. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Face recognised. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Swipe up to open"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Press the unlock icon to open"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Unlocked by face. Press the unlock icon to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Unlocked by face. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Face recognised. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Face recognised. Press the unlock icon to open."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Move left"</item>      <item msgid="5558598599408514296">"Move down"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Move closer to <xliff:g id="DEVICENAME">%1$s</xliff:g> to play here"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Playing on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Something went wrong. Try again."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> is running"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Not found"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Control is unavailable"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index f51bd3af6e7d..2c9d49510f46 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmed"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tap Confirm to complete"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Unlocked by face. Press the unlock icon to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Unlocked by face. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Face recognised. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Swipe up to open"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Press the unlock icon to open"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Unlocked by face. Press the unlock icon to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Unlocked by face. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Face recognised. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Face recognised. Press the unlock icon to open."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Move left"</item>      <item msgid="5558598599408514296">"Move down"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Move closer to <xliff:g id="DEVICENAME">%1$s</xliff:g> to play here"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Playing on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Something went wrong. Try again."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> is running"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Not found"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Control is unavailable"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index f51bd3af6e7d..2c9d49510f46 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmed"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tap Confirm to complete"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Unlocked by face. Press the unlock icon to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Unlocked by face. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Face recognised. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Swipe up to open"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Press the unlock icon to open"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Unlocked by face. Press the unlock icon to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Unlocked by face. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Face recognised. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Face recognised. Press the unlock icon to open."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Move left"</item>      <item msgid="5558598599408514296">"Move down"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Move closer to <xliff:g id="DEVICENAME">%1$s</xliff:g> to play here"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Playing on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Something went wrong. Try again."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> is running"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Not found"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Control is unavailable"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 8f4574e5ab36..7fde88cb6462 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmed"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tap Confirm to complete"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Unlocked by face. Press the unlock icon to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Unlocked by face. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Face recognized. Press to continue."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognized. Press the unlock icon to continue."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Swipe up to open"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Press the unlock icon to open"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Unlocked by face. Press the unlock icon to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Unlocked by face. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Face recognized. Press to open."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Face recognized. Press the unlock icon to open."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Move left"</item>      <item msgid="5558598599408514296">"Move down"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Move closer to <xliff:g id="DEVICENAME">%1$s</xliff:g> to play here"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Playing on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Something went wrong. Try again."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> is running"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Not found"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Control is unavailable"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 2149563c9aa4..42c2c2c8b77b 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmado"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Presiona Confirmar para completar"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Desbloqueo con rostro. Presiona ícono desbl. para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Desbloqueo con rostro. Presiona para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Rostro reconocido. Presiona para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rostro reconocido. Presiona el desbloqueo para continuar."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar patrón"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Desliza el dedo hacia arriba para abrir"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Presiona el ícono de desbloquear para abrir"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Desbloqueo con rostro. Presiona el ícono para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Desbloqueo con rostro. Presiona para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Rostro reconocido. Presiona para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Rostro reconocido. Presiona el desbloqueo para abrir."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Mover hacia la izquierda"</item>      <item msgid="5558598599408514296">"Mover hacia abajo"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Acércate a <xliff:g id="DEVICENAME">%1$s</xliff:g> para reproducir aquí"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproduciendo en <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Se produjo un error. Vuelve a intentarlo."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> se está ejecutando"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactivo. Verifica la app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"No se encontró"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"El control no está disponible"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index eae850d6798c..b70d9908ef76 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmada"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Toca Confirmar para completar la acción"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Desbloqueado con la cara. Toca el icono de desbloquear para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Desbloqueado con la cara. Pulsa para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Cara reconocida. Pulsa para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Cara reconocida. Pulsa el icono de desbloquear para continuar."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Se ha autenticado"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar patrón"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Desliza el dedo hacia arriba para abrir"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Pulsa el icono desbloquear para abrir"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Desbloqueado con la cara. Toca el icono de desbloquear para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Desbloqueado con la cara. Pulsa para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Cara reconocida. Pulsa para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Cara reconocida. Pulsa el icono de desbloquear para abrir."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Mover hacia la izquierda"</item>      <item msgid="5558598599408514296">"Mover hacia abajo"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Acércate a <xliff:g id="DEVICENAME">%1$s</xliff:g> para jugar aquí"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproduciendo en <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Se ha producido un error. Inténtalo de nuevo."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> se está ejecutando"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactivo, comprobar aplicación"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"No se ha encontrado"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Control no disponible"</string> diff --git a/packages/SystemUI/res/values-es/tiles_states_strings.xml b/packages/SystemUI/res/values-es/tiles_states_strings.xml index 7d8be488c5c5..66ebf5a3eede 100644 --- a/packages/SystemUI/res/values-es/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-es/tiles_states_strings.xml @@ -58,12 +58,12 @@    </string-array>    <string-array name="tile_states_flashlight">      <item msgid="3465257127433353857">"No disponible"</item> -    <item msgid="5044688398303285224">"Desactivada"</item> +    <item msgid="5044688398303285224">"Desactivado"</item>      <item msgid="8527389108867454098">"Activado"</item>    </string-array>    <string-array name="tile_states_rotation">      <item msgid="4578491772376121579">"No disponible"</item> -    <item msgid="5776427577477729185">"Desactivada"</item> +    <item msgid="5776427577477729185">"Desactivado"</item>      <item msgid="7105052717007227415">"Activado"</item>    </string-array>    <string-array name="tile_states_bt"> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 3bcfc0b7c319..efad53fdd33c 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Kinnitatud"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Lõpuleviimiseks puudutage nuppu Kinnita"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Avati näoga. Jätkamiseks vajutage avamise ikooni."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Avati näoga. Vajutage jätkamiseks."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Nägu tuvastati. Vajutage jätkamiseks."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Nägu tuvastati. Jätkamiseks vajutage avamise ikooni."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenditud"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Kasuta PIN-koodi"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Kasuta mustrit"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Pühkige avamiseks üles"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Avamiseks vajutage avamise ikooni"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Avati näoga. Avamiseks vajutage avamise ikooni."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Avati näoga. Avamiseks vajutage."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Nägu tuvastati. Avamiseks vajutage."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Nägu tuvastati. Avamiseks vajutage avamise ikooni."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Teisalda vasakule"</item>      <item msgid="5558598599408514296">"Teisalda alla"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Siin esitamiseks liigutage seadmele <xliff:g id="DEVICENAME">%1$s</xliff:g> lähemale"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Esitatakse seadmes <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Midagi läks valesti. Proovige uuesti."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> töötab"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Passiivne, vaadake rakendust"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Ei leitud"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Juhtelement pole saadaval"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 60b2902df8bc..1092b5403001 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Berretsita"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Amaitzeko, sakatu \"Berretsi\""</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Aurpegiaren bidez desblokeatu da. Aurrera egiteko, sakatu desblokeatzeko ikonoa."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Aurpegiaren bidez desblokeatu da. Sakatu aurrera egiteko."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ezagutu da aurpegia. Sakatu aurrera egiteko."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ezagutu da aurpegia. Aurrera egiteko, sakatu desblokeatzeko ikonoa."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikatuta"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Erabili PINa"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Erabili eredua"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Pasatu hatza gora irekitzeko"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Irekitzeko, sakatu desblokeatzeko ikonoa"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Aurpegiaren bidez desblokeatu da. Irekitzeko, sakatu desblokeatzeko ikonoa."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Aurpegiaren bidez desblokeatu da. Sakatu irekitzeko."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Ezagutu da aurpegia. Sakatu irekitzeko."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Ezagutu da aurpegia. Irekitzeko, sakatu desblokeatzeko ikonoa."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Eraman ezkerrera"</item>      <item msgid="5558598599408514296">"Eraman behera"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Gerturatu <xliff:g id="DEVICENAME">%1$s</xliff:g> gailura bertan erreproduzitzen ari dena hemen erreproduzitzeko"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> gailuan erreproduzitzen"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Arazoren bat izan da. Saiatu berriro."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> abian da"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inaktibo; egiaztatu aplikazioa"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Ez da aurkitu"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Ez dago erabilgarri kontrolatzeko aukera"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 51c1965fe750..69f5beaa86a0 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"تأیید شد"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"برای تکمیل، روی تأیید ضربه بزنید"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"قفلْ با چهره باز شد. برای ادامه، نماد قفلگشایی را فشار دهید."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"قفلْ با چهره باز شد. برای ادامه، فشار دهید."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"چهره شناسایی شد. برای ادامه، فشار دهید."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"چهره شناسایی شد. برای ادامه، نماد قفلگشایی را فشار دهید."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"راستیآزماییشده"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"استفاده از پین"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"استفاده از الگو"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"برای باز کردن، انگشتتان را تند بهبالا بکشید"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"برای باز کردن، نماد قفلگشایی را فشار دهید"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"قفلْ با چهره باز شد. برای باز کردن، نماد قفلگشایی را فشار دهید."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"قفلْ با چهره باز شد. برای باز کردن، فشار دهید."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"چهره شناسایی شد. برای باز کردن، فشار دهید."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"چهره شناسایی شد. برای باز کردن، نماد قفلگشایی را فشار دهید."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"انتقال بهچپ"</item>      <item msgid="5558598599408514296">"انتقال بهپایین"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"برای پخش در اینجا، به <xliff:g id="DEVICENAME">%1$s</xliff:g> نزدیکتر شوید"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"درحال پخش در <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"مشکلی پیش آمد. دوباره امتحان کنید."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> در حال اجرا است"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"غیرفعال، برنامه را بررسی کنید"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"پیدا نشد"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"کنترل دردسترس نیست"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 8337374441c9..b395aac76a8d 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Vahvistettu"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Valitse lopuksi Vahvista"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Avattu kasvojen avulla. Jatka lukituksen avauskuvakkeella."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Avattu kasvojen avulla. Jatka painamalla."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Kasvot tunnistettu. Jatka painamalla."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Kasvot tunnistettu. Jatka lukituksen avauskuvakkeella."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Todennettu"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Käytä PIN-koodia"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Käytä kuviota"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Avaa pyyhkäisemällä ylös"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Jatka painamalla lukituksen avauskuvaketta."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Avattu kasvojen avulla. Jatka lukituksen avauskuvakkeella."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Avattu kasvojen avulla. Avaa painamalla."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Kasvot tunnistettu. Avaa painamalla."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Kasvot tunnistettu. Jatka lukituksen avauskuvakkeella."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Siirrä vasemmalle"</item>      <item msgid="5558598599408514296">"Siirrä alas"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Siirrä <xliff:g id="DEVICENAME">%1$s</xliff:g> lähemmäs toistaaksesi täällä"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Toistetaan: <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Jotain meni pieleen. Yritä uudelleen."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> on käynnissä"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Epäaktiivinen, tarkista sovellus"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Ei löydy"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Ohjain ei ole käytettävissä"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 89fb05738f17..2003523e5a8c 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmé"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Touchez Confirmer pour terminer"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Déverr. par reconn. faciale. App. sur l\'icône pour continuer."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Déverr. par reconnaissance faciale. Appuyez pour continuer."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Visage reconnu. Appuyez pour continuer."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Visage reconnu. Appuyez sur Déverrouiller pour continuer."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifié"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utiliser un NIP"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utiliser un schéma"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Balayez l\'écran vers le haut pour ouvrir"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Appuyez sur l\'icône Déverrouiller pour ouvrir"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Déverr. par reconn. faciale. App. sur l\'icône pour ouvrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Déverr. par reconnaissance faciale. Appuyez pour ouvrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Visage reconnu. Appuyez pour ouvrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Visage reconnu. Appuyez sur Déverrouiller pour ouvrir."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Déplacer vers la gauche"</item>      <item msgid="5558598599408514296">"Déplacer vers le bas"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Rapprochez-vous de <xliff:g id="DEVICENAME">%1$s</xliff:g> pour lire le contenu"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Lecture sur <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Un problème est survenu. Réessayez."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> en cours d\'exécution"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Délai expiré, vérifiez l\'appli"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Introuvable"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"La commande n\'est pas accessible"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 454c599f28c3..fc8dc9ff8168 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmé"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Appuyez sur \"Confirmer\" pour terminer"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Déverrouillage par visage. Appuyez sur l\'icône de déverrouillage pour continuer."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Déverrouillé par visage. Appuyez pour continuer."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Visage reconnu. Appuyez pour continuer."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Visage reconnu. Appuyez sur l\'icône de déverrouillage pour continuer."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifié"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utiliser un code PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utiliser un schéma"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Balayer vers le haut pour ouvrir"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Appuyez sur l\'icône de déverrouillage pour ouvrir"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Déverrouillé par visage. Appuyez sur icône déverrouillage pour ouvrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Déverrouillé par visage. Appuyez pour ouvrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Visage reconnu. Appuyez pour ouvrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Visage reconnu. Appuyez sur l\'icône de déverrouillage pour ouvrir."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Déplacer vers la gauche"</item>      <item msgid="5558598599408514296">"Déplacer vers le bas"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Rapprochez l\'appareil pour transférer la diffusion à votre <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Lecture sur <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Un problème est survenu. Réessayez."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> est en cours d\'exécution"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Délai expiré, vérifier l\'appli"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Introuvable"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Commande indisponible"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index b57befcff7c8..8e03b128b4fd 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmada"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Toca Confirmar para completar o proceso"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Usouse o desbloqueo facial. Preme a icona de desbloquear."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Usouse o desbloqueo facial. Preme para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Recoñeceuse a cara. Preme para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Recoñeceuse a cara. Preme a icona de desbloquear."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrón"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Pasa o dedo cara arriba para abrir"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Preme a icona de desbloquear para abrir a porta"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Usouse o desbloqueo facial. Preme a icona de desbloquear."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Usouse o desbloqueo facial. Preme para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Recoñeceuse a cara. Preme para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Recoñeceuse a cara. Preme a icona de desbloquear para abrir."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Mover cara á esquerda"</item>      <item msgid="5558598599408514296">"Mover cara abaixo"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Achégate ao dispositivo (<xliff:g id="DEVICENAME">%1$s</xliff:g>) para reproducir o contido neste"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproducindo contido noutro dispositivo (<xliff:g id="DEVICENAME">%1$s</xliff:g>)"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Produciuse un erro. Téntao de novo."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> estase executando"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactivo. Comproba a app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Non se atopou"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"O control non está dispoñible"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 1a1a4c2cb616..e84c8550d207 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"પુષ્ટિ કરી"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"પરીક્ષણ પૂર્ણ કરવા કન્ફર્મ કરોને ટૅપ કરો"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"ચહેરા દ્વારા અનલૉક કર્યું. આગળ વધવા \'અનલૉક કરો\' આઇકન દબાવો."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"ચહેરા દ્વારા અનલૉક કર્યું. આગળ વધવા માટે દબાવો."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ચહેરો ઓળખ્યો. આગળ વધવા માટે દબાવો."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ચહેરો ઓળખ્યો. આગળ વધવા \'અનલૉક કરો\' આઇકન દબાવો."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"પ્રમાણિત"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"પિનનો ઉપયોગ કરો"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"પૅટર્નનો ઉપયોગ કરો"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"ખોલવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"ખોલવા માટે \'અનલૉક કરો\' આઇકન દબાવો"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"ચહેરા દ્વારા અનલૉક કર્યું. ખોલવા \'અનલૉક કરો\' આઇકન દબાવો."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"ચહેરા દ્વારા અનલૉક કર્યું. ખોલવા માટે દબાવો."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"ચહેરો ઓળખ્યો. ખોલવા માટે દબાવો."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"ચહેરો ઓળખ્યો. ખોલવા માટે \'અનલૉક કરો\' આઇકન દબાવો."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ડાબે ખસેડો"</item>      <item msgid="5558598599408514296">"નીચે ખસેડો"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"આમાં ચલાવવા માટે ડિવાઇસને <xliff:g id="DEVICENAME">%1$s</xliff:g>ની નજીક ખસેડો"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> પર ચલાવવામાં આવી રહ્યું છે"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"કંઈક ખોટું થયું. ફરી પ્રયાસ કરો."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ચાલી રહી છે"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"નિષ્ક્રિય, ઍપને ચેક કરો"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"મળ્યું નથી"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"નિયંત્રણ ઉપલબ્ધ નથી"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index dec6940d399e..85f2adfcc6ea 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"पुष्टि हो गई"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"\'पुष्टि करें\' पर टैप करके पूरा करें"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"चेहरे से अनलॉक किया. जारी रखने के लिए, अनलॉक आइकॉन को दबाएं."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"चेहरे से अनलॉक किया गया. जारी रखने के लिए टैप करें."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"चेहरे की पहचान हो गई. जारी रखने के लिए टैप करें."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरे की पहचान हो गई. जारी रखने के लिए अनलॉक आइकॉन को टैप करें."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"पुष्टि हो गई"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"पिन इस्तेमाल करें"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"पैटर्न इस्तेमाल करें"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"खोलने के लिए ऊपर स्वाइप करें"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"डिवाइस अनलॉक करने के लिए, अनलॉक आइकॉन को दबाएं"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"चेहरे से अनलॉक किया. डिवाइस अनलॉक करने के लिए, अनलॉक आइकॉन को दबाएं."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"चेहरे से अनलॉक किया गया. डिवाइस खोलने के लिए टैप करें."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"चेहरे की पहचान हो गई. डिवाइस खोलने के लिए टैप करें."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"चेहरे की पहचान हो गई. डिवाइस खोलने के लिए अनलॉक आइकॉन को टैप करें."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"बाईं ओर ले जाएं"</item>      <item msgid="5558598599408514296">"नीचे ले जाएं"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"अपने डिवाइस पर मीडिया फ़ाइल ट्रांसफ़र करने के लिए, उसे <xliff:g id="DEVICENAME">%1$s</xliff:g> के पास ले जाएं"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> पर मीडिया चल रहा है"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"कोई गड़बड़ी हुई. फिर से कोशिश करें."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> चालू है"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"काम नहीं कर रहा, ऐप जांचें"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"कंट्रोल नहीं है"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"कंट्रोल मौजूद नहीं है"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index afa1dc50f845..1ddf76775762 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Potvrđeno"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Dodirnite Potvrdi za dovršetak"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Otključano pomoću lica. Pritisnite ikonu otključavanja da biste nastavili."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Otključano pomoću lica. Pritisnite da biste nastavili."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Lice je prepoznato. Pritisnite da biste nastavili."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice je prepoznato. Pritisnite ikonu otključavanja da biste nastavili."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentičnost provjerena"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristite PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristite uzorak"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Prijeđite prstom prema gore da biste otvorili"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Pritisnite ikonu otključavanja da biste otvorili"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Otključano pomoću lica. Pritisnite ikonu otključavanja da biste otvorili."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Otključano pomoću lica. Pritisnite da biste otvorili."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Lice je prepoznato. Pritisnite da biste otvorili."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Lice je prepoznato. Pritisnite ikonu otključavanja da biste otvorili."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Pomicanje ulijevo"</item>      <item msgid="5558598599408514296">"Pomicanje prema dolje"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Približite se uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g> da biste na njemu reproducirali"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproducira se na uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Nešto nije u redu. Pokušajte ponovo."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je pokrenuta"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, provjerite aplik."</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrola nije dostupna"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 843ca5ee3473..531fcf06d405 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Megerősítve"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Koppintson a Megerősítés lehetőségre"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Arccal feloldva. A folytatáshoz nyomja meg a feloldás ikont."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Zárolás arccal feloldva. Koppintson a folytatáshoz."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Arc felismerve. Koppintson a folytatáshoz."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Arc felismerve. A folytatáshoz koppintson a Feloldásra."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Hitelesítve"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-kód használata"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Minta használata"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Csúsztasson felfelé a megnyitáshoz"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Az eszköz használatához nyomja meg a feloldás ikonját"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Arccal feloldva. A megnyitáshoz nyomja meg a feloldás ikont."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Zárolás arccal feloldva. Koppintson az eszköz használatához."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Arc felismerve. Koppintson az eszköz használatához."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Arc felismerve. Eszköz használata: Feloldás ikon."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Mozgatás balra"</item>      <item msgid="5558598599408514296">"Mozgatás lefelé"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Menjen közelebb a(z) <xliff:g id="DEVICENAME">%1$s</xliff:g> eszközhöz, hogy itt játszhassa le a tartalmat"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Lejátszás folyamatban a(z) <xliff:g id="DEVICENAME">%1$s</xliff:g> eszközön"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Hiba történt. Próbálkozzon újra."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> jelenleg fut"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inaktív, ellenőrizze az appot"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nem található"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Nem hozzáférhető vezérlő"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 95561d3f4e19..7f2d5778bcbb 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Հաստատվեց"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Ավարտելու համար հպեք «Հաստատել»"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Ապակողպվել է դեմքով։ Սեղմեք ապակողպման պատկերակը։"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Ապակողպվել է դեմքով։ Սեղմեք շարունակելու համար։"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Դեմքը ճանաչվեց։ Սեղմեք շարունակելու համար։"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Դեմքը ճանաչվեց։ Սեղմեք ապակողպման պատկերակը։"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Նույնականացված է"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Օգտագործել PIN կոդ"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Օգտագործել նախշ"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Բացելու համար սահեցրեք վերև"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Բացեք՝ սեղմելով ապակողպման պատկերակը"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Ապակողպվել է դեմքով։ Բացեք՝ սեղմելով ապակողպման պատկերակը։"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Ապակողպվել է դեմքով։ Սեղմեք բացելու համար։"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Դեմքը ճանաչվեց։ Սեղմեք բացելու համար։"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Դեմքը ճանաչվեց։ Բացելու համար սեղմեք ապակողպման պատկերակը։"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Տեղափոխել ձախ"</item>      <item msgid="5558598599408514296">"Տեղափոխել ներքև"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Ավելի մոտեցեք «<xliff:g id="DEVICENAME">%1$s</xliff:g>» սարքին՝ նվագարկումը սկսելու համար"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Նվագարկվում է «<xliff:g id="DEVICENAME">%1$s</xliff:g>» սարքում"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Սխալ առաջացավ։ Նորից փորձեք։"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն աշխատում է"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Ակտիվ չէ, ստուգեք հավելվածը"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Չի գտնվել"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Կառավարման տարրը հասանելի չէ"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 60122664a4b3..d8ab63b18058 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Dikonfirmasi"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Ketuk Konfirmasi untuk menyelesaikan"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Kunci dibuka dengan wajah. Tekan ikon buka kunci untuk melanjutkan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Kunci dibuka dengan wajah. Tekan untuk melanjutkan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Wajah dikenali. Tekan untuk melanjutkan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Wajah dikenali. Tekan ikon buka kunci untuk melanjutkan."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Diautentikasi"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gunakan PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gunakan pola"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Geser ke atas untuk membuka"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Tekan ikon buka kunci untuk membuka"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Kunci dibuka dengan wajah. Tekan ikon buka kunci untuk membuka."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Kunci dibuka dengan wajah. Tekan untuk membuka."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Wajah dikenali. Tekan untuk membuka."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Wajah dikenali. Tekan ikon buka kunci untuk membuka."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Pindah ke kiri"</item>      <item msgid="5558598599408514296">"Pindah ke bawah"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Dekatkan ke <xliff:g id="DEVICENAME">%1$s</xliff:g> untuk memutar di sini"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Diputar di <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Terjadi error. Coba lagi."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang berjalan"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Nonaktif, periksa aplikasi"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Tidak ditemukan"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrol tidak tersedia"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 96eb447f2ccb..387bdd7fbad5 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Staðfest"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Ýttu á „Staðfesta“ til að ljúka"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Opnað með andliti. Ýttu á táknið taka úr lás til að halda áfram."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Opnað með andliti. Ýttu til að halda áfram."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Andlitið var greint. Ýttu til að halda áfram."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Andlitið var greint. Ýttu á opnunartáknið til að halda áfr."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Auðkennt"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Nota PIN-númer"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Nota mynstur"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Strjúktu upp til að opna"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Ýttu á táknið til að taka úr lás til að opna"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Opnað með andliti. Ýttu á táknið taka úr lás til að opna."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Opnað með andliti. Ýttu til að opna."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Andlitið var greint. Ýttu til að opna."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Andlitið var greint. Ýttu á opnunartáknið til að opna."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Færa til vinstri"</item>      <item msgid="5558598599408514296">"Færa niður"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Færðu tækið nær <xliff:g id="DEVICENAME">%1$s</xliff:g> til að spila hér"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Í spilun í <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Eitthvað fór úrskeiðis. Reyndu aftur."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> er í gangi"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Óvirkt, athugaðu forrit"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Fannst ekki"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Stýring er ekki tiltæk"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 45feb9350261..9dfb9a284735 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confermato"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tocca Conferma per completare"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Sbloccato con il volto. Premi l\'icona Sblocca e continua."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Sbloccato con il volto. Premi per continuare."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Volto riconosciuto. Premi per continuare."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Volto riconosciuto. Premi l\'icona Sblocca e continua."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticazione eseguita"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utilizza PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usa sequenza"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Scorri verso l\'alto per aprire"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Premi l\'icona Sblocca per aprire"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Sbloccato con il volto. Premi l\'icona Sblocca per aprire."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Sbloccato con il volto. Premi per aprire."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Volto riconosciuto. Premi per aprire."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Volto riconosciuto. Premi l\'icona Sblocca per aprire."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Sposta a sinistra"</item>      <item msgid="5558598599408514296">"Sposta giù"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Avvicinati a <xliff:g id="DEVICENAME">%1$s</xliff:g> per riprodurre i contenuti qui"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"In riproduzione su <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Si è verificato un errore. Riprova."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> è in esecuzione"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inattivo, controlla l\'app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Controllo non trovato"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Il controllo non è disponibile"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index a332f871f9b9..2fd8c2f87e1c 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"יש אישור"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"יש להקיש על \'אישור\' לסיום התהליך"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"הנעילה בוטלה בזיהוי פנים. להמשך, לוחצים על סמל ביטול הנעילה."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"הנעילה בוטלה באמצעות זיהוי הפנים. יש ללחוץ כדי להמשיך."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"הפנים זוהו. יש ללחוץ כדי להמשיך."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"הפנים זוהו. להמשך יש ללחוץ על סמל ביטול הנעילה."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"מאומת"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"שימוש בקוד אימות"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"שימוש בקו ביטול נעילה"</string> @@ -317,6 +320,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"צריך להחליק כדי לפתוח"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"לפתיחה, לוחצים על סמל ביטול הנעילה"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"הנעילה בוטלה בזיהוי פנים. פותחים בלחיצה על סמל ביטול הנעילה."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"הנעילה בוטלה באמצעות זיהוי הפנים. יש ללחוץ כדי לפתוח."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"הפנים זוהו. יש ללחוץ כדי לפתוח."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"הפנים זוהו. יש ללחוץ על סמל ביטול הנעילה כדי לפתוח."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"הזזה שמאלה"</item>      <item msgid="5558598599408514296">"הזזה למטה"</item> @@ -837,7 +843,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"צריך להתקרב אל <xliff:g id="DEVICENAME">%1$s</xliff:g> כדי להפעיל כאן"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"פועלת ב-<xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"משהו השתבש. יש לנסות שוב."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> פועלת"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"לא פעיל, יש לבדוק את האפליקציה"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"לא נמצא"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"הפקד לא זמין"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 4f871eff7f90..b64afe8bce07 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"確認しました"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"完了するには [確認] をタップしてください"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"顔でロック解除しました。アイコンを押すと続行します。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"顔でロック解除しました。押して続行してください。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"顔を認識しました。押して続行してください。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"顔を認識しました。ロック解除アイコンを押して続行します。"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"認証済み"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN を使用"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"パターンを使用"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"開くには上にスワイプします"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"ロック解除アイコンを押して開きます"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"顔でロック解除しました。アイコンを押すと開きます。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"顔でロック解除しました。押すと開きます。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"顔を認識しました。押すと開きます。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"顔を認識しました。ロック解除アイコンを押して開きます。"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"左に移動"</item>      <item msgid="5558598599408514296">"下に移動"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ここで再生するには<xliff:g id="DEVICENAME">%1$s</xliff:g>に近づいてください"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>で再生しています"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"エラーが発生しました。もう一度お試しください。"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> を実行しています"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"無効: アプリをご確認ください"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"見つかりませんでした"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"コントロールを使用できません"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index fd969352f007..9ad4aa5df1da 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"დადასტურებული"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"დასასრულებლად შეეხეთ „დადასტურებას“"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"განიბლოკა სახით. გასაგრძელებლად დააჭირეთ განბლოკვის ხატულას."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"განიბლოკა სახით. დააჭირეთ გასაგრძელებლად."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ამოცნობილია სახით. დააჭირეთ გასაგრძელებლად."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ამოცნობილია სახით. გასაგრძელებლად დააჭირეთ განბლოკვის ხატულას."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ავტორიზებულია"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-კოდის გამოყენება"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ნიმუშის გამოყენება"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"გასახსნელად გადაფურცლეთ ზემოთ"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"გასახსნელად დააჭირეთ განბლოკვის ხატულას"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"განიბლოკა სახით. გასახსნელად დააჭირეთ განბლოკვის ხატულას."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"განიბლოკა სახით. დააჭირეთ გასახსნელად."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"ამოცნობილია სახით. დააჭირეთ გასახსნელად."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"ამოცნობილია სახით. გასახსნელად დააჭირეთ განბლოკვის ხატულას."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"მარცხნივ გადატანა"</item>      <item msgid="5558598599408514296">"ქვემოთ გადატანა"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"მიუახლოვდით <xliff:g id="DEVICENAME">%1$s</xliff:g>-ს მისი მეშვეობით დასაკრავად"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"მიმდინარეობს დაკვრა <xliff:g id="DEVICENAME">%1$s</xliff:g>-ზე"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"რაღაც შეცდომა მოხდა. ცადეთ ხელახლა."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> გაშვებულია"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"არააქტიურია, გადაამოწმეთ აპი"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"ვერ მოიძებნა"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"კონტროლი მიუწვდომელია"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index d042926e0579..9f692ef9709a 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Расталды"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Аяқтау үшін \"Растау\" түймесін түртіңіз."</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Бет үлгісі арқылы ашылды. Жалғастыру үшін құлыпты ашу белгішесін басыңыз."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Бетпен ашылды. Жалғастыру үшін басыңыз."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Бет танылды. Жалғастыру үшін басыңыз."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Бет танылды. Жалғастыру үшін құлыпты ашу белгішесін басыңыз."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аутентификацияланған"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN кодын пайдалану"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Өрнекті пайдалану"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Ашу үшін жоғары қарай сырғытыңыз."</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Ашу үшін құлыпты ашу белгішесін басыңыз."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Бет үлгісі арқылы ашылды. Ашу үшін құлыпты ашу белгішесін басыңыз."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Бетпен ашылды. Ашу үшін басыңыз."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Бет танылды. Ашу үшін басыңыз."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Бет танылды. Ашу үшін құлыпты ашу белгішесін басыңыз."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Солға жылжыту"</item>      <item msgid="5558598599408514296">"Төмен жылжыту"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Осы жерде ойнау үшін <xliff:g id="DEVICENAME">%1$s</xliff:g> құрылғысына жақындаңыз"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> құрылғысында ойнатылуда."</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Бірдеңе дұрыс болмады. Қайталап көріңіз."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> қосулы тұр"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Өшірулі. Қолданба тексеріңіз."</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Табылмады"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Басқару виджеті қолжетімсіз"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index dbd8ea290cfe..4001a1be56f9 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"បានបញ្ជាក់"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"ចុច \"បញ្ជាក់\" ដើម្បីបញ្ចប់"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"បានដោះសោដោយប្រើមុខ។ សូមចុចរូបដោះសោ ដើម្បីបន្ត។"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"បានដោះសោដោយប្រើមុខ។ សូមចុច ដើម្បីបន្ត។"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"បានស្គាល់មុខ។ សូមចុច ដើម្បីបន្ត។"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"បានស្គាល់មុខ។ សូមចុចរូបដោះសោ ដើម្បីបន្ត។"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"បានផ្ទៀងផ្ទាត់"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ប្រើកូដ PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ប្រើលំនាំ"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"អូសឡើងលើដើម្បីបើក"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"ចុចរូបដោះសោ ដើម្បីបើក"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"បានដោះសោដោយប្រើមុខ។ សូមចុចរូបដោះសោ ដើម្បីបើក។"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"បានដោះសោដោយប្រើមុខ។ សូមចុច ដើម្បីបើក។"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"បានស្គាល់មុខ។ សូមចុច ដើម្បីបើក។"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"បានស្គាល់មុខ។ សូមចុចរូបដោះសោ ដើម្បីបើក។"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ផ្លាស់ទីទៅឆ្វេង"</item>      <item msgid="5558598599408514296">"ផ្លាស់ទីចុះក្រោម"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"រំកិលឱ្យកាន់តែជិត <xliff:g id="DEVICENAME">%1$s</xliff:g> ដើម្បីចាក់នៅទីនេះ"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"កំពុងចាក់នៅលើ <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"មានអ្វីមួយខុសប្រក្រតី។ សូមព្យាយាមម្ដងទៀត។"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងដំណើរការ"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"អសកម្ម ពិនិត្យមើលកម្មវិធី"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"រកមិនឃើញទេ"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"មិនអាចគ្រប់គ្រងបានទេ"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 26158e0b1f9d..ca543425f9af 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"ಪೂರ್ಣಗೊಳಿಸಲು ದೃಢೀಕರಿಸಿ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"ಮುಖವನ್ನು ಬಳಸಿ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗಿದೆ. ಮುಂದುವರಿಯಲು ಅನ್ಲಾಕ್ ಐಕಾನ್ ಅನ್ನು ಒತ್ತಿ."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"ಮುಖವನ್ನು ಬಳಸಿ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗಿದೆ. ಮುಂದುವರಿಯಲು ಒತ್ತಿ."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ಮುಖ ಗುರುತಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಯಲು ಒತ್ತಿ."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ಮುಖ ಗುರುತಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಯಲು ಅನ್ಲಾಕ್ ಐಕಾನ್ ಅನ್ನು ಒತ್ತಿ."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ಪಿನ್ ಬಳಸಿ"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ಪ್ಯಾಟರ್ನ್ ಬಳಸಿ"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"ತೆರೆಯಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"ತೆರೆಯಲು ಅನ್ಲಾಕ್ ಐಕಾನ್ ಅನ್ನು ಒತ್ತಿ"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"ಮುಖವನ್ನು ಬಳಸಿ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗಿದೆ. ತೆರೆಯಲು ಅನ್ಲಾಕ್ ಐಕಾನ್ ಅನ್ನು ಒತ್ತಿ."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"ಮುಖವನ್ನು ಬಳಸಿ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗಿದೆ. ತೆರೆಯಲು ಒತ್ತಿ."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"ಮುಖ ಗುರುತಿಸಲಾಗಿದೆ. ತೆರೆಯಲು ಒತ್ತಿ."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"ಮುಖ ಗುರುತಿಸಲಾಗಿದೆ. ತೆರೆಯಲು ಅನ್ಲಾಕ್ ಐಕಾನ್ ಅನ್ನು ಒತ್ತಿ."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ಎಡಕ್ಕೆ ಸರಿಸಿ"</item>      <item msgid="5558598599408514296">"ಕೆಳಗೆ ಸರಿಸಿ"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ಇಲ್ಲಿ ಪ್ಲೇ ಮಾಡಲು <xliff:g id="DEVICENAME">%1$s</xliff:g> ಸಮೀಪಕ್ಕೆ ಹೋಗಿ"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> ನಲ್ಲಿ ಪ್ಲೇ ಆಗುತ್ತಿದೆ"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"ಏನೋ ತಪ್ಪಾಗಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ರನ್ ಆಗುತ್ತಿದೆ"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"ನಿಷ್ಕ್ರಿಯ, ಆ್ಯಪ್ ಪರಿಶೀಲಿಸಿ"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"ಕಂಡುಬಂದಿಲ್ಲ"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"ನಿಯಂತ್ರಣ ಲಭ್ಯವಿಲ್ಲ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 4d47843503f6..5cf70cfd6a9e 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"확인함"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"완료하려면 확인을 탭하세요."</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"얼굴 인식으로 잠금 해제되었습니다. 계속하려면 잠금 해제 아이콘을 누르세요."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"얼굴 인식으로 잠금 해제되었습니다. 계속하려면 누르세요."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"얼굴이 인식되었습니다. 계속하려면 누르세요."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"얼굴이 인식되었습니다. 계속하려면 아이콘을 누르세요."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"인증됨"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN 사용"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"패턴 사용"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"위로 스와이프하여 열기"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"기기를 열려면 잠금 해제 아이콘을 누르세요."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"얼굴 인식으로 잠금 해제되었습니다. 기기를 열려면 잠금 해제 아이콘을 누르세요."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"얼굴 인식으로 잠금 해제되었습니다. 열려면 누르세요."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"얼굴이 인식되었습니다. 열려면 누르세요."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"얼굴이 인식되었습니다. 열려면 잠금 해제 아이콘을 누르세요."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"왼쪽으로 이동"</item>      <item msgid="5558598599408514296">"아래로 이동"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"현재 기기에서 재생하려면 <xliff:g id="DEVICENAME">%1$s</xliff:g>에 더 가까이 이동합니다."</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>에서 재생 중"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"문제가 발생했습니다. 다시 시도해 주세요."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> 실행 중"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"비활성. 앱을 확인하세요."</string>      <string name="controls_error_removed" msgid="6675638069846014366">"찾을 수 없음"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"컨트롤을 사용할 수 없음"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 4458e337a838..17051c92b8c2 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Ырасталды"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Бүтүрүү үчүн \"Ырастоо\" баскычын басыңыз"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Кулпуну жүзүңүз менен ачтыңыз. Улантуу үчүн кулпусун ачуу сүрөтчөсүн басыңыз."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Кулпуну жүзүңүз менен ачтыңыз. Улантуу үчүн басыңыз."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Жүз таанылды. Улантуу үчүн басыңыз."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Жүз таанылды. Улантуу үчүн кулпусун ачуу сүрөтчөсүн басыңыз."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аныктыгы текшерилди"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN кодду колдонуу"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Графикалык ачкычты колдонуу"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Ачуу үчүн өйдө сүрүңүз"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Кулпуну ачуу сүрөтчөсүн басыңыз"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Кулпуну жүзүңүз менен ачтыңыз. Эми кулпуну ачуу сүрөтчөсүн басыңыз."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Кулпуну жүзүңүз менен ачтыңыз. Ачуу үчүн басыңыз."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Жүз таанылды. Ачуу үчүн басыңыз."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Жүз таанылды. Эми кулпуну ачуу сүрөтчөсүн басыңыз."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Солго жылдыруу"</item>      <item msgid="5558598599408514296">"Төмөн жылдыруу"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Бул жерде ойнотуу үчүн <xliff:g id="DEVICENAME">%1$s</xliff:g> түзмөгүнө жакындатыңыз"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> аркылуу ойнотулууда"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Бир жерден ката кетти. Кайра аракет кылыңыз."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> иштеп жатат"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Жигерсиз. Колдонмону текшериңиз"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Табылган жок"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Башкара албайсыз"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 6640055fe802..87ed4087f852 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"ຢືນຢັນແລ້ວ"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"ແຕະຢືນຢັນເພື່ອສຳເລັດ"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"ປົດລັອກດ້ວຍໜ້າແລ້ວ. ກົດໄອຄອນປົດລັອກເພື່ອສືບຕໍ່."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"ປົດລັອກດ້ວຍໜ້າແລ້ວ. ກົດເພື່ອສືບຕໍ່."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ຈຳແນກໜ້າໄດ້ແລ້ວ. ກົດເພື່ອສືບຕໍ່."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ຈຳແນກໜ້າໄດ້ແລ້ວ. ກົດໄອຄອນປົດລັອກເພື່ອສືບຕໍ່."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ຮັບຮອງຄວາມຖືກຕ້ອງແລ້ວ"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ໃຊ້ PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ໃຊ້ຮູບແບບ"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"ປັດຂຶ້ນເພື່ອເປີດ"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"ກົດໄອຄອນປົດລັອກເພື່ອເປີດ"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"ປົດລັອກດ້ວຍໜ້າແລ້ວ. ກົດໄອຄອນປົດລັອກເພື່ອເປີດ."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"ປົດລັອກດ້ວຍໜ້າແລ້ວ. ກົດເພື່ອເປີດ."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"ຈຳແນກໜ້າໄດ້ແລ້ວ. ກົດເພື່ອເປີດ."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"ຈຳແນກໜ້າໄດ້ແລ້ວ. ກົດໄອຄອນປົດລັອກເພື່ອເປີດ."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ຍ້າຍໄປຊ້າຍ"</item>      <item msgid="5558598599408514296">"ຍ້າຍລົງ"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ກະລຸນາຍ້າຍເຂົ້າໃກ້ <xliff:g id="DEVICENAME">%1$s</xliff:g> ເພື່ອຫຼິ້ນຢູ່ບ່ອນນີ້"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"ກຳລັງຫຼິ້ນຢູ່ <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"ມີບາງຢ່າງຜິດພາດເກີດຂຶ້ນ. ກະລຸນາລອງໃໝ່."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງເຮັດວຽກຢູ່"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"ບໍ່ເຮັດວຽກ, ກະລຸນາກວດສອບແອັບ"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"ບໍ່ພົບ"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"ບໍ່ສາມາດໃຊ້ການຄວບຄຸມໄດ້"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 5cf8091b1b86..c9aa65c0c999 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Patvirtinta"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Paliesk. „Patvirtinti“, kad užbaigtumėte"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Atrakinta pagal veidą. Pasp. atrak. pikt., kad tęstumėte."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Atrakinta pagal veidą. Paspauskite, jei norite tęsti."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Veidas atpažintas. Paspauskite, jei norite tęsti."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Veidas atpažintas. Tęskite paspaudę atrakinimo piktogramą."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikuota"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Naudoti PIN kodą"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Naudoti atrakinimo piešinį"</string> @@ -317,6 +320,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Perbraukite aukštyn, kad atidarytumėte"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Paspauskite atrakinimo piktogramą, kad atidarytumėte"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Atrakinta pagal veidą. Pasp. atr. pikt., kad atidarytumėte."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Atrakinta pagal veidą. Paspauskite, kad atidarytumėte."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Veidas atpažintas. Paspauskite, kad atidarytumėte."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Veidas atpažintas. Atidarykite paspaudę atrakin. piktogramą."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Perkelti kairėn"</item>      <item msgid="5558598599408514296">"Perkelti žemyn"</item> @@ -837,7 +843,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Perkelkite arčiau „<xliff:g id="DEVICENAME">%1$s</xliff:g>“, kad būtų galima leisti čia"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Leidžiama įrenginyje „<xliff:g id="DEVICENAME">%1$s</xliff:g>“"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Kažkas ne taip. Bandykite dar kartą."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ vykdoma"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Neaktyvu, patikrinkite progr."</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nerasta"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Valdiklis nepasiekiamas"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index b15a9dc4f6aa..7c1e658da448 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Apstiprināts"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Lai pabeigtu, pieskarieties Apstiprināt"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Atbloķēta ar seju. Turpināt: nospiediet atbloķēšanas ikonu."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Ierīce atbloķēta ar seju. Nospiediet, lai turpinātu."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Seja atpazīta. Nospiediet, lai turpinātu."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Seja atpazīta. Lai turpinātu, nospiediet atbloķēšanas ikonu."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikācija veikta"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Izmantot PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Izmantot kombināciju"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Velciet augšup, lai atvērtu"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Lai atvērtu, nospiediet atbloķēšanas ikonu"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Atbloķēta ar seju. Atvērt: nospiediet atbloķēšanas ikonu."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Ierīce atbloķēta ar seju. Nospiediet, lai atvērtu."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Seja atpazīta. Nospiediet, lai atvērtu."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Seja atpazīta. Lai atvērtu, nospiediet atbloķēšanas ikonu."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Pārvietojiet pirkstu pa kreisi"</item>      <item msgid="5558598599408514296">"Pārvietojiet pirkstu lejup"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Pārvietojieties tuvāk ierīcei “<xliff:g id="DEVICENAME">%1$s</xliff:g>”, lai atskaņotu šeit"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Notiek atskaņošana ierīcē <xliff:g id="DEVICENAME">%1$s</xliff:g>."</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Radās kļūda. Mēģiniet vēlreiz."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> darbojas"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Neaktīva, pārbaudiet lietotni"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Netika atrasta"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Vadīkla nav pieejama"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 94e390ce8f54..8624604c8f5b 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Потврдено"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Допрете „Потврди“ за да се заврши"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Отклучено со лик. Притиснете ја иконата за отклучување за да продолжите."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Отклучено со лик. Притиснете за да продолжите."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Лицето е препознаено. Притиснете за да продолжите."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицето е препознаено. Притиснете ја иконата за отклучување за да продолжите."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Проверена"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Користи PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Користи шема"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Повлечете за да отворите"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Притиснете ја иконата за отклучување за да отворите"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Отклучено со лик. Притиснете ја иконата за отклучување за да отворите."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Отклучено со лик. Притиснете за да отворите."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Лицето е препознаено. Притиснете за да отворите."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Лицето е препознаено. Притиснете ја иконата за отклучување за да отворите."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Премести налево"</item>      <item msgid="5558598599408514296">"Премести надолу"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Приближете се до <xliff:g id="DEVICENAME">%1$s</xliff:g> за да пуштите тука"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Пуштено на <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Нешто не е во ред. Обидете се повторно."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> работи"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Неактивна, провери апликација"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Не е најдено"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Контролата не е достапна"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 6d2235642aa1..85c420a3e6b6 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"സ്ഥിരീകരിച്ചു"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"പൂർത്തിയാക്കാൻ സ്ഥിരീകരിക്കുക ടാപ്പ് ചെയ്യൂ"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"മുഖം ഉപയോഗിച്ച് അൺലോക്ക് ചെയ്തു. തുടരാൻ അൺലോക്ക് ഐക്കൺ അമർത്തുക."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"മുഖം ഉപയോഗിച്ച് അൺലോക്ക് ചെയ്തു. തുടരാൻ അമർത്തുക."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"മുഖം തിരിച്ചറിഞ്ഞു. തുടരാൻ അമർത്തുക."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"മുഖം തിരിച്ചറിഞ്ഞു. തുടരാൻ അൺലോക്ക് ഐക്കൺ അമർത്തുക."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"പരിശോധിച്ചുറപ്പിച്ചു"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"പിൻ ഉപയോഗിക്കുക"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"പാറ്റേൺ ഉപയോഗിക്കുക"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"തുറക്കാൻ മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"തുറക്കാൻ അൺലോക്ക് ഐക്കൺ അമർത്തുക"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"മുഖം ഉപയോഗിച്ച് അൺലോക്ക് ചെയ്തു. തുറക്കാൻ അൺലോക്ക് ഐക്കൺ അമർത്തുക."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"മുഖം ഉപയോഗിച്ച് അൺലോക്ക് ചെയ്തു. തുറക്കാൻ അമർത്തുക."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"മുഖം തിരിച്ചറിഞ്ഞു. തുറക്കാൻ അമർത്തുക."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"മുഖം തിരിച്ചറിഞ്ഞു. തുറക്കാൻ അൺലോക്ക് ഐക്കൺ അമർത്തുക."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ഇടത്തേക്ക് നീക്കുക"</item>      <item msgid="5558598599408514296">"താഴേക്ക് നീക്കുക"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ഇവിടെ പ്ലേ ചെയ്യാൻ <xliff:g id="DEVICENAME">%1$s</xliff:g> എന്നതിന് അടുത്തേക്ക് നീക്കുക"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> എന്നതിൽ പ്ലേ ചെയ്യുന്നു"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"എന്തോ കുഴപ്പമുണ്ടായി. വീണ്ടും ശ്രമിക്കുക."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> റൺ ചെയ്യുന്നു"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"നിഷ്ക്രിയം, ആപ്പ് പരിശോധിക്കൂ"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"കണ്ടെത്തിയില്ല"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"നിയന്ത്രണം ലഭ്യമല്ല"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 4b2017376ad8..aa1a6a019e36 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Баталгаажсан"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Дуусгахын тулд баталгаажуулахыг товших"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Царайгаар түгжээг тайлсан. Үргэлжлүүлэхийн тулд түгжээг тайлах дүрс тэмдэг дээр дараарай."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Царайгаар түгжээг тайлсан. Үргэлжлүүлэхийн тулд дарна уу."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Царайг таньсан. Үргэлжлүүлэхийн тулд дарна уу."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Царайг таньсан. Үргэлжлүүлэх бол түгжээг тайлах дүрсийг дар."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Баталгаажуулагдсан"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ПИН ашиглах"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Хээ ашиглах"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Нээхийн тулд дээш шударна уу"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Нээхийн тулд түгжээг тайлах дүрс тэмдэг дээр дараарай"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Царайгаар түгжээг тайлсан. Нээхийн тулд түгжээг тайлах дүрс тэмдэг дээр дараарай."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Царайгаар түгжээг тайлсан. Нээхийн тулд дарна уу."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Царайг таньсан. Нээхийн тулд дарна уу."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Царайг таньсан. Нээх бол түгжээг тайлах дүрсийг дарна уу."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Зүүн тийш зөөх"</item>      <item msgid="5558598599408514296">"Доош зөөх"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Энд тоглуулахын тулд <xliff:g id="DEVICENAME">%1$s</xliff:g>-д ойртоно уу"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> дээр тоглуулж байна"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Алдаа гарлаа. Дахин оролдоно уу."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ажиллаж байна"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Идэвхгүй байна, аппыг шалгана уу"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Олдсонгүй"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Хяналт боломжгүй байна"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 1cea901a545e..624c9e921110 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"निश्चित केले"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"पूर्ण करण्यासाठी खात्री करा वर टॅप करा"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"चेहऱ्याने अनलॉक केले. सुरू ठेवण्यासाठी अनलॉक करा आयकन दाबा."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"चेहऱ्याने अनलॉक केले आहे. पुढे सुरू ठेवण्यासाठी दाबा."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी दाबा."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी अनलॉक करा आयकन दाबा."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ऑथेंटिकेशन केलेले"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"पिन वापरा"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"पॅटर्न वापरा"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"उघडण्यासाठी वर स्वाइप करा"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"उघडण्यासाठी अनलॉक करा आयकन दाबा"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"चेहऱ्याने अनलॉक केले. उघडण्यासाठी अनलॉक करा आयकन दाबा."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"चेहऱ्याने अनलॉक केले आहे. उघडण्यासाठी दाबा."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"चेहरा ओळखला आहे. उघडण्यासाठी दाबा."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"चेहरा ओळखला आहे. उघडण्यासाठी अनलॉक करा आयकन दाबा."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"डावीकडे हलवा"</item>      <item msgid="5558598599408514296">"खाली हलवा"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"येथे प्ले करण्यासाठी <xliff:g id="DEVICENAME">%1$s</xliff:g> च्या जवळ जा"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> वर प्ले केला जात आहे"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"काहीतरी चूक झाली. पुन्हा प्रयत्न करा."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> रन होत आहे"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"निष्क्रिय, ॲप तपासा"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"आढळले नाही"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"नियंत्रण उपलब्ध नाही"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 1b70a725c26a..db64dd05e3b8 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Disahkan"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Ketik Sahkan untuk menyelesaikan"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Dibuka kunci dengan wajah. Tekan ikon buka kunci untuk teruskan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Dibuka kunci dengan wajah. Tekan untuk meneruskan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Wajah dicam. Tekan untuk meneruskan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Wajah dicam. Tekan ikon buka kunci untuk meneruskan."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Disahkan"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gunakan PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gunakan corak"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Leret ke atas untuk buka"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Tekan ikon buka kunci untuk buka"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Dibuka kunci dengan wajah. Tekan ikon buka kunci untuk buka."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Dibuka kunci dengan wajah. Tekan untuk membuka."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Wajah dicam. Tekan untuk membuka."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Wajah dicam. Tekan ikon buka kunci untuk membuka."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Alih ke kiri"</item>      <item msgid="5558598599408514296">"Alih ke bawah"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Dekatkan dengan <xliff:g id="DEVICENAME">%1$s</xliff:g> untuk bermain di sini"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Dimainkan pada <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Kesilapan telah berlaku. Cuba lagi."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang dijalankan"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Tidak aktif, semak apl"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Tidak ditemukan"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kawalan tidak tersedia"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 63b61392bac8..b651f921297d 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"အတည်ပြုပြီးပြီ"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"အပြီးသတ်ရန်အတွက် \'အတည်ပြုရန်\' ကို တို့ပါ"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"မျက်နှာပြ လော့ခ်ဖွင့်ထားသည်။ လော့ခ်ဖွင့်သင်္ကေတနှိပ်၍ ရှေ့ဆက်ပါ။"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"မျက်နှာဖြင့် ဖွင့်ထားသည်။ ရှေ့ဆက်ရန် နှိပ်ပါ။"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"မျက်နှာ မှတ်မိသည်။ ရှေ့ဆက်ရန် နှိပ်ပါ။"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"မျက်နှာ မှတ်မိသည်။ ရှေ့ဆက်ရန် လော့ခ်ဖွင့်သင်္ကေတကို နှိပ်ပါ။"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"အထောက်အထားစိစစ်ပြီးပြီ"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ပင်နံပါတ်သုံးရန်"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ပုံစံကို သုံးရန်"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"ဖွင့်ရန် အပေါ်သို့ပွတ်ဆွဲပါ"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"ဖွင့်ရန် လော့ခ်ဖွင့်သင်္ကေတကို နှိပ်ပါ"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"မျက်နှာပြ လော့ခ်ဖွင့်ထားသည်။ လော့ခ်ဖွင့်သင်္ကေတ နှိပ်၍ဝင်ပါ။"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"မျက်နှာဖြင့် ဖွင့်ထားသည်။ ဖွင့်ရန် နှိပ်ပါ။"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"မျက်နှာ မှတ်မိသည်။ ဖွင့်ရန် နှိပ်ပါ။"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"မျက်နှာ မှတ်မိသည်။ ဖွင့်ရန် လော့ခ်ဖွင့်သင်္ကေတကို နှိပ်ပါ။"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ဘယ်ဘက်သို့ရွှေ့ရန်"</item>      <item msgid="5558598599408514296">"အောက်သို့ရွှေ့ရန်"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ဤနေရာတွင်ဖွင့်ရန် <xliff:g id="DEVICENAME">%1$s</xliff:g> အနီးသို့တိုးပါ"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> တွင် ဖွင့်နေသည်"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"တစ်ခုခုမှားသွားသည်။ ထပ်စမ်းကြည့်ပါ။"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ပွင့်နေပါသည်"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"ရပ်နေသည်၊ အက်ပ်ကို စစ်ဆေးပါ"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"မတွေ့ပါ"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"ထိန်းချုပ်မှု မရနိုင်ပါ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 3df71e2dce1d..a73dc475643d 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Bekreftet"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Trykk på Bekreft for å fullføre"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Låst opp med ansiktet. Trykk på lås opp-ikonet for å fortsette"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Låst opp med ansiktet. Trykk for å fortsette."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ansiktet er gjenkjent. Trykk for å fortsette."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansiktet er gjenkjent. Trykk på lås opp-ikon for å fortsette"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentisert"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Bruk PIN-kode"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Bruk mønster"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Sveip opp for å åpne"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Trykk på lås opp-ikonet for å åpne"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Låst opp med ansiktet. Trykk på lås opp-ikonet for å fortsette"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Låst opp med ansiktet. Trykk for å åpne."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Ansiktet er gjenkjent. Trykk for å åpne."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Ansiktet er gjenkjent. Trykk på lås opp-ikon for å fortsette"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Flytt til venstre"</item>      <item msgid="5558598599408514296">"Flytt ned"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Flytt deg nærmere <xliff:g id="DEVICENAME">%1$s</xliff:g> for å spille av her"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Spilles av på <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Noe gikk galt. Prøv på nytt."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> kjører"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv. Sjekk appen"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Ikke funnet"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrollen er utilgjengelig"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 376207830cfc..896a4f4785e0 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"पुष्टि भयो"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"पूरा गर्नका लागि पुष्टि गर्नुहोस् नामक विकल्पमा ट्याप गर्नुहोस्"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"अनुहार प्रयोग गरी अनलक गरियो। जारी राख्न अनलक आइकनमा थिच्नुहोस्।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"अनुहार प्रयोग गरी अनलक गरियो। जारी राख्न थिच्नुहोस्।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"अनुहार पहिचान गरियो। जारी राख्न थिच्नुहोस्।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"अनुहार पहिचान गरियो। जारी राख्न अनलक आइकनमा थिच्नुहोस्।"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"प्रमाणीकरण गरियो"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN प्रयोग गर्नुहोस्"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ढाँचा प्रयोग गर्नुहोस्"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"खोल्न माथितिर स्वाइप गर्नुहोस्"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"खोल्न अनलक आइकनमा थिच्नुहोस्"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"अनुहार प्रयोग गरी अनलक गरियो। खोल्न अनलक आइकनमा थिच्नुहोस्।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"अनुहार प्रयोग गरी अनलक गरियो। डिभाइस खोल्न थिच्नुहोस्।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"अनुहार पहिचान गरियो। डिभाइस खोल्न थिच्नुहोस्।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"अनुहार पहिचान गरियो। डिभाइस खोल्न अनलक आइकनमा थिच्नुहोस्।"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"बायाँ सार्नुहोस्"</item>      <item msgid="5558598599408514296">"तल सार्नुहोस्"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"तपाईं यहाँ प्ले गर्न चाहनुहुन्छ भने आफ्नो डिभाइसलाई <xliff:g id="DEVICENAME">%1$s</xliff:g> नजिकै लैजानुहोस्"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> मा प्ले गरिँदै छ"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"केही चिज गडबड भयो। फेरि प्रयास गर्नुहोस्।"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> चलिरहेको छ"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"निष्क्रिय छ, एप जाँच गर्नु…"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"फेला परेन"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"नियन्त्रण उपलब्ध छैन"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index f926af950478..b36fc2de0202 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Bevestigd"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tik op Bevestigen om te voltooien"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Ontgrendeld via gezicht. Druk op het ontgrendelicoon."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Ontgrendeld via gezicht. Druk om door te gaan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Gezicht herkend. Druk om door te gaan."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gezicht herkend. Druk op het ontgrendelicoon."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Geverifieerd"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Pincode gebruiken"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Patroon gebruiken"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Swipe omhoog om te openen"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Druk op het ontgrendelicoon om te openen"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Ontgrendeld via gezicht. Druk op het ontgrendelicoon."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Ontgrendeld via gezicht. Druk om te openen."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Gezicht herkend. Druk om te openen."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Gezicht herkend. Druk op het ontgrendelicoon."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Naar links verplaatsen"</item>      <item msgid="5558598599408514296">"Omlaag verplaatsen"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Ga dichter bij <xliff:g id="DEVICENAME">%1$s</xliff:g> staan om hier af te spelen"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Afspelen op <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Er is iets misgegaan. Probeer het opnieuw."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> is actief"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactief, check de app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Niet gevonden"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Beheeroptie niet beschikbaar"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 2fa333b8fee0..d7ebe4c74089 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"ସୁନିଶ୍ଚିତ କରାଯାଇଛି"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ ସୁନିଶ୍ଚିତ କରନ୍ତୁରେ ଟାପ୍ କରନ୍ତୁ"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"ଫେସ ମାଧ୍ୟମରେ ଅନଲକ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ଅନଲକ ଆଇକନ ଦବାନ୍ତୁ।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"ଫେସ ମାଧ୍ୟମରେ ଅନଲକ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ଦବାନ୍ତୁ।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ଫେସ ଚିହ୍ନଟ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ଦବାନ୍ତୁ।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ଫେସ ଚିହ୍ନଟ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ଅନଲକ ଆଇକନ ଦବାନ୍ତୁ।"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ପ୍ରାମାଣିକତା ହୋଇଛି"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN ବ୍ୟବହାର କରନ୍ତୁ"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ପାଟର୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"ଖୋଲିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"ଖୋଲିବାକୁ ଅନଲକ ଆଇକନ ଦବାନ୍ତୁ"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"ଫେସ ମାଧ୍ୟମରେ ଅନଲକ କରାଯାଇଛି। ଖୋଲିବାକୁ ଅନଲକ ଆଇକନ ଦବାନ୍ତୁ।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"ଫେସ ମାଧ୍ୟମରେ ଅନଲକ କରାଯାଇଛି। ଖୋଲିବାକୁ ଦବାନ୍ତୁ।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"ଫେସ ଚିହ୍ନଟ କରାଯାଇଛି। ଖୋଲିବାକୁ ଦବାନ୍ତୁ।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"ଫେସ ଚିହ୍ନଟ କରାଯାଇଛି। ଖୋଲିବାକୁ ଅନଲକ ଆଇକନ ଦବାନ୍ତୁ।"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ବାମକୁ ମୁଭ କରନ୍ତୁ"</item>      <item msgid="5558598599408514296">"ତଳକୁ ମୁଭ କରନ୍ତୁ"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ଏଠାରେ ଚଲାଇବା ପାଇଁ <xliff:g id="DEVICENAME">%1$s</xliff:g>ର ପାଖକୁ ମୁଭ କରନ୍ତୁ"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>ରେ ଚାଲୁଛି"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"କିଛି ତ୍ରୁଟି ହୋଇଛି। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଚାଲୁଛି"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"ନିଷ୍କ୍ରିୟ ଅଛି, ଆପ ଯାଞ୍ଚ କରନ୍ତୁ"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"ମିଳିଲା ନାହିଁ"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"ନିୟନ୍ତ୍ରଣ ଉପଲବ୍ଧ ନାହିଁ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 7104d4a952b2..1e5cda32cbba 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"ਪੂਰਾ ਕਰਨ ਲਈ ਪੁਸ਼ਟੀ ਕਰੋ \'ਤੇ ਟੈਪ ਕਰੋ"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"ਚਿਹਰੇ ਰਾਹੀਂ ਅਣਲਾਕ ਕੀਤਾ ਗਿਆ। ਜਾਰੀ ਰੱਖਣ ਲਈ \'ਅਣਲਾਕ ਕਰੋ\' ਪ੍ਰਤੀਕ ਨੂੰ ਦਬਾਓ।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"ਚਿਹਰੇ ਰਾਹੀਂ ਅਣਲਾਕ ਕੀਤਾ ਗਿਆ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਦਬਾਓ।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਹੋਈ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਦਬਾਓ।"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਹੋਈ। ਜਾਰੀ ਰੱਖਣ ਲਈ \'ਅਣਲਾਕ ਕਰੋ\' ਪ੍ਰਤੀਕ ਨੂੰ ਦਬਾਓ।"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ਪ੍ਰਮਾਣਿਤ ਹੋਇਆ"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ਪਿੰਨ ਵਰਤੋ"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ਪੈਟਰਨ ਵਰਤੋ"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"ਖੋਲ੍ਹਣ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"ਖੋਲ੍ਹਣ ਲਈ \'ਅਣਲਾਕ ਕਰੋ\' ਪ੍ਰਤੀਕ ਨੂੰ ਦਬਾਓ"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"ਚਿਹਰੇ ਰਾਹੀਂ ਅਣਲਾਕ ਕੀਤਾ ਗਿਆ। ਖੋਲ੍ਹਣ ਲਈ \'ਅਣਲਾਕ ਕਰੋ\' ਪ੍ਰਤੀਕ ਨੂੰ ਦਬਾਓ।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"ਚਿਹਰੇ ਰਾਹੀਂ ਅਣਲਾਕ ਕੀਤਾ ਗਿਆ। ਖੋਲ੍ਹਣ ਲਈ ਦਬਾਓ।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਹੋਈ। ਖੋਲ੍ਹਣ ਲਈ ਦਬਾਓ।"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਹੋਈ। ਖੋਲ੍ਹਣ ਲਈ \'ਅਣਲਾਕ ਕਰੋ\' ਪ੍ਰਤੀਕ ਨੂੰ ਦਬਾਓ।"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ਖੱਬੇ ਲਿਜਾਓ"</item>      <item msgid="5558598599408514296">"ਹੇਠਾਂ ਲਿਜਾਓ"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ਇੱਥੇ ਚਲਾਉਣ ਲਈ <xliff:g id="DEVICENAME">%1$s</xliff:g> ਦੇ ਨੇੜੇ ਜਾਓ"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> \'ਤੇ ਚਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਚੱਲ ਰਿਹਾ ਹੈ"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"ਅਕਿਰਿਆਸ਼ੀਲ, ਐਪ ਦੀ ਜਾਂਚ ਕਰੋ"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"ਨਹੀਂ ਮਿਲਿਆ"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"ਕੰਟਰੋਲ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 891a9410f003..99965408aaf7 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Potwierdzono"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Aby zakończyć, kliknij Potwierdź"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Odblokowano skanem twarzy. Aby kontynuować, kliknij ikonę odblokowywania."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Odblokowano rozpoznawaniem twarzy. Kliknij, aby kontynuować."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Twarz rozpoznana. Kliknij, aby kontynuować."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Twarz rozpoznana. Aby kontynuować, kliknij ikonę odblokowywania."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Uwierzytelniono"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Użyj kodu PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Użyj wzoru"</string> @@ -317,6 +320,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Przesuń w górę, by otworzyć"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Aby otworzyć, kliknij ikonę odblokowywania"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Odblokowano skanem twarzy. Aby otworzyć, kliknij ikonę odblokowywania."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Odblokowano rozpoznawaniem twarzy. Naciśnij, by otworzyć."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Twarz rozpoznana. Naciśnij, by otworzyć."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Twarz rozpoznana. Aby otworzyć, kliknij ikonę odblokowywania."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Przenieś w lewo"</item>      <item msgid="5558598599408514296">"Przenieś w dół"</item> @@ -837,7 +843,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Zbliż do urządzenia <xliff:g id="DEVICENAME">%1$s</xliff:g>, aby na nim odtwarzać"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Odtwarzam na ekranie <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Coś poszło nie tak. Spróbuj ponownie."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> jest uruchomiona"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Nieaktywny, sprawdź aplikację"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nie znaleziono"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Element jest niedostępny"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 79b92b571c20..381ed488793c 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmada"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Toque em \"Confirmar\" para concluir"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Desbloqueado pelo rosto. Pressione o ícone de desbloqueio para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Desbloqueado pelo rosto. Pressione para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Rosto reconhecido. Pressione para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Pressione o ícone para continuar."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Deslize para cima para abrir"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Pressione o ícone de desbloqueio para abrir"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Desbloqueado pelo rosto. Toque no ícone do cadeado para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Desbloqueado pelo rosto. Pressione para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Rosto reconhecido. Pressione para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Rosto reconhecido. Pressione o ícone de desbloq. para abrir."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Mais para a esquerda"</item>      <item msgid="5558598599408514296">"Mais para baixo"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Aproxime-se do dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g> para abrir a mídia aqui"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Mídia aberta no dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Algo deu errado. Tente novamente."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> está em execução"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inativo, verifique o app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"O controle está indisponível"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml index abf8749e84d7..0ae323908445 100644 --- a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml @@ -138,8 +138,8 @@    </string-array>    <string-array name="tile_states_cameratoggle">      <item msgid="6680671247180519913">"Indisponível"</item> -    <item msgid="4765607635752003190">"Desativada"</item> -    <item msgid="1697460731949649844">"Ativada"</item> +    <item msgid="4765607635752003190">"Desligada"</item> +    <item msgid="1697460731949649844">"Ligada"</item>    </string-array>    <string-array name="tile_states_mictoggle">      <item msgid="6895831614067195493">"Indisponível"</item> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index a0e12a4969bd..58bca2432f20 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmado"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Toque em Confirmar para concluir."</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Desbloqueio com a face. Prima o ícone de desb. p/ continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Desbloqueado com o rosto. Prima para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Rosto reconhecido. Prima para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Prima ícone de desbloqueio para continuar"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utilizar PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utilizar padrão"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Deslize rapidamente para cima para abrir"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Prima o ícone de desbloqueio para abrir"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Desbloqueio com a face. Prima ícone de desbloqueio p/ abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Desbloqueado com o rosto. Prima para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Rosto reconhecido. Prima para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Rosto reconhecido. Prima o ícone de desbloqueio para abrir."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Mover para a esquerda"</item>      <item msgid="5558598599408514296">"Mover para baixo"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Aproxime-se do dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g> para reproduzir aqui"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"A reproduzir no dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Algo correu mal. Tente novamente."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> em execução"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inativa. Consulte a app."</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado."</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"O controlo está indisponível"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml index c8e557b38f9b..8fdd0c421a5e 100644 --- a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml @@ -138,8 +138,8 @@    </string-array>    <string-array name="tile_states_cameratoggle">      <item msgid="6680671247180519913">"Indisponível"</item> -    <item msgid="4765607635752003190">"Desligado"</item> -    <item msgid="1697460731949649844">"Ligado"</item> +    <item msgid="4765607635752003190">"Desligada"</item> +    <item msgid="1697460731949649844">"Ligada"</item>    </string-array>    <string-array name="tile_states_mictoggle">      <item msgid="6895831614067195493">"Indisponível"</item> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 79b92b571c20..381ed488793c 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmada"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Toque em \"Confirmar\" para concluir"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Desbloqueado pelo rosto. Pressione o ícone de desbloqueio para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Desbloqueado pelo rosto. Pressione para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Rosto reconhecido. Pressione para continuar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Pressione o ícone para continuar."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Deslize para cima para abrir"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Pressione o ícone de desbloqueio para abrir"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Desbloqueado pelo rosto. Toque no ícone do cadeado para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Desbloqueado pelo rosto. Pressione para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Rosto reconhecido. Pressione para abrir."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Rosto reconhecido. Pressione o ícone de desbloq. para abrir."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Mais para a esquerda"</item>      <item msgid="5558598599408514296">"Mais para baixo"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Aproxime-se do dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g> para abrir a mídia aqui"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Mídia aberta no dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Algo deu errado. Tente novamente."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> está em execução"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inativo, verifique o app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"O controle está indisponível"</string> diff --git a/packages/SystemUI/res/values-pt/tiles_states_strings.xml b/packages/SystemUI/res/values-pt/tiles_states_strings.xml index abf8749e84d7..0ae323908445 100644 --- a/packages/SystemUI/res/values-pt/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-pt/tiles_states_strings.xml @@ -138,8 +138,8 @@    </string-array>    <string-array name="tile_states_cameratoggle">      <item msgid="6680671247180519913">"Indisponível"</item> -    <item msgid="4765607635752003190">"Desativada"</item> -    <item msgid="1697460731949649844">"Ativada"</item> +    <item msgid="4765607635752003190">"Desligada"</item> +    <item msgid="1697460731949649844">"Ligada"</item>    </string-array>    <string-array name="tile_states_mictoggle">      <item msgid="6895831614067195493">"Indisponível"</item> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 1822c0fc4330..5748713f9de1 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Confirmat"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Atinge Confirm pentru a finaliza"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Deblocat facial. Apasă pictograma Deblocare ca să continui."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"S-a deblocat cu ajutorul feței. Apasă pentru a continua."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Chipul a fost recunoscut. Apasă pentru a continua."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Chip recunoscut. Apasă pictograma Deblocare ca să continui."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentificat"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Folosește PIN-ul"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Folosește modelul"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Glisează în sus pentru a deschide"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Apasă pictograma de deblocare pentru a deschide"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Deblocat facial. Apasă pictograma Deblocare ca să deschizi."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"S-a deblocat cu ajutorul feței. Apasă pentru a deschide."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Chipul a fost recunoscut. Apasă pentru a deschide."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Chip recunoscut. Apasă pictograma Deblocare ca să deschizi."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Mută la stânga"</item>      <item msgid="5558598599408514296">"Mută în jos"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Apropie-te de <xliff:g id="DEVICENAME">%1$s</xliff:g> ca să redai acolo"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Se redă pe <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"A apărut o eroare. Încearcă din nou."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> rulează"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inactiv, verifică aplicația"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nu s-a găsit"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Comanda este indisponibilă"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index e2ba50826485..6b9e54ea2d5a 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Подтверждено"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Нажмите \"Подтвердить\""</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Сканирование выполнено. Нажмите на значок разблокировки."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Разблокировано сканированием лица. Нажмите, чтобы продолжить."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Лицо распознано. Нажмите, чтобы продолжить."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицо распознано. Нажмите на значок разблокировки."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аутентификация выполнена"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-код"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Использовать графический ключ"</string> @@ -317,6 +320,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Проведите вверх, чтобы открыть"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Нажмите на значок разблокировки."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Сканирование выполнено. Нажмите на значок разблокировки."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Разблокировано сканированием лица. Нажмите, чтобы открыть."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Лицо распознано. Нажмите, чтобы открыть."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Лицо распознано. Нажмите на значок разблокировки."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Переместите палец влево"</item>      <item msgid="5558598599408514296">"Переместите палец вниз"</item> @@ -837,7 +843,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Для воспроизведения на этом устройстве подойдите ближе к другому (<xliff:g id="DEVICENAME">%1$s</xliff:g>)."</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Воспроизводится на устройстве \"<xliff:g id="DEVICENAME">%1$s</xliff:g>\"."</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Произошла ошибка. Повторите попытку."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запущено"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Нет ответа. Проверьте приложение."</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Не найдено."</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Управление недоступно"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index ed7c752a9810..be3a8ac039a3 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"තහවුරු කළා"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"සම්පූර්ණ කිරීමට තහවුරු කරන්න තට්ටු කර."</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"මුහුණ මගින් අගුලු හරින ලදි. දිගටම කරගෙන යාමට අගුලු හැරීමේ නිරූපකය ඔබන්න."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"මුහුණ මගින් අගුලු හරින ලදි. ඉදිරියට යාමට ඔබන්න."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"මුහුණ හඳුනා ගන්නා ලදි. ඉදිරියට යාමට ඔබන්න."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"මුහුණ හඳුනා ගන්නා ලදි. ඉදිරියට යාමට අගුලු හැරීමේ නිරූපකය ඔබන්න."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"සත්යාපනය විය"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN භාවිත කරන්න"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"රටාව භාවිත කරන්න"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"විවෘත කිරීමට ස්වයිප් කරන්න"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"විවෘත කිරීමට අගුලු හැරීමේ නිරූපකය ඔබන්න"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"මුහුණ මගින් අගුලු හරින ලදි. විවෘත කිරීමට අගුලු හැරීමේ නිරූපකය ඔබන්න."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"මුහුණ මගින් අගුලු හරින ලදි. විවෘත කිරීමට ඔබන්න."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"මුහුණ හඳුනා ගන්නා ලදි. විවෘත කිරීමට ඔබන්න."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"මුහුණ හඳුනා ගන්නා ලදි. විවෘත කිරීමට අගුලු හැරීමේ නිරූපකය ඔබන්න."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"වමට ගෙන යන්න"</item>      <item msgid="5558598599408514296">"පහළට ගෙන යන්න"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"මෙහි ක්රීඩා කිරීමට <xliff:g id="DEVICENAME">%1$s</xliff:g> වෙත වඩා සමීප වන්න"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> හි වාදනය කරමින්"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"යම් දෙයක් වැරදිණි. නැවත උත්සාහ කරන්න."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ධාවනය වේ"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"අක්රියයි, යෙදුම පරීක්ෂා කරන්න"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"හමු නොවිණි"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"පාලනය ලබා ගත නොහැකිය"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index a8e1f9fa0d64..8451b36dc946 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Potvrdené"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Overenie dokončíte klepnutím na Potvrdiť"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Odomknuté tvárou. Pokračujte klepnutím na ikonu odomknutia"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Odomknuté tvárou. Pokračujte stlačením."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Tvár bola rozpoznaná. Pokračujte stlačením."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Tvár bola rozpoznaná. Pokračujte stlačením ikony odomknutia"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Overené"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Použiť PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Použiť vzor"</string> @@ -317,6 +320,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Otvorte potiahnutím prstom nahor"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Otvorte klepnutím na ikonu odomknutia"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Odomknuté tvárou. Otvorte klepnutím na ikonu odomknutia."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Odomknuté tvárou. Otvorte stlačením."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Tvár bola rozpoznaná. Otvorte stlačením."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Tvár bola rozpoznaná. Otvorte stlačením ikony odomknutia."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Posunúť doľava"</item>      <item msgid="5558598599408514296">"Posunúť nadol"</item> @@ -837,7 +843,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Ak chcete prehrávať v zariadení <xliff:g id="DEVICENAME">%1$s</xliff:g>, priblížte sa k nemu"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Prehráva sa v zariadení <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Niečo sa pokazilo. Skúste to znova."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> je spustená"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Neaktívne, preverte aplikáciu"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nenájdené"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Ovládač nie je k dispozícii"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 06751596c3c9..dbb09427151a 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Potrjeno"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Za dokončanje se dotaknite »Potrdite«"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Odklenjeno z obrazom. Za nadaljevanje pritisnite ikono za odklepanje."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Odklenjeno z obrazom. Pritisnite za nadaljevanje."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Obraz je prepoznan. Pritisnite za nadaljevanje."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Obraz je prepoznan. Za nadaljevanje pritisnite ikono za odklepanje."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Preverjena pristnost"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Uporabi kodo PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Uporabi vzorec"</string> @@ -317,6 +320,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Povlecite navzgor, da odprete"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Za odpiranje pritisnite ikono za odklepanje."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Odklenjeno z obrazom. Za odpiranje pritisnite ikono za odklepanje."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Odklenjeno z obrazom. Pritisnite za odpiranje."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Obraz je prepoznan. Pritisnite za odpiranje."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Obraz je prepoznan. Za odpiranje pritisnite ikono za odklepanje."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Premik levo"</item>      <item msgid="5558598599408514296">"Premik navzdol"</item> @@ -837,7 +843,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Približajte napravi <xliff:g id="DEVICENAME">%1$s</xliff:g> za predvajanje v tej napravi"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Predvajanje v napravi <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Prišlo je do napake. Poskusite znova."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> se izvaja"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, poglejte aplikacijo"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Ni mogoče najti"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrolnik ni na voljo"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index e84be5a93c7d..c3c638aeb35f 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Konfirmuar"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Trokit \"Konfirmo\" për ta përfunduar"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"U shkyç me fytyrë. Shtyp ikonën e shkyçjes për të vazhduar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"U shkyç me fytyrë. Shtyp për të vazhduar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Fytyra u njoh. Shtyp për të vazhduar."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Fytyra u njoh. Shtyp ikonën e shkyçjes për të vazhduar."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"U vërtetua"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Përdor kodin PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Përdor motivin"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Rrëshqit lart për ta hapur"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Shtyp ikonën e shkyçjes për ta hapur"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"U shkyç me fytyrë. Shtyp ikonën e shkyçjes për ta hapur."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"U shkyç me fytyrë. Shtyp për ta hapur."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Fytyra u njoh. Shtyp për ta hapur."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Fytyra u njoh. Shtyp ikonën e shkyçjes për ta hapur."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Lëvize majtas"</item>      <item msgid="5558598599408514296">"Lëvize poshtë"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Afrohu te <xliff:g id="DEVICENAME">%1$s</xliff:g> për ta luajtur këtu"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Po luhet në <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Ndodhi një gabim. Provo përsëri."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> po ekzekutohet"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Joaktive, kontrollo aplikacionin"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Nuk u gjet"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrolli është i padisponueshëm"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index ac5ab327ebe6..a06931cb95e1 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Потврђено"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Додирните Потврди да бисте завршили"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Откључано је лицем. Притисните икону откључавања за наставак"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Откључано је лицем. Притисните да бисте наставили."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Лице је препознато. Притисните да бисте наставили."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лице препознато. Притисните икону откључавања за наставак."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Идентитет је потврђен"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Користите PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Користите шаблон"</string> @@ -315,6 +318,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Превуците нагоре да бисте отворили"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Притисните икону откључавања да бисте отворили."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Откључано је лицем. Притисните икону откључавања да бисте отворили."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Откључано је лицем. Притисните да бисте отворили."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Лице је препознато. Притисните да бисте отворили."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Лице препознато. Притисните икону откључавања да бисте отворили."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Померите налево"</item>      <item msgid="5558598599408514296">"Померите надоле"</item> @@ -831,7 +837,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Приближите се уређају <xliff:g id="DEVICENAME">%1$s</xliff:g> да бисте на њему пуштали"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Пушта се на уређају <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Дошло је до грешке. Пробајте поново."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> је покренута"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Неактивно. Видите апликацију"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Није пронађено"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Контрола није доступна"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 3b0819560cfe..3c6d61d3e378 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Bekräftat"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Slutför genom att trycka på Bekräfta"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Upplåst med ansiktslås. Tryck på ikonen lås upp för att fortsätta."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Upplåst med ansiktslås. Tryck för att fortsätta."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ansiktet har identifierats. Tryck för att fortsätta."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansiktet har identifierats. Tryck på ikonen lås upp."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentiserad"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Använd pinkod"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Använd mönster"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Öppna genom att svepa uppåt"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Tryck på ikonen lås upp för att öppna"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Upplåst med ansiktslås. Tryck på ikonen lås upp för att öppna."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Upplåst med ansiktslås. Tryck för att öppna."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Ansiktet har identifierats. Tryck för att öppna."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Ansiktet har identifierats. Tryck på ikonen lås upp."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Flytta åt vänster"</item>      <item msgid="5558598599408514296">"Flytta nedåt"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Flytta dig närmare <xliff:g id="DEVICENAME">%1$s</xliff:g> om du vill spela här"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Spelas upp på <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Något gick fel. Försök igen."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> körs"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv, kolla appen"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Hittades inte"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Styrning är inte tillgänglig"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index ab27d8608fa1..385f535d5397 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Imethibitishwa"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Gusa Thibitisha ili ukamilishe"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Imefunguliwa kwa kutumia uso wako. Bonyeza aikoni ya kufungua ili uendelee."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Imefunguliwa kwa kutumia uso wako. Bonyeza ili uendelee."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Uso umetambuliwa. Bonyeza ili uendelee."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Uso umetambuliwa. Bonyeza aikoni ya kufungua ili uendelee."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Umethibitishwa"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Tumia PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Tumia mchoro"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Telezesha kidole juu ili ufungue"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Bonyeza aikoni ya kufungua ili ufungue"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Imefunguliwa kwa kutumia uso wako. Bonyeza aikoni ya kufungua ili ufungue."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Imefunguliwa kwa kutumia uso wako. Bonyeza ili ufungue."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Uso umetambuliwa. Bonyeza ili ufungue."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Uso umetambuliwa. Bonyeza aikoni ya kufungua ili ufungue."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Sogeza kushoto"</item>      <item msgid="5558598599408514296">"Sogeza chini"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Sogeza karibu na <xliff:g id="DEVICENAME">%1$s</xliff:g> ili kucheza hapa"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Inacheza kwenye <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Hitilafu fulani imetokea. Jaribu tena."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> inatumika"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Haitumiki, angalia programu"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Hakipatikani"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kidhibiti hakipatikani"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 0048235d8420..08264f0686da 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"உறுதிப்படுத்தப்பட்டது"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"முடிக்க \'உறுதிப்படுத்துக\' என்பதை தட்டவும்"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"முகம் மூலம் அன்லாக் செய்யப்பட்டது. தொடர, அன்லாக் ஐகானை அழுத்துக."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"முகம் மூலம் அன்லாக் செய்யப்பட்டது. தொடர அழுத்தவும்."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"முகம் அங்கீகரிக்கப்பட்டது. தொடர அழுத்தவும்."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"முகம் அங்கீகரிக்கப்பட்டது. தொடர அன்லாக் ஐகானை அழுத்தவும்."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"அங்கீகரிக்கப்பட்டது"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"பின்னைப் பயன்படுத்து"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"பேட்டர்னைப் பயன்படுத்து"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"திறப்பதற்கு மேல் நோக்கி ஸ்வைப் செய்யவும்"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"திறக்க, அன்லாக் ஐகானை அழுத்தவும்"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"முகம் மூலம் அன்லாக் செய்யப்பட்டது. திறக்க, அன்லாக் ஐகானை அழுத்துக."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"முகம் மூலம் அன்லாக் செய்யப்பட்டது. திறக்க அழுத்தவும்."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"முகம் அங்கீகரிக்கப்பட்டது. திறக்க அழுத்தவும்."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"முகம் அங்கீகரிக்கப்பட்டது. திறக்க அன்லாக் ஐகானை அழுத்தவும்."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"இடதுபுறம் நகர்த்துங்கள்"</item>      <item msgid="5558598599408514296">"கீழே நகர்த்துங்கள்"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"இங்கு பிளே செய்ய உங்கள் சாதனத்தை <xliff:g id="DEVICENAME">%1$s</xliff:g> சாதனத்திற்கு அருகில் நகர்த்துங்கள்"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> சாதனத்தில் பிளே ஆகிறது"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"ஏதோ தவறாகிவிட்டது. மீண்டும் முயலவும்."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> இயங்கிக் கொண்டிருக்கிறது"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"செயலில் இல்லை , சரிபார்க்கவும்"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"இல்லை"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"கட்டுப்பாடு இல்லை"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index d2af3d618ad9..a41a657a8282 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"నిర్ధారించబడింది"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"పూర్తి చేయడానికి \"నిర్ధారించు\" నొక్కండి"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"ముఖం ద్వారా అన్లాక్ చేయబడింది. కొనసాగించడానికి అన్లాక్ చిహ్నాన్ని నొక్కండి."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"ముఖం ద్వారా అన్లాక్ చేయబడింది. కొనసాగించడానికి నొక్కండి."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ముఖం గుర్తించబడింది. కొనసాగించడానికి నొక్కండి."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ముఖం గుర్తించబడింది. కొనసాగడానికి అన్లాక్ చిహ్నం నొక్కండి."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ప్రామాణీకరించబడింది"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"పిన్ను ఉపయోగించు"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ఆకృతిని ఉపయోగించు"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"తెరవడానికి, పైకి స్వైప్ చేయండి"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"తెరవడానికి అన్లాక్ చిహ్నాన్ని నొక్కండి"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"ముఖం ద్వారా అన్లాక్ చేయబడింది. తెరవడానికి అన్లాక్ చిహ్నాన్ని నొక్కండి."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"ముఖం ద్వారా అన్లాక్ చేయబడింది. తెరవడానికి నొక్కండి."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"ముఖం గుర్తించబడింది. తెరవడానికి నొక్కండి."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"ముఖం గుర్తించబడింది. తెరవడానికి అన్లాక్ చిహ్నం నొక్కండి."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"ఎడమవైపుగా జరపండి"</item>      <item msgid="5558598599408514296">"కిందికి జరపండి"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ఇక్కడ ప్లే చేయడానికి <xliff:g id="DEVICENAME">%1$s</xliff:g>కి దగ్గరగా వెళ్లండి"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>లో ప్లే అవుతోంది"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"ఏదో తప్పు జరిగింది. మళ్లీ ట్రై చేయండి."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> రన్ అవుతోంది"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"ఇన్యాక్టివ్, యాప్ చెక్ చేయండి"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"కనుగొనబడలేదు"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"కంట్రోల్ అందుబాటులో లేదు"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 08afe13aee57..950fc94dbba8 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"ยืนยันแล้ว"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"แตะยืนยันเพื่อดำเนินการให้เสร็จสมบูรณ์"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"ปลดล็อกด้วยใบหน้าแล้ว กดไอคอนปลดล็อกเพื่อดำเนินการต่อ"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"ปลดล็อกด้วยใบหน้าแล้ว กดเพื่อดำเนินการต่อ"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"จดจำใบหน้าได้ กดเพื่อดำเนินการต่อ"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"จดจำใบหน้าได้ กดไอคอนปลดล็อกเพื่อดำเนินการต่อ"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ตรวจสอบสิทธิ์แล้ว"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ใช้ PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ใช้รูปแบบ"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"เลื่อนขึ้นเพื่อเปิด"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"กดไอคอนปลดล็อกเพื่อเปิด"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"ปลดล็อกด้วยใบหน้าแล้ว กดไอคอนปลดล็อกเพื่อเปิด"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"ปลดล็อกด้วยใบหน้าแล้ว กดเพื่อเปิด"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"จดจำใบหน้าได้ กดเพื่อเปิด"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"จดจำใบหน้าได้ กดไอคอนปลดล็อกเพื่อเปิด"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"เลื่อนนิ้วไปทางซ้าย"</item>      <item msgid="5558598599408514296">"เลื่อนนิ้วลง"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ขยับไปใกล้ <xliff:g id="DEVICENAME">%1$s</xliff:g> มากขึ้นเพื่อเล่นที่นี่"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"กำลังเล่นใน <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"เกิดข้อผิดพลาด โปรดลองอีกครั้ง"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังทำงาน"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"ไม่มีการใช้งาน โปรดตรวจสอบแอป"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"ไม่พบ"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"ใช้การควบคุมไม่ได้"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 1c88061a2135..5e2fb53c5e09 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Nakumpirma"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"I-tap ang Kumpirmahin para kumpletuhin"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Na-unlock gamit ang mukha. Pindutin ang icon ng unlock para magpatuloy."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Na-unlock gamit ang mukha. Pindutin para magpatuloy."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Nakilala ang mukha. Pindutin para magpatuloy."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Nakilala ang mukha. Pindutin ang unlock para magpatuloy."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Na-authenticate"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gumamit ng PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gumamit ng pattern"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Mag-swipe pataas para buksan"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Pindutin ang icon ng unlock para buksan"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Na-unlock gamit ang mukha. Pindutin ang icon ng unlock para buksan."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Na-unlock gamit ang mukha. Pindutin para buksan."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Nakilala ang mukha. Pindutin para buksan."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Nakilala ang mukha. Pindutin ang icon ng unlock para buksan."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Ilipat pakaliwa"</item>      <item msgid="5558598599408514296">"Ibaba"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Lumapit sa <xliff:g id="DEVICENAME">%1$s</xliff:g> para mag-play rito"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Nagpe-play sa <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Nagkaproblema. Subukan ulit."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"Tumatakbo ang <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Hindi aktibo, tingnan ang app"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Hindi nahanap"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Hindi available ang kontrol"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index a0c4e378e494..313f36555c4c 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Onaylandı"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tamamlamak için Onayla\'ya dokunun"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Kilit, yüzünüzle açıldı. Kilit açma simgesine basın."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Cihazın kilidini yüzünüzle açtınız. Devam etmek için basın."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Yüzünüz tanındı. Devam etmek için basın."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Yüzünüz tanındı. Kilit açma simgesine basın."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Kimliği Doğrulandı"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN kullan"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Deseni kullan"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Açmak için yukarı kaydırın"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Açmak için Kilit açma simgesine basın"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Kilit, yüzünüzle açıldı. Kilit açma simgesine basın."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Cihazın kilidini yüzünüzle açtınız. Açmak için basın."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Yüzünüz tanındı. Açmak için basın."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Yüzünüz tanındı. Kilit açma simgesine basın."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Sola taşı"</item>      <item msgid="5558598599408514296">"Aşağı taşı"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Burada oynatmak için <xliff:g id="DEVICENAME">%1$s</xliff:g> cihazına yaklaşın"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> cihazında oynatılıyor"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Bir sorun oldu. Tekrar deneyin."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> çalışıyor"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Devre dışı, uygulamaya bakın"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Bulunamadı"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrol kullanılamıyor"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 7644e622a2df..51c61ce3dcf6 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Підтверджено"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Щоб завершити, натисніть \"Підтвердити\""</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Розблоковано (фейсконтроль). Натисніть значок розблокування."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Розблоковано (фейсконтроль). Натисніть, щоб продовжити."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Обличчя розпізнано. Натисніть, щоб продовжити."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Обличчя розпізнано. Натисніть значок розблокування."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Автентифіковано"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Ввести PIN-код"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Намалювати ключ"</string> @@ -317,6 +320,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Проведіть пальцем угору, щоб відкрити"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Щоб відкрити, натисніть значок розблокування."</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Розблоковано (фейсконтроль). Натисніть значок розблокування."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Розблоковано (фейсконтроль). Натисніть, щоб відкрити."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Обличчя розпізнано. Натисніть, щоб відкрити."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Обличчя розпізнано. Натисніть значок розблокування."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Перемістіть палець ліворуч"</item>      <item msgid="5558598599408514296">"Перемістіть палець униз"</item> @@ -837,7 +843,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Наблизьтеся до пристрою <xliff:g id="DEVICENAME">%1$s</xliff:g>, щоб відтворити медіафайли на ньому"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Відтворюється на пристрої <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Сталася помилка. Повторіть спробу."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> працює"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Неактивно, перейдіть у додаток"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Не знайдено"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Елемент керування недоступний"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index f345c526a020..d2abb7a64454 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"تصدیق شدہ"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"مکمل کرنے کیلئے \'تصدیق کریں\' تھپتھپائیں"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"چہرے سے انلاک کیا گیا۔ جاری رکھنے کیلئے انلاک آئیکن دبائیں۔"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"چہرے سے انلاک کیا گیا۔ جاری رکھنے کے لیے دبائیں۔"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"چہرے کی شناخت ہو گئی۔ جاری رکھنے کے لیے دبائیں۔"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"چہرے کی شناخت ہو گئی۔ جاری رکھنے کیلئے انلاک آئیکن دبائیں۔"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"تصدیق کردہ"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN استعمال کریں"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"پیٹرن کا استعمال کریں"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"کھولنے کے لیے اوپر سوائپ کريں"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"کھولنے کیلئے انلاک آئیکن دبائیں"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"چہرے سے انلاک کیا گیا۔ کھولنے کیلئے انلاک آئیکن دبائیں۔"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"چہرے سے انلاک کیا گیا۔ کھولنے کے لیے دبائیں۔"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"چہرے کی شناخت ہو گئی۔ کھولنے کے لیے دبائیں۔"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"چہرے کی شناخت ہو گئی۔ کھولنے کیلئے انلاک آئیکن دبائیں۔"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"دائیں منتقل کریں"</item>      <item msgid="5558598599408514296">"نیچے منتقل کریں"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"یہاں چلانے کے ليے <xliff:g id="DEVICENAME">%1$s</xliff:g> کے قریب جائیں"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> پر چل رہا ہے"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"کچھ غلط ہوگیا۔ پھر کوشش کریں۔"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> چل رہی ہے"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"غیر فعال، ایپ چیک کریں"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"نہیں ملا"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"کنٹرول دستیاب نہیں ہے"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index d5e55106e149..293677ae7daa 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Tasdiqlangan"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Tasdiqlash uchun tegining"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Yuz orqali ochilgan. Davom etish uchun ochish belgisini bosing."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Yuz orqali ochildi. Davom etish uchun bosing."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Yuz aniqlandi. Davom etish uchun bosing."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Yuz aniqlandi. Davom etish uchun ochish belgisini bosing."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Tasdiqlandi"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN kod kiritish"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Grafik kalitdan foydalanish"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Ochish uchun tepaga suring"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Ochish uchun ochish belgisini bosing"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Yuz orqali ochilgan. Ochish uchun ochish belgisini bosing."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Yuz orqali ochildi. Ochish uchun bosing."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Yuz aniqlandi. Ochish uchun bosing."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Yuz aniqlandi. Ochish uchun ochish belgisini bosing."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Chapga siljitish"</item>      <item msgid="5558598599408514296">"Pastga siljitish"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Bu yerda ijro qilish uchun <xliff:g id="DEVICENAME">%1$s</xliff:g>qurilmasiga yaqinlashtiring"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> qurilmasida ijro qilinmoqda"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Xatolik yuz berdi. Qayta urining."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ishlamoqda"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Nofaol. Ilovani tekshiring"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Topilmadi"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Boshqarish imkonsiz"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index f92a78ad7234..af4bf0fafc5c 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Ðã xác nhận"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Nhấn vào Xác nhận để hoàn tất"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Đã mở khoá bằng khuôn mặt. Nhấn vào biểu tượng mở khoá để tiếp tục."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Đã mở khoá bằng khuôn mặt. Hãy nhấn để tiếp tục."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Đã nhận diện khuôn mặt. Hãy nhấn để tiếp tục."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Đã nhận diện khuôn mặt. Nhấn biểu tượng mở khoá để tiếp tục."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Đã xác thực"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Dùng mã PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Dùng hình mở khóa"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Vuốt lên để mở"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Nhấn biểu tượng mở khoá để mở"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Đã mở khoá bằng khuôn mặt. Nhấn vào biểu tượng mở khoá để mở."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Đã mở khoá bằng khuôn mặt. Nhấn để mở."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Đã nhận diện khuôn mặt. Nhấn để mở."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Đã nhận diện khuôn mặt. Nhấn biểu tượng mở khoá để mở."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Di chuyển sang trái"</item>      <item msgid="5558598599408514296">"Di chuyển xuống"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Di chuyển đến gần <xliff:g id="DEVICENAME">%1$s</xliff:g> hơn để phát tại đây"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Đang phát trên <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Đã xảy ra lỗi. Hãy thử lại."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang chạy"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Không hoạt động, hãy kiểm tra ứng dụng"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Không tìm thấy"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Không có chức năng điều khiển"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 1d124fb487ef..c624654f5a67 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"已确认"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"点按“确认”即可完成"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"已通过面孔识别解锁。按下解锁图标即可继续。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"已通过面孔识别解锁。点按即可继续。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"识别出面孔。点按即可继续。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"识别出面孔。按下解锁图标即可继续。"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"已经过身份验证"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN 码"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用图案"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"向上滑动即可打开"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"按下解锁图标即可打开"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"已通过面孔识别解锁。按下解锁图标即可打开。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"已通过面孔识别解锁。点按即可打开。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"识别出面孔。点按即可打开。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"识别出面孔。按下解锁图标即可打开。"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"左移"</item>      <item msgid="5558598599408514296">"下移"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"若要在此设备上播放,请靠近“<xliff:g id="DEVICENAME">%1$s</xliff:g>”"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"正在“<xliff:g id="DEVICENAME">%1$s</xliff:g>”上播放"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"出了点问题,请重试。"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正在运行"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"无效,请检查应用"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"未找到"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"控件不可用"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 564dced77e76..5a8c6728727f 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"已確認"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"輕按 [確定] 以完成"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"已使用面孔解鎖。按解鎖圖示即可繼續。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"已使用面孔解鎖。按下即可繼續操作。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"已識別面孔。按下即可繼續操作。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"已識別面孔。按解鎖圖示即可繼續。"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"驗證咗"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用圖案"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"向上滑動即可開啟"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"按解鎖圖示即可開啟"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"已使用面孔解鎖。按解鎖圖示即可開啟。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"已使用面孔解鎖。按下即可開啟。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"已識別面孔。按下即可開啟。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"已識別面孔。按解鎖圖示即可開啟。"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"向左移"</item>      <item msgid="5558598599408514296">"向下移"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"如要在此裝置上播放,請靠近「<xliff:g id="DEVICENAME">%1$s</xliff:g>」"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"正在「<xliff:g id="DEVICENAME">%1$s</xliff:g>」上播放"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"發生錯誤,請再試一次。"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」執行中"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"已停用,請檢查應用程式"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"找不到"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"無法使用控制功能"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 019cafceeab0..d00afda86a33 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"確認完畢"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"輕觸 [確認] 完成驗證設定"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"裝置已透過人臉解鎖,按下「解鎖」圖示即可繼續操作。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"裝置已透過你的臉解鎖,按下即可繼續操作。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"臉孔辨識完成,按下即可繼續操作。"</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"臉孔辨識完成,按下「解鎖」圖示即可繼續操作。"</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"已通過驗證"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN 碼"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用解鎖圖案"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"向上滑動即可開啟"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"按下「解鎖」圖示即可開啟"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"裝置已透過人臉解鎖,按下「解鎖」圖示即可開啟。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"裝置已透過你的臉解鎖,按下即可開啟。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"臉孔辨識完成,按下即可開啟。"</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"臉孔辨識完成,按下「解鎖」圖示即可開啟。"</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"向左移"</item>      <item msgid="5558598599408514296">"向下移"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"如要在這部裝置上播放,請移到更靠近「<xliff:g id="DEVICENAME">%1$s</xliff:g>」的位置"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"正在「<xliff:g id="DEVICENAME">%1$s</xliff:g>」上播放"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"發生錯誤,請再試一次。"</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」執行中"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"無效,請查看應用程式"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"找不到控制項"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"無法使用控制項"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 1f78b3216fd2..6545d729cc01 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -137,6 +137,9 @@      <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Kuqinisekisiwe"</string>      <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Thepha okuthi Qinisekisa ukuze uqedele"</string>      <string name="biometric_dialog_tap_confirm_with_face" msgid="1092050545851021991">"Ivulwe ngobuso. Cindezela isithonjana sokuvula ukuze uqhubeke."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Vula ngobuso. Cindezela ukuze uqhubeke."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ubuso buyaziwa. Cindezela ukuze uqhubeke."</string> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ubuso buyaziwa. Cindezela isithonjana sokuvula ukuze uqhubeke."</string>      <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Kugunyaziwe"</string>      <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Sebenzisa iphinikhodi"</string>      <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Sebenzisa iphethini"</string> @@ -313,6 +316,9 @@      <string name="keyguard_unlock" msgid="8031975796351361601">"Swayiphela phezulu ukuze uvule"</string>      <string name="keyguard_unlock_press" msgid="9140109453735019209">"Cindezela isithonjana sokuvula ukuze uvule"</string>      <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Ivulwe ngobuso. Cindezela isithonjana sokuvula ukuze uvule."</string> +    <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Vula ngobuso. Cindezela ukuze uvule."</string> +    <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Ubuso buyaziwa. Cindezela ukuze uvule."</string> +    <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Ubuso buyaziwa. Cindezela isithonjana sokuvula ukuze uvule."</string>    <string-array name="udfps_accessibility_touch_hints">      <item msgid="1901953991150295169">"Yisa kwesokunxele"</item>      <item msgid="5558598599408514296">"Yehlisa"</item> @@ -825,7 +831,6 @@      <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Sondela eduze ne-<xliff:g id="DEVICENAME">%1$s</xliff:g> ukuze udlale lapha"</string>      <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Idlala ku-<xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>      <string name="media_transfer_failed" msgid="7955354964610603723">"Kukhona okungahambanga kahle. Zama futhi."</string> -    <string name="controls_media_empty_title" msgid="8296102892421573325">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> iyasebenza"</string>      <string name="controls_error_timeout" msgid="794197289772728958">"Akusebenzi, hlola uhlelo lokusebenza"</string>      <string name="controls_error_removed" msgid="6675638069846014366">"Ayitholakali"</string>      <string name="controls_error_removed_title" msgid="1207794911208047818">"Ukulawula akutholakali"</string> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 7ed915600230..597e88093de8 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -580,6 +580,9 @@          280      </integer> +    <!-- The time (in ms) needed to trigger the lock icon view's long-press affordance --> +    <integer name="config_lockIconLongPress" translatable="false">200</integer> +      <!-- package name of a built-in camera app to use to restrict implicit intent resolution           when the double-press power gesture is used. Ignored if empty. -->      <string translatable="false" name="config_cameraGesturePackage"></string> @@ -611,6 +614,13 @@           2 - Override the setting to never bypass keyguard -->      <integer name="config_face_unlock_bypass_override">0</integer> +    <!-- Which face help messages to surface when fingerprint is also enrolled. +         Message ids correspond with the acquired ids in BiometricFaceConstants --> +    <integer-array name="config_face_help_msgs_when_fingerprint_enrolled"> +        <item>25</item> +        <item>26</item> +    </integer-array> +      <!-- Whether the communal service should be enabled -->      <bool name="config_communalServiceEnabled">false</bool> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 66488415ff9f..160dcd0fbccc 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -857,7 +857,7 @@      <!-- The maximum offset for the under-display fingerprint sensor (UDFPS) icon in either           direction that elements are moved to prevent burn-in on AOD-->      <dimen name="udfps_burn_in_offset_x">7px</dimen> -    <dimen name="udfps_burn_in_offset_y">28px</dimen> +    <dimen name="udfps_burn_in_offset_y">20px</dimen>      <!-- The absolute side margins of quick settings -->      <dimen name="quick_settings_bottom_margin_media">8dp</dimen> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 5eacc3e6006b..dca5ea836fa4 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -176,5 +176,8 @@      <item type="id" name="rounded_corner_top_right"/>      <item type="id" name="rounded_corner_bottom_left"/>      <item type="id" name="rounded_corner_bottom_right"/> + +    <!-- face scanning view id --> +    <item type="id" name="face_scanning_anim"/>  </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index b0fcfcdc2f6b..10c0f83a2639 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -341,6 +341,12 @@      <string name="biometric_dialog_tap_confirm">Tap Confirm to complete</string>      <!-- Message shown when a biometric has authenticated with a user's face and is waiting for the user to confirm authentication [CHAR LIMIT=60]-->      <string name="biometric_dialog_tap_confirm_with_face">Unlocked by face. Press the unlock icon to continue.</string> +    <!-- Message shown when a biometric has authenticated with a user's face and is waiting for the user to confirm authentication [CHAR LIMIT=60]--> +    <string name="biometric_dialog_tap_confirm_with_face_alt_1">Unlocked by face. Press to continue.</string> +    <!-- Message shown when a biometric has authenticated with a user's face and is waiting for the user to confirm authentication [CHAR LIMIT=60]--> +    <string name="biometric_dialog_tap_confirm_with_face_alt_2">Face recognized. Press to continue.</string> +    <!-- Message shown when a biometric has authenticated with a user's face and is waiting for the user to confirm authentication [CHAR LIMIT=60]--> +    <string name="biometric_dialog_tap_confirm_with_face_alt_3">Face recognized. Press the unlock icon to continue.</string>      <!-- Talkback string when a biometric is authenticated [CHAR LIMIT=NONE] -->      <string name="biometric_dialog_authenticated">Authenticated</string> @@ -803,6 +809,13 @@      <!-- Message shown when non-bypass face authentication succeeds and UDFPS is supported. Provides extra instructions for how the user can enter their device [CHAR LIMIT=60] -->      <string name="keyguard_face_successful_unlock_press">Unlocked by face. Press the unlock icon to open.</string> +    <!-- Message shown when non-bypass face authentication succeeds and UDFPS is supported. Provides extra instructions for how the user can enter their device [CHAR LIMIT=60] --> +    <string name="keyguard_face_successful_unlock_press_alt_1">Unlocked by face. Press to open.</string> +    <!-- Message shown when non-bypass face authentication succeeds and UDFPS is supported. Provides extra instructions for how the user can enter their device [CHAR LIMIT=60] --> +    <string name="keyguard_face_successful_unlock_press_alt_2">Face recognized. Press to open.</string> +    <!-- Message shown when non-bypass face authentication succeeds and UDFPS is supported. Provides extra instructions for how the user can enter their device [CHAR LIMIT=60] --> +    <string name="keyguard_face_successful_unlock_press_alt_3">Face recognized. Press the unlock icon to open.</string> +      <!-- Messages shown when users press outside of udfps region during -->      <string-array name="udfps_accessibility_touch_hints"> diff --git a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java index 00f1c0108d0b..23195af8bdea 100644 --- a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java +++ b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java @@ -33,7 +33,6 @@ import android.view.SurfaceView;  import android.view.ViewGroup;  import com.android.internal.annotations.VisibleForTesting; -import com.android.keyguard.KeyguardSecurityModel.SecurityMode;  import com.android.keyguard.dagger.KeyguardBouncerScope;  import com.android.systemui.dagger.qualifiers.Main; @@ -209,7 +208,7 @@ public class AdminSecondaryLockScreenController {              hide();              if (mKeyguardCallback != null) {                  mKeyguardCallback.dismiss(/* securityVerified= */ true, userId, -                        /* bypassSecondaryLockScreen= */true, SecurityMode.Invalid); +                        /* bypassSecondaryLockScreen= */true);              }          }      } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java index b8fcb103402d..eb418ff3b142 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputViewController.java @@ -179,7 +179,7 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey              if (dismissKeyguard) {                  mDismissing = true;                  mLatencyTracker.onActionStart(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK); -                getKeyguardSecurityCallback().dismiss(true, userId, getSecurityMode()); +                getKeyguardSecurityCallback().dismiss(true, userId);              }          } else {              if (isValidPassword) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java index befd59be061d..12fa401d7fea 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java @@ -90,7 +90,7 @@ public class KeyguardHostViewController extends ViewController<KeyguardHostView>                                  Log.i(TAG, "TrustAgent dismissed Keyguard.");                              }                              mSecurityCallback.dismiss(false /* authenticated */, userId, -                                    /* bypassSecondaryLockScreen */ false, SecurityMode.Invalid); +                                    /* bypassSecondaryLockScreen */ false);                          } else {                              mViewMediatorCallback.playTrustedSound();                          } @@ -102,9 +102,9 @@ public class KeyguardHostViewController extends ViewController<KeyguardHostView>          @Override          public boolean dismiss(boolean authenticated, int targetUserId, -                boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { +                boolean bypassSecondaryLockScreen) {              return mKeyguardSecurityContainerController.showNextSecurityScreenOrFinish( -                    authenticated, targetUserId, bypassSecondaryLockScreen, expectedSecurityMode); +                    authenticated, targetUserId, bypassSecondaryLockScreen);          }          @Override @@ -212,8 +212,7 @@ public class KeyguardHostViewController extends ViewController<KeyguardHostView>       * @return True if the keyguard is done.       */      public boolean dismiss(int targetUserId) { -        return mSecurityCallback.dismiss(false, targetUserId, false, -                getCurrentSecurityMode()); +        return mSecurityCallback.dismiss(false, targetUserId, false);      }      /** @@ -356,10 +355,10 @@ public class KeyguardHostViewController extends ViewController<KeyguardHostView>      }      public boolean handleBackKey() { -        SecurityMode securityMode = mKeyguardSecurityContainerController.getCurrentSecurityMode(); -        if (securityMode != SecurityMode.None) { +        if (mKeyguardSecurityContainerController.getCurrentSecurityMode() +                != SecurityMode.None) {              mKeyguardSecurityContainerController.dismiss( -                    false, KeyguardUpdateMonitor.getCurrentUser(), securityMode); +                    false, KeyguardUpdateMonitor.getCurrentUser());              return true;          }          return false; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java index 87300c3f0504..98ac640bf703 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java @@ -59,11 +59,10 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>              return false;          }          @Override -        public void dismiss(boolean securityVerified, int targetUserId, -                SecurityMode expectedSecurityMode) { } +        public void dismiss(boolean securityVerified, int targetUserId) { }          @Override          public void dismiss(boolean authenticated, int targetId, -                boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { } +                boolean bypassSecondaryLockScreen) { }          @Override          public void onUserInput() { }          @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java index 1a59b820c1bd..39c394981193 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java @@ -171,7 +171,7 @@ public class KeyguardPatternViewController                  if (dismissKeyguard) {                      mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct);                      mLatencyTracker.onActionStart(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK); -                    getKeyguardSecurityCallback().dismiss(true, userId, SecurityMode.Pattern); +                    getKeyguardSecurityCallback().dismiss(true, userId);                  }              } else {                  mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java index bc72f7979a74..e38472745234 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityCallback.java @@ -15,17 +15,14 @@   */  package com.android.keyguard; -import com.android.keyguard.KeyguardSecurityModel.SecurityMode; -  public interface KeyguardSecurityCallback {      /**       * Dismiss the given security screen.       * @param securityVerified true if the user correctly entered credentials for the given screen.       * @param targetUserId a user that needs to be the foreground user at the dismissal completion. -     * @param expectedSecurityMode The security mode that is invoking this dismiss.       */ -    void dismiss(boolean securityVerified, int targetUserId, SecurityMode expectedSecurityMode); +    void dismiss(boolean securityVerified, int targetUserId);      /**       * Dismiss the given security screen. @@ -33,10 +30,8 @@ public interface KeyguardSecurityCallback {       * @param targetUserId a user that needs to be the foreground user at the dismissal completion.       * @param bypassSecondaryLockScreen true if the user can bypass the secondary lock screen,       *                                  if any, during this dismissal. -     * @param expectedSecurityMode The security mode that is invoking this dismiss.       */ -    void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen, -            SecurityMode expectedSecurityMode); +    void dismiss(boolean securityVerified, int targetUserId, boolean bypassSecondaryLockScreen);      /**       * Manually report user activity to keep the device awake. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 12bb47b81d7f..cce516d981a5 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -233,12 +233,7 @@ public class KeyguardSecurityContainer extends FrameLayout {      // Used to notify the container when something interesting happens.      public interface SecurityCallback { -        /** -         * Potentially dismiss the current security screen, after validating that all device -         * security has been unlocked. Otherwise show the next screen. -         */ -        boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen, -                SecurityMode expectedSecurityMode); +        boolean dismiss(boolean authenticated, int targetUserId, boolean bypassSecondaryLockScreen);          void userActivity(); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index c5fd4c1c4b90..3f876ca401cb 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -62,7 +62,6 @@ import com.android.systemui.log.SessionTracker;  import com.android.systemui.plugins.FalsingManager;  import com.android.systemui.shared.system.SysUiStatsLog;  import com.android.systemui.statusbar.policy.ConfigurationController; -import com.android.systemui.statusbar.policy.DeviceProvisionedController;  import com.android.systemui.statusbar.policy.KeyguardStateController;  import com.android.systemui.statusbar.policy.UserSwitcherController;  import com.android.systemui.util.ViewController; @@ -154,17 +153,14 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard          }          @Override -        public void dismiss(boolean authenticated, int targetId, -                SecurityMode expectedSecurityMode) { -            dismiss(authenticated, targetId, /* bypassSecondaryLockScreen */ false, -                    expectedSecurityMode); +        public void dismiss(boolean authenticated, int targetId) { +            dismiss(authenticated, targetId, /* bypassSecondaryLockScreen */ false);          }          @Override          public void dismiss(boolean authenticated, int targetId, -                boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { -            mSecurityCallback.dismiss(authenticated, targetId, bypassSecondaryLockScreen, -                    expectedSecurityMode); +                boolean bypassSecondaryLockScreen) { +            mSecurityCallback.dismiss(authenticated, targetId, bypassSecondaryLockScreen);          }          public boolean isVerifyUnlockOnly() { @@ -251,7 +247,6 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard              showPrimarySecurityScreen(false);          }      }; -    private final DeviceProvisionedController mDeviceProvisionedController;      private KeyguardSecurityContainerController(KeyguardSecurityContainer view,              AdminSecondaryLockScreenController.Factory adminSecondaryLockScreenControllerFactory, @@ -269,9 +264,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard              UserSwitcherController userSwitcherController,              FeatureFlags featureFlags,              GlobalSettings globalSettings, -            SessionTracker sessionTracker, -            DeviceProvisionedController deviceProvisionedController -    ) { +            SessionTracker sessionTracker) {          super(view);          mLockPatternUtils = lockPatternUtils;          mUpdateMonitor = keyguardUpdateMonitor; @@ -291,7 +284,6 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard          mFeatureFlags = featureFlags;          mGlobalSettings = globalSettings;          mSessionTracker = sessionTracker; -        mDeviceProvisionedController = deviceProvisionedController;      }      @Override @@ -358,13 +350,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard          return mCurrentSecurityMode;      } -    /** -     * Potentially dismiss the current security screen, after validating that all device -     * security has been unlocked. Otherwise show the next screen. -     */ -    public void dismiss(boolean authenticated, int targetUserId, -            SecurityMode expectedSecurityMode) { -        mKeyguardSecurityCallback.dismiss(authenticated, targetUserId, expectedSecurityMode); +    public void dismiss(boolean authenticated, int targetUserId) { +        mKeyguardSecurityCallback.dismiss(authenticated, targetUserId);      }      public void reset() { @@ -423,21 +410,12 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard       *     completion.       * @param bypassSecondaryLockScreen true if the user is allowed to bypass the secondary       *     secondary lock screen requirement, if any. -     * @param expectedSecurityMode SecurityMode that is invoking this request. SecurityMode.Invalid -     *      indicates that no check should be done       * @return true if keyguard is done       */      public boolean showNextSecurityScreenOrFinish(boolean authenticated, int targetUserId, -            boolean bypassSecondaryLockScreen, SecurityMode expectedSecurityMode) { +            boolean bypassSecondaryLockScreen) {          if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")"); -        if (expectedSecurityMode != SecurityMode.Invalid -                && expectedSecurityMode != getCurrentSecurityMode()) { -            Log.w(TAG, "Attempted to invoke showNextSecurityScreenOrFinish with securityMode " -                    + expectedSecurityMode + ", but current mode is " + getCurrentSecurityMode()); -            return false; -        } -          boolean finish = false;          boolean strongAuth = false;          int eventSubtype = -1; @@ -474,11 +452,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard                  case SimPuk:                      // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home                      SecurityMode securityMode = mSecurityModel.getSecurityMode(targetUserId); -                    boolean isLockscreenDisabled = mLockPatternUtils.isLockScreenDisabled( -                            KeyguardUpdateMonitor.getCurrentUser()) -                            || !mDeviceProvisionedController.isUserSetup(targetUserId); - -                    if (securityMode == SecurityMode.None && isLockscreenDisabled) { +                    if (securityMode == SecurityMode.None || mLockPatternUtils.isLockScreenDisabled( +                            KeyguardUpdateMonitor.getCurrentUser())) {                          finish = true;                          eventSubtype = BOUNCER_DISMISS_SIM;                          uiEvent = BouncerUiEvent.BOUNCER_DISMISS_SIM; @@ -684,7 +659,6 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard          private final FeatureFlags mFeatureFlags;          private final UserSwitcherController mUserSwitcherController;          private final SessionTracker mSessionTracker; -        private final DeviceProvisionedController mDeviceProvisionedController;          @Inject          Factory(KeyguardSecurityContainer view, @@ -703,8 +677,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard                  UserSwitcherController userSwitcherController,                  FeatureFlags featureFlags,                  GlobalSettings globalSettings, -                SessionTracker sessionTracker, -                DeviceProvisionedController deviceProvisionedController) { +                SessionTracker sessionTracker) {              mView = view;              mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory;              mLockPatternUtils = lockPatternUtils; @@ -721,7 +694,6 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard              mGlobalSettings = globalSettings;              mUserSwitcherController = userSwitcherController;              mSessionTracker = sessionTracker; -            mDeviceProvisionedController = deviceProvisionedController;          }          public KeyguardSecurityContainerController create( @@ -731,8 +703,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard                      mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger,                      mKeyguardStateController, securityCallback, mSecurityViewFlipperController,                      mConfigurationController, mFalsingCollector, mFalsingManager, -                    mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker, -                    mDeviceProvisionedController); +                    mUserSwitcherController, mFeatureFlags, mGlobalSettings, mSessionTracker);          }      }  } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java index b3f25c289b46..47df70b522f7 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java @@ -168,8 +168,7 @@ public class KeyguardSimPinViewController                              mRemainingAttempts = -1;                              mShowDefaultMessage = true;                              getKeyguardSecurityCallback().dismiss( -                                    true, KeyguardUpdateMonitor.getCurrentUser(), -                                    SecurityMode.SimPin); +                                    true, KeyguardUpdateMonitor.getCurrentUser());                          } else {                              mShowDefaultMessage = false;                              if (result.getResult() == PinResult.PIN_RESULT_TYPE_INCORRECT) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java index 203f9b660536..47aa43b86599 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java @@ -69,8 +69,7 @@ public class KeyguardSimPukViewController              if (simState == TelephonyManager.SIM_STATE_READY) {                  mRemainingAttempts = -1;                  mShowDefaultMessage = true; -                getKeyguardSecurityCallback().dismiss(true, KeyguardUpdateMonitor.getCurrentUser(), -                        SecurityMode.SimPuk); +                getKeyguardSecurityCallback().dismiss(true, KeyguardUpdateMonitor.getCurrentUser());              } else {                  resetState();              } @@ -279,8 +278,7 @@ public class KeyguardSimPukViewController                              mShowDefaultMessage = true;                              getKeyguardSecurityCallback().dismiss( -                                    true, KeyguardUpdateMonitor.getCurrentUser(), -                                    SecurityMode.SimPuk); +                                    true, KeyguardUpdateMonitor.getCurrentUser());                          } else {                              mShowDefaultMessage = false;                              if (result.getResult() == PinResult.PIN_RESULT_TYPE_INCORRECT) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 13690f30ab3b..e87feff59b83 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -275,7 +275,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab      HashMap<Integer, SimData> mSimDatas = new HashMap<>();      HashMap<Integer, ServiceState> mServiceStates = new HashMap<Integer, ServiceState>(); -    private int mRingMode;      private int mPhoneState;      private boolean mKeyguardIsVisible;      private boolean mCredentialAttempted; @@ -752,6 +751,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab      private void handleFingerprintAuthFailed() {          Assert.isMainThread(); +        if (mHandler.hasCallbacks(mFpCancelNotReceived)) { +            Log.d(TAG, "handleFingerprintAuthFailed()" +                    + " triggered while waiting for cancellation, removing watchdog"); +            mHandler.removeCallbacks(mFpCancelNotReceived); +        }          for (int i = 0; i < mCallbacks.size(); i++) {              KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();              if (cb != null) { @@ -782,6 +786,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab      private void handleFingerprintAuthenticated(int authUserId, boolean isStrongBiometric) {          Trace.beginSection("KeyGuardUpdateMonitor#handlerFingerPrintAuthenticated"); +        if (mHandler.hasCallbacks(mFpCancelNotReceived)) { +            Log.d(TAG, "handleFingerprintAuthenticated()" +                    + " triggered while waiting for cancellation, removing watchdog"); +            mHandler.removeCallbacks(mFpCancelNotReceived); +        }          try {              final int userId;              try { @@ -1041,7 +1050,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab      private void handleFaceError(int msgId, String errString) {          Assert.isMainThread(); -        if (DEBUG_FACE) Log.d(TAG, "Face error received: " + errString); +        if (DEBUG_FACE) Log.d(TAG, "Face error received: " + errString + " msgId=" + msgId);          if (mHandler.hasCallbacks(mFaceCancelNotReceived)) {              mHandler.removeCallbacks(mFaceCancelNotReceived);          } @@ -1511,6 +1520,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab                  handleFingerprintAuthenticated(userId, isStrongBiometric);              }; +    /** +     * Propagates a pointer down event to keyguard. +     */ +    public void onUdfpsPointerDown(int sensorId) { +        mFingerprintAuthenticationCallback.onUdfpsPointerDown(sensorId); +    } + +    /** +     * Propagates a pointer up event to keyguard. +     */ +    public void onUdfpsPointerUp(int sensorId) { +        mFingerprintAuthenticationCallback.onUdfpsPointerUp(sensorId); +    } +      @VisibleForTesting      final FingerprintManager.AuthenticationCallback mFingerprintAuthenticationCallback              = new AuthenticationCallback() { @@ -1551,15 +1574,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab                      Trace.endSection();                  } +                /** +                 * Note, this is currently called from UdfpsController. +                 */                  @Override                  public void onUdfpsPointerDown(int sensorId) {                      Log.d(TAG, "onUdfpsPointerDown, sensorId: " + sensorId);                      requestFaceAuth(true); -                    if (isFaceDetectionRunning()) { -                        mKeyguardBypassController.setUserHasDeviceEntryIntent(true); -                    }                  } +                /** +                 * Note, this is currently called from UdfpsController. +                 */                  @Override                  public void onUdfpsPointerUp(int sensorId) {                      Log.d(TAG, "onUdfpsPointerUp, sensorId: " + sensorId); @@ -1587,9 +1613,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab                                  "faceFailure-" + reason);                      handleFaceAuthFailed(); -                    if (mKeyguardBypassController != null) { -                        mKeyguardBypassController.setUserHasDeviceEntryIntent(false); -                    }                  }                  @Override @@ -1597,10 +1620,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab                      Trace.beginSection("KeyguardUpdateMonitor#onAuthenticationSucceeded");                      handleFaceAuthenticated(result.getUserId(), result.isStrongBiometric());                      Trace.endSection(); - -                    if (mKeyguardBypassController != null) { -                        mKeyguardBypassController.setUserHasDeviceEntryIntent(false); -                    }                  }                  @Override @@ -1611,9 +1630,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab                  @Override                  public void onAuthenticationError(int errMsgId, CharSequence errString) {                      handleFaceError(errMsgId, errString.toString()); -                    if (mKeyguardBypassController != null) { -                        mKeyguardBypassController.setUserHasDeviceEntryIntent(false); -                    }                      if (mActiveUnlockConfig.shouldRequestActiveUnlockOnFaceError(errMsgId)) {                          requestActiveUnlock( @@ -2177,6 +2193,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab                          && mBiometricEnabledForUser.get(userId));      } +    public boolean isFaceSupported() { +        return mFaceManager != null && mFaceManager.isHardwareDetected(); +    } +      /**       * @return true if there's at least one udfps enrolled for the current user.       */ @@ -2296,10 +2316,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab          updateFaceListeningState(BIOMETRIC_ACTION_START);      } -    public boolean isFaceAuthUserRequested() { -        return mIsFaceAuthUserRequested; -    } -      /**       * In case face auth is running, cancel it.       */ @@ -2307,6 +2323,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab          stopListeningForFace();      } +    public boolean isFaceScanning() { +        return mFaceRunningState == BIOMETRIC_STATE_RUNNING; +    } +      private void updateFaceListeningState(int action) {          // If this message exists, we should not authenticate again until this message is          // consumed by the handler @@ -3160,11 +3180,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab              mSecureCameraLaunched = false;          } -        if (mKeyguardBypassController != null) { -            // LS visibility has changed, so reset deviceEntryIntent -            mKeyguardBypassController.setUserHasDeviceEntryIntent(false); -        } -          for (int i = 0; i < mCallbacks.size(); i++) {              KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();              if (cb != null) { @@ -3809,6 +3824,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab              pw.println("    enabledByUser=" + mBiometricEnabledForUser.get(userId));              pw.println("    mSecureCameraLaunched=" + mSecureCameraLaunched);              pw.println("    mBouncerFullyShown=" + mBouncerFullyShown); +            pw.println("    mNeedsSlowUnlockTransition=" + mNeedsSlowUnlockTransition);          }          mListenModels.print(pw); diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 680b8bd70837..0097196fd841 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -83,8 +83,8 @@ public class LockIconViewController extends ViewController<LockIconView> impleme      private static final int sLockIconRadiusPx = (int) (sDefaultDensity * 36);      private static final VibrationAttributes TOUCH_VIBRATION_ATTRIBUTES =              VibrationAttributes.createForUsage(VibrationAttributes.USAGE_TOUCH); -    private static final long LONG_PRESS_TIMEOUT = 200L; // milliseconds +    private final long mLongPressTimeout;      @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;      @NonNull private final KeyguardViewController mKeyguardViewController;      @NonNull private final StatusBarStateController mStatusBarStateController; @@ -176,6 +176,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme          mView.setImageDrawable(mIcon);          mUnlockedLabel = resources.getString(R.string.accessibility_unlock_button);          mLockedLabel = resources.getString(R.string.accessibility_lock_icon); +        mLongPressTimeout = resources.getInteger(R.integer.config_lockIconLongPress);          dumpManager.registerDumpable(TAG, this);      } @@ -545,7 +546,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme      /**       * Handles the touch if it is within the lock icon view and {@link #isActionable()} is true.       * Subsequently, will trigger {@link #onLongPress()} if a touch is continuously in the lock icon -     * area for {@link #LONG_PRESS_TIMEOUT} ms. +     * area for {@link #mLongPressTimeout} ms.       *       * Touch speed debouncing mimics logic from the velocity tracker in {@link UdfpsController}.       */ @@ -585,7 +586,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme                  mDownDetected = true;                  mLongPressCancelRunnable = mExecutor.executeDelayed( -                        this::onLongPress, LONG_PRESS_TIMEOUT); +                        this::onLongPress, mLongPressTimeout);                  break;              case MotionEvent.ACTION_MOVE:              case MotionEvent.ACTION_HOVER_MOVE: @@ -600,7 +601,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme                              + "high pointer velocity=" + velocity);                      mLongPressCancelRunnable.run();                      mLongPressCancelRunnable = mExecutor.executeDelayed( -                            this::onLongPress, LONG_PRESS_TIMEOUT); +                            this::onLongPress, mLongPressTimeout);                  }                  break;              case MotionEvent.ACTION_UP: @@ -651,7 +652,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme                  Process.myUid(),                  getContext().getOpPackageName(),                  UdfpsController.EFFECT_CLICK, -                "lock-icon-device-entry", +                "lock-screen-lock-icon-longpress",                  TOUCH_VIBRATION_ATTRIBUTES);          mKeyguardViewController.showBouncer(/* scrim */ true); @@ -676,6 +677,12 @@ public class LockIconViewController extends ViewController<LockIconView> impleme      }      private boolean isActionable() { +        if (mIsBouncerShowing) { +            Log.v(TAG, "lock icon long-press ignored, bouncer already showing."); +            // a long press gestures from AOD may have already triggered the bouncer to show, +            // so this touch is no longer actionable +            return false; +        }          return mUdfpsSupported || mShowUnlockIcon;      } diff --git a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt index 34164f3b7306..d2c229b8ead1 100644 --- a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt +++ b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt @@ -279,7 +279,7 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {      }      companion object { -        private const val HIDDEN_CAMERA_PROTECTION_SCALE = 0.5f +        const val HIDDEN_CAMERA_PROTECTION_SCALE = 0.5f          @JvmStatic protected fun transformPhysicalToLogicalCoordinates(              @Surface.Rotation rotation: Int, diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt new file mode 100644 index 000000000000..c5955860aebf --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt @@ -0,0 +1,375 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.AnimatorSet +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Matrix +import android.graphics.Paint +import android.graphics.Path +import android.graphics.RectF +import android.hardware.biometrics.BiometricSourceType +import android.view.View +import androidx.core.graphics.ColorUtils +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.keyguard.KeyguardUpdateMonitorCallback +import com.android.settingslib.Utils +import com.android.systemui.animation.Interpolators +import com.android.systemui.plugins.statusbar.StatusBarStateController +import java.util.concurrent.Executor + +/** + * When the face is enrolled, we use this view to show the face scanning animation and the camera + * protection on the keyguard. + */ +class FaceScanningOverlay( +    context: Context, +    pos: Int, +    val statusBarStateController: StatusBarStateController, +    val keyguardUpdateMonitor: KeyguardUpdateMonitor, +    val mainExecutor: Executor +) : ScreenDecorations.DisplayCutoutView(context, pos) { +    private var showScanningAnim = false +    private val rimPaint = Paint() +    private var rimProgress: Float = HIDDEN_CAMERA_PROTECTION_SCALE +    private var rimAnimator: AnimatorSet? = null +    private val rimRect = RectF() +    private var cameraProtectionColor = Color.BLACK +    var faceScanningAnimColor = Utils.getColorAttrDefaultColor(context, +            com.android.systemui.R.attr.wallpaperTextColorAccent) +    private var cameraProtectionAnimator: ValueAnimator? = null +    var hideOverlayRunnable: Runnable? = null +    var faceAuthSucceeded = false + +    init { +        visibility = View.INVISIBLE // only show this view when face scanning is happening +    } + +    override fun onAttachedToWindow() { +        super.onAttachedToWindow() +        mainExecutor.execute { +            keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback) +        } +    } + +    override fun onDetachedFromWindow() { +        super.onDetachedFromWindow() +        mainExecutor.execute { +            keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback) +        } +    } + +    override fun setColor(color: Int) { +        cameraProtectionColor = color +        invalidate() +    } + +    override fun drawCutoutProtection(canvas: Canvas) { +        if (rimProgress > HIDDEN_RIM_SCALE && !protectionRect.isEmpty) { +            val rimPath = Path(protectionPath) +            val scaleMatrix = Matrix().apply { +                val rimBounds = RectF() +                rimPath.computeBounds(rimBounds, true) +                setScale(rimProgress, rimProgress, rimBounds.centerX(), rimBounds.centerY()) +            } +            rimPath.transform(scaleMatrix) +            rimPaint.style = Paint.Style.FILL +            val rimPaintAlpha = rimPaint.alpha +            rimPaint.color = ColorUtils.blendARGB( +                    faceScanningAnimColor, +                    Color.WHITE, +                    statusBarStateController.dozeAmount) +            rimPaint.alpha = rimPaintAlpha +            canvas.drawPath(rimPath, rimPaint) +        } + +        if (cameraProtectionProgress > HIDDEN_CAMERA_PROTECTION_SCALE && +                !protectionRect.isEmpty) { +            val scaledProtectionPath = Path(protectionPath) +            val scaleMatrix = Matrix().apply { +                val protectionPathRect = RectF() +                scaledProtectionPath.computeBounds(protectionPathRect, true) +                setScale(cameraProtectionProgress, cameraProtectionProgress, +                        protectionPathRect.centerX(), protectionPathRect.centerY()) +            } +            scaledProtectionPath.transform(scaleMatrix) +            paint.style = Paint.Style.FILL +            paint.color = cameraProtectionColor +            canvas.drawPath(scaledProtectionPath, paint) +        } +    } + +    override fun updateVisOnUpdateCutout(): Boolean { +        return false // instead, we always update the visibility whenever face scanning starts/ends +    } + +    override fun enableShowProtection(show: Boolean) { +        val showScanningAnimNow = keyguardUpdateMonitor.isFaceScanning && show +        if (showScanningAnimNow == showScanningAnim) { +            return +        } +        showScanningAnim = showScanningAnimNow +        updateProtectionBoundingPath() +        // Delay the relayout until the end of the animation when hiding, +        // otherwise we'd clip it. +        if (showScanningAnim) { +            visibility = View.VISIBLE +            requestLayout() +        } + +        cameraProtectionAnimator?.cancel() +        cameraProtectionAnimator = ValueAnimator.ofFloat(cameraProtectionProgress, +                if (showScanningAnimNow) SHOW_CAMERA_PROTECTION_SCALE +                else HIDDEN_CAMERA_PROTECTION_SCALE).apply { +            startDelay = +                    if (showScanningAnim) 0 +                    else if (faceAuthSucceeded) PULSE_SUCCESS_DISAPPEAR_DURATION +                    else PULSE_ERROR_DISAPPEAR_DURATION +            duration = +                    if (showScanningAnim) CAMERA_PROTECTION_APPEAR_DURATION +                    else if (faceAuthSucceeded) CAMERA_PROTECTION_SUCCESS_DISAPPEAR_DURATION +                    else CAMERA_PROTECTION_ERROR_DISAPPEAR_DURATION +            interpolator = +                    if (showScanningAnim) Interpolators.STANDARD_ACCELERATE +                    else if (faceAuthSucceeded) Interpolators.STANDARD +                    else Interpolators.STANDARD_DECELERATE +            addUpdateListener(ValueAnimator.AnimatorUpdateListener { +                animation: ValueAnimator -> +                cameraProtectionProgress = animation.animatedValue as Float +                invalidate() +            }) +            addListener(object : AnimatorListenerAdapter() { +                override fun onAnimationEnd(animation: Animator) { +                    cameraProtectionAnimator = null +                    if (!showScanningAnim) { +                        visibility = View.INVISIBLE +                        hideOverlayRunnable?.run() +                        hideOverlayRunnable = null +                        requestLayout() +                    } +                } +            }) +        } + +        rimAnimator?.cancel() +        rimAnimator = AnimatorSet().apply { +            if (showScanningAnim) { +                val rimAppearAnimator = ValueAnimator.ofFloat(SHOW_CAMERA_PROTECTION_SCALE, +                        PULSE_RADIUS_OUT).apply { +                    duration = PULSE_APPEAR_DURATION +                    interpolator = Interpolators.STANDARD_DECELERATE +                    addUpdateListener(ValueAnimator.AnimatorUpdateListener { +                        animation: ValueAnimator -> +                        rimProgress = animation.animatedValue as Float +                        invalidate() +                    }) +                } + +                // animate in camera protection, rim, and then pulse in/out +                playSequentially(cameraProtectionAnimator, rimAppearAnimator, +                        createPulseAnimator(), createPulseAnimator(), +                        createPulseAnimator(), createPulseAnimator(), +                        createPulseAnimator(), createPulseAnimator()) +            } else { +                val rimDisappearAnimator = ValueAnimator.ofFloat( +                        rimProgress, +                        if (faceAuthSucceeded) PULSE_RADIUS_SUCCESS +                        else SHOW_CAMERA_PROTECTION_SCALE +                ).apply { +                    duration = +                            if (faceAuthSucceeded) PULSE_SUCCESS_DISAPPEAR_DURATION +                            else PULSE_ERROR_DISAPPEAR_DURATION +                    interpolator = +                            if (faceAuthSucceeded) Interpolators.STANDARD_DECELERATE +                            else Interpolators.STANDARD +                    addUpdateListener(ValueAnimator.AnimatorUpdateListener { +                        animation: ValueAnimator -> +                        rimProgress = animation.animatedValue as Float +                        invalidate() +                    }) +                    addListener(object : AnimatorListenerAdapter() { +                        override fun onAnimationEnd(animation: Animator) { +                            rimProgress = HIDDEN_RIM_SCALE +                            invalidate() +                        } +                    }) +                } +                if (faceAuthSucceeded) { +                    val successOpacityAnimator = ValueAnimator.ofInt(255, 0).apply { +                        duration = PULSE_SUCCESS_DISAPPEAR_DURATION +                        interpolator = Interpolators.LINEAR +                        addUpdateListener(ValueAnimator.AnimatorUpdateListener { +                            animation: ValueAnimator -> +                            rimPaint.alpha = animation.animatedValue as Int +                            invalidate() +                        }) +                        addListener(object : AnimatorListenerAdapter() { +                            override fun onAnimationEnd(animation: Animator) { +                                rimPaint.alpha = 255 +                                invalidate() +                            } +                        }) +                    } +                    val rimSuccessAnimator = AnimatorSet() +                    rimSuccessAnimator.playTogether(rimDisappearAnimator, successOpacityAnimator) +                    playTogether(rimSuccessAnimator, cameraProtectionAnimator) +                } else { +                    playTogether(rimDisappearAnimator, cameraProtectionAnimator) +                } +            } + +            addListener(object : AnimatorListenerAdapter() { +                override fun onAnimationEnd(animation: Animator) { +                    rimAnimator = null +                    if (!showScanningAnim) { +                        requestLayout() +                    } +                } +            }) +            start() +        } +    } + +    fun createPulseAnimator(): AnimatorSet { +        return AnimatorSet().apply { +            val pulseInwards = ValueAnimator.ofFloat( +                    PULSE_RADIUS_OUT, PULSE_RADIUS_IN).apply { +                duration = PULSE_DURATION_INWARDS +                interpolator = Interpolators.STANDARD +                addUpdateListener(ValueAnimator.AnimatorUpdateListener { +                    animation: ValueAnimator -> +                    rimProgress = animation.animatedValue as Float +                    invalidate() +                }) +            } +            val pulseOutwards = ValueAnimator.ofFloat( +                    PULSE_RADIUS_IN, PULSE_RADIUS_OUT).apply { +                duration = PULSE_DURATION_OUTWARDS +                interpolator = Interpolators.STANDARD +                addUpdateListener(ValueAnimator.AnimatorUpdateListener { +                    animation: ValueAnimator -> +                    rimProgress = animation.animatedValue as Float +                    invalidate() +                }) +            } +            playSequentially(pulseInwards, pulseOutwards) +        } +    } + +    override fun updateProtectionBoundingPath() { +        super.updateProtectionBoundingPath() +        rimRect.set(protectionRect) +        rimRect.scale(rimProgress) +    } + +    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { +        if (mBounds.isEmpty()) { +            super.onMeasure(widthMeasureSpec, heightMeasureSpec) +            return +        } +        if (showScanningAnim) { +            // Make sure that our measured height encompasses the extra space for the animation +            mTotalBounds.union(mBoundingRect) +            mTotalBounds.union( +                    rimRect.left.toInt(), +                    rimRect.top.toInt(), +                    rimRect.right.toInt(), +                    rimRect.bottom.toInt()) +            setMeasuredDimension( +                    resolveSizeAndState(mTotalBounds.width(), widthMeasureSpec, 0), +                    resolveSizeAndState(mTotalBounds.height(), heightMeasureSpec, 0)) +        } else { +            setMeasuredDimension( +                    resolveSizeAndState(mBoundingRect.width(), widthMeasureSpec, 0), +                    resolveSizeAndState(mBoundingRect.height(), heightMeasureSpec, 0)) +        } +    } + +    private val keyguardUpdateMonitorCallback = object : KeyguardUpdateMonitorCallback() { +        override fun onBiometricAuthenticated( +            userId: Int, +            biometricSourceType: BiometricSourceType?, +            isStrongBiometric: Boolean +        ) { +            if (biometricSourceType == BiometricSourceType.FACE) { +                post { +                    faceAuthSucceeded = true +                    enableShowProtection(true) +                } +            } +        } + +        override fun onBiometricAcquired( +            biometricSourceType: BiometricSourceType?, +            acquireInfo: Int +        ) { +            if (biometricSourceType == BiometricSourceType.FACE) { +                post { +                    faceAuthSucceeded = false // reset +                } +            } +        } + +        override fun onBiometricAuthFailed(biometricSourceType: BiometricSourceType?) { +            if (biometricSourceType == BiometricSourceType.FACE) { +                post { +                    faceAuthSucceeded = false +                    enableShowProtection(false) +                } +            } +        } + +        override fun onBiometricError( +            msgId: Int, +            errString: String?, +            biometricSourceType: BiometricSourceType? +        ) { +            if (biometricSourceType == BiometricSourceType.FACE) { +                post { +                    faceAuthSucceeded = false +                    enableShowProtection(false) +                } +            } +        } +    } + +    companion object { +        private const val HIDDEN_RIM_SCALE = HIDDEN_CAMERA_PROTECTION_SCALE +        private const val SHOW_CAMERA_PROTECTION_SCALE = 1f + +        private const val PULSE_RADIUS_IN = 1.1f +        private const val PULSE_RADIUS_OUT = 1.125f +        private const val PULSE_RADIUS_SUCCESS = 1.25f + +        private const val CAMERA_PROTECTION_APPEAR_DURATION = 250L +        private const val PULSE_APPEAR_DURATION = 250L // without start delay + +        private const val PULSE_DURATION_INWARDS = 500L +        private const val PULSE_DURATION_OUTWARDS = 500L + +        private const val PULSE_SUCCESS_DISAPPEAR_DURATION = 400L +        private const val CAMERA_PROTECTION_SUCCESS_DISAPPEAR_DURATION = 500L // without start delay + +        private const val PULSE_ERROR_DISAPPEAR_DURATION = 200L +        private const val CAMERA_PROTECTION_ERROR_DISAPPEAR_DURATION = 300L // without start delay +    } +} diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt b/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt index 0df2730a48eb..a74f2f8a5e34 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt @@ -44,7 +44,7 @@ import kotlin.math.ceil  import kotlin.math.floor  /** - * When the HWC of the device supports Composition.DISPLAY_DECORATON, we use this layer to draw + * When the HWC of the device supports Composition.DISPLAY_DECORATION, we use this layer to draw   * screen decorations.   */  class ScreenDecorHwcLayer(context: Context, displayDecorationSupport: DisplayDecorationSupport) diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index c04463ad6906..edcaf492874d 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -69,12 +69,14 @@ import android.widget.FrameLayout;  import androidx.annotation.VisibleForTesting;  import com.android.internal.util.Preconditions; +import com.android.settingslib.Utils;  import com.android.systemui.broadcast.BroadcastDispatcher;  import com.android.systemui.dagger.SysUISingleton;  import com.android.systemui.dagger.qualifiers.Main;  import com.android.systemui.decor.DecorProvider;  import com.android.systemui.decor.DecorProviderFactory;  import com.android.systemui.decor.DecorProviderKt; +import com.android.systemui.decor.FaceScanningProviderFactory;  import com.android.systemui.decor.OverlayWindow;  import com.android.systemui.decor.PrivacyDotDecorProviderFactory;  import com.android.systemui.decor.RoundedCornerDecorProviderFactory; @@ -90,8 +92,10 @@ import com.android.systemui.util.settings.SecureSettings;  import java.io.PrintWriter;  import java.util.ArrayList; +import java.util.HashSet;  import java.util.List;  import java.util.Objects; +import java.util.Set;  import java.util.concurrent.Executor;  import javax.inject.Inject; @@ -131,6 +135,8 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab      private final PrivacyDotViewController mDotViewController;      private final ThreadFactory mThreadFactory;      private final DecorProviderFactory mDotFactory; +    private final FaceScanningProviderFactory mFaceScanningFactory; +    public final int mFaceScanningViewId;      @VisibleForTesting      protected RoundedCornerResDelegate mRoundedCornerResDelegate; @@ -161,46 +167,84 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab      @VisibleForTesting      protected DisplayInfo mDisplayInfo = new DisplayInfo(); -    private CameraAvailabilityListener.CameraTransitionCallback mCameraTransitionCallback = -            new CameraAvailabilityListener.CameraTransitionCallback() { -        @Override -        public void onApplyCameraProtection(@NonNull Path protectionPath, @NonNull Rect bounds) { -            if (mScreenDecorHwcLayer != null) { -                mScreenDecorHwcLayer.setProtection(protectionPath, bounds); -                mScreenDecorHwcLayer.enableShowProtection(true); +    @VisibleForTesting +    protected void showCameraProtection(@NonNull Path protectionPath, @NonNull Rect bounds) { +        if (mFaceScanningFactory.shouldShowFaceScanningAnim()) { +            DisplayCutoutView overlay = (DisplayCutoutView) getOverlayView( +                    mFaceScanningViewId); +            if (overlay != null) { +                overlay.setProtection(protectionPath, bounds); +                overlay.enableShowProtection(true); +                updateOverlayWindowVisibilityIfViewExists( +                        overlay.findViewById(mFaceScanningViewId)); +                // immediately return, bc FaceScanningOverlay also renders the camera +                // protection, so we don't need to show the camera protection in +                // mScreenDecorHwcLayer or mCutoutViews                  return;              } -            if (mCutoutViews == null) { -                Log.w(TAG, "DisplayCutoutView do not initialized"); -                return; +        } + +        if (mScreenDecorHwcLayer != null) { +            mScreenDecorHwcLayer.setProtection(protectionPath, bounds); +            mScreenDecorHwcLayer.enableShowProtection(true); +            return; +        } + +        if (mCutoutViews == null) { +            Log.w(TAG, "DisplayCutoutView not initialized onApplyCameraProtection"); +            return; +        } + +        // Show the extra protection around the front facing camera if necessary +        for (DisplayCutoutView dcv : mCutoutViews) { +            // Check Null since not all mCutoutViews[pos] be inflated at the meanwhile +            if (dcv != null) { +                dcv.setProtection(protectionPath, bounds); +                dcv.enableShowProtection(true);              } -            // Show the extra protection around the front facing camera if necessary -            for (DisplayCutoutView dcv : mCutoutViews) { -                // Check Null since not all mCutoutViews[pos] be inflated at the meanwhile -                if (dcv != null) { -                    dcv.setProtection(protectionPath, bounds); -                    dcv.enableShowProtection(true); -                } +        } +    } + +    @VisibleForTesting +    protected void hideCameraProtection() { +        FaceScanningOverlay faceScanningOverlay = +                (FaceScanningOverlay) getOverlayView(mFaceScanningViewId); +        if (faceScanningOverlay != null) { +            faceScanningOverlay.setHideOverlayRunnable(() -> { +                updateOverlayWindowVisibilityIfViewExists( +                        faceScanningOverlay.findViewById(mFaceScanningViewId)); +            }); +            faceScanningOverlay.enableShowProtection(false); +        } + +        if (mScreenDecorHwcLayer != null) { +            mScreenDecorHwcLayer.enableShowProtection(false); +            return; +        } + +        if (mCutoutViews == null) { +            Log.w(TAG, "DisplayCutoutView not initialized onHideCameraProtection"); +            return; +        } +        // Go back to the regular anti-aliasing +        for (DisplayCutoutView dcv : mCutoutViews) { +            // Check Null since not all mCutoutViews[pos] be inflated at the meanwhile +            if (dcv != null) { +                dcv.enableShowProtection(false);              }          } +    } + +    private CameraAvailabilityListener.CameraTransitionCallback mCameraTransitionCallback = +            new CameraAvailabilityListener.CameraTransitionCallback() { +        @Override +        public void onApplyCameraProtection(@NonNull Path protectionPath, @NonNull Rect bounds) { +            showCameraProtection(protectionPath, bounds); +        }          @Override          public void onHideCameraProtection() { -            if (mScreenDecorHwcLayer != null) { -                mScreenDecorHwcLayer.enableShowProtection(false); -                return; -            } -            if (mCutoutViews == null) { -                Log.w(TAG, "DisplayCutoutView do not initialized"); -                return; -            } -            // Go back to the regular anti-aliasing -            for (DisplayCutoutView dcv : mCutoutViews) { -                // Check Null since not all mCutoutViews[pos] be inflated at the meanwhile -                if (dcv != null) { -                    dcv.enableShowProtection(false); -                } -            } +            hideCameraProtection();          }      }; @@ -209,25 +253,24 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              new PrivacyDotViewController.ShowingListener() {          @Override          public void onPrivacyDotShown(@Nullable View v) { -            setOverlayWindowVisibilityIfViewExist(v, View.VISIBLE); +            updateOverlayWindowVisibilityIfViewExists(v);          }          @Override          public void onPrivacyDotHidden(@Nullable View v) { -            setOverlayWindowVisibilityIfViewExist(v, View.INVISIBLE); +            updateOverlayWindowVisibilityIfViewExists(v);          }      };      @VisibleForTesting -    protected void setOverlayWindowVisibilityIfViewExist(@Nullable View view, -            @View.Visibility int visibility) { +    protected void updateOverlayWindowVisibilityIfViewExists(@Nullable View view) {          if (view == null) {              return;          }          mExecutor.execute(() -> {              // We don't need to control the window visibility if rounded corners or cutout is drawn              // on sw layer since the overlay windows are always visible in this case. -            if (mOverlays == null || !isOnlyPrivacyDotInSwLayer()) { +            if (mOverlays == null || !shouldOptimizeVisibility()) {                  return;              } @@ -236,7 +279,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab                      continue;                  }                  if (overlay.getView(view.getId()) != null) { -                    overlay.getRootView().setVisibility(visibility); +                    overlay.getRootView().setVisibility(getWindowVisibility(overlay, true));                      return;                  }              } @@ -258,7 +301,8 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              UserTracker userTracker,              PrivacyDotViewController dotViewController,              ThreadFactory threadFactory, -            PrivacyDotDecorProviderFactory dotFactory) { +            PrivacyDotDecorProviderFactory dotFactory, +            FaceScanningProviderFactory faceScanningFactory) {          super(context);          mMainExecutor = mainExecutor;          mSecureSettings = secureSettings; @@ -268,6 +312,8 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab          mDotViewController = dotViewController;          mThreadFactory = threadFactory;          mDotFactory = dotFactory; +        mFaceScanningFactory = faceScanningFactory; +        mFaceScanningViewId = com.android.systemui.R.id.face_scanning_anim;      }      @Override @@ -289,6 +335,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab      @NonNull      private List<DecorProvider> getProviders(boolean hasHwLayer) {          List<DecorProvider> decorProviders = new ArrayList<>(mDotFactory.getProviders()); +        decorProviders.addAll(mFaceScanningFactory.getProviders());          if (!hasHwLayer) {              decorProviders.addAll(mRoundedCornerFactory.getProviders());          } @@ -446,6 +493,13 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab                          cutoutView.onDisplayChanged(displayId);                      }                  } + +                DisplayCutoutView overlay = (DisplayCutoutView) getOverlayView(mFaceScanningViewId); +                if (overlay != null) { +                    // handle display resolution changes +                    overlay.onDisplayChanged(displayId); +                } +                  if (mScreenDecorHwcLayer != null) {                      mScreenDecorHwcLayer.onDisplayChanged(displayId);                  } @@ -466,7 +520,6 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              if (overlay == null) {                  continue;              } -              final View view = overlay.getView(id);              if (view != null) {                  return view; @@ -503,7 +556,9 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab      }      private void setupDecorations() { -        if (hasRoundedCorners() || shouldDrawCutout() || isPrivacyDotEnabled()) { +        if (hasRoundedCorners() || shouldDrawCutout() || isPrivacyDotEnabled() +                || mFaceScanningFactory.getHasProviders()) { +              List<DecorProvider> decorProviders = getProviders(mHwcScreenDecorationSupport != null);              removeRedundantOverlayViews(decorProviders); @@ -512,21 +567,24 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              } else {                  removeHwcOverlay();              } +              final DisplayCutout cutout = getCutout(); -            final boolean isOnlyPrivacyDotInSwLayer = isOnlyPrivacyDotInSwLayer(); +            final boolean shouldOptimizeVisibility = shouldOptimizeVisibility();              for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) { -                if (shouldShowSwLayerCutout(i, cutout) || shouldShowSwLayerRoundedCorner(i, cutout) +                if (shouldShowSwLayerCutout(i, cutout) +                        || shouldShowSwLayerFaceScan(i, cutout) +                        || shouldShowSwLayerRoundedCorner(i, cutout)                          || shouldShowSwLayerPrivacyDot(i, cutout)) {                      Pair<List<DecorProvider>, List<DecorProvider>> pair =                              DecorProviderKt.partitionAlignedBound(decorProviders, i);                      decorProviders = pair.getSecond(); -                    createOverlay(i, pair.getFirst(), isOnlyPrivacyDotInSwLayer); +                    createOverlay(i, pair.getFirst(), shouldOptimizeVisibility);                  } else {                      removeOverlay(i);                  }              } -            if (isOnlyPrivacyDotInSwLayer) { +            if (shouldOptimizeVisibility) {                  mDotViewController.setShowingListener(mPrivacyDotShowingListener);              } else {                  mDotViewController.setShowingListener(null); @@ -565,6 +623,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              }              mColorInversionSetting.setListening(true);              mColorInversionSetting.onChange(false); +            updateColorInversion(mColorInversionSetting.getValue());              IntentFilter filter = new IntentFilter();              filter.addAction(Intent.ACTION_USER_SWITCHED); @@ -626,59 +685,61 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab      @View.Visibility      private int getWindowVisibility(@NonNull OverlayWindow overlay, -            boolean isOnlyPrivacyDotInSwLayer) { -        if (!isOnlyPrivacyDotInSwLayer) { -            // Multiple views inside overlay, no need to optimize +            boolean shouldOptimizeVisibility) { +        if (!shouldOptimizeVisibility) { +            // All overlays have visible views so there's no need to optimize visibility. +            // For example, the rounded corners could exist in each overlay and since the rounded +            // corners are always visible, there's no need to optimize visibility.              return View.VISIBLE;          } +        // Optimize if it's just the privacy dot & face scanning animation, since the privacy +        // dot and face scanning overlay aren't always visible.          int[] ids = {                  R.id.privacy_dot_top_left_container,                  R.id.privacy_dot_top_right_container,                  R.id.privacy_dot_bottom_left_container, -                R.id.privacy_dot_bottom_right_container +                R.id.privacy_dot_bottom_right_container, +                mFaceScanningViewId          };          for (int id: ids) { -            final View view = overlay.getView(id); -            if (view != null && view.getVisibility() == View.VISIBLE) { -                // Only privacy dot in sw layers, overlay shall be VISIBLE if one of privacy dot -                // views inside this overlay is VISIBLE +            final View notAlwaysVisibleViews = overlay.getView(id); +            if (notAlwaysVisibleViews != null +                    && notAlwaysVisibleViews.getVisibility() == View.VISIBLE) { +                // Overlay is VISIBLE if one the views inside this overlay is VISIBLE                  return View.VISIBLE;              }          } -        // Only privacy dot in sw layers, overlay shall be INVISIBLE like default if no privacy dot -        // view inside this overlay is VISIBLE. + +        // Only non-visible views in this overlay, so set overlay to INVISIBLE          return View.INVISIBLE;      }      private void createOverlay(              @BoundsPosition int pos,              @NonNull List<DecorProvider> decorProviders, -            boolean isOnlyPrivacyDotInSwLayer) { +            boolean shouldOptimizeVisibility) {          if (mOverlays == null) {              mOverlays = new OverlayWindow[BOUNDS_POSITION_LENGTH];          }          if (mOverlays[pos] != null) { -            initOverlay(mOverlays[pos], decorProviders, isOnlyPrivacyDotInSwLayer); +            initOverlay(mOverlays[pos], decorProviders, shouldOptimizeVisibility);              return;          } -          mOverlays[pos] = new OverlayWindow(mContext); -        initOverlay(mOverlays[pos], decorProviders, isOnlyPrivacyDotInSwLayer); +        initOverlay(mOverlays[pos], decorProviders, shouldOptimizeVisibility);          final ViewGroup overlayView = mOverlays[pos].getRootView();          overlayView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);          overlayView.setAlpha(0);          overlayView.setForceDarkAllowed(false); -        // Only show cutout and rounded corners in mOverlays when hwc don't support screen -        // decoration. +        // Only show cutout in mOverlays when hwc doesn't support screen decoration          if (mHwcScreenDecorationSupport == null) {              if (mCutoutViews == null) {                  mCutoutViews = new DisplayCutoutView[BOUNDS_POSITION_LENGTH];              }              mCutoutViews[pos] = new DisplayCutoutView(mContext, pos); -            mCutoutViews[pos].setColor(mTintColor);              overlayView.addView(mCutoutViews[pos]);              mCutoutViews[pos].updateRotation(mRotation);          } @@ -736,7 +797,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab      private void initOverlay(              @NonNull OverlayWindow overlay,              @NonNull List<DecorProvider> decorProviders, -            boolean isOnlyPrivacyDotInSwLayer) { +            boolean shouldOptimizeVisibility) {          if (!overlay.hasSameProviders(decorProviders)) {              decorProviders.forEach(provider -> {                  if (overlay.getView(provider.getViewId()) != null) { @@ -746,9 +807,10 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab                  overlay.addDecorProvider(provider, mRotation);              });          } -        // Use visibility of privacy dot views if only privacy dot in sw layer -        overlay.getRootView().setVisibility( -                getWindowVisibility(overlay, isOnlyPrivacyDotInSwLayer)); +        // Use visibility of privacy dot views & face scanning view to determine the overlay's +        // visibility if the screen decoration SW layer overlay isn't persistently showing +        // (ie: rounded corners always showing in SW layer) +        overlay.getRootView().setVisibility(getWindowVisibility(overlay, shouldOptimizeVisibility));      }      @VisibleForTesting @@ -780,7 +842,8 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab                          | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL                          | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH                          | WindowManager.LayoutParams.FLAG_SLIPPERY -                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, +                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN +                        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,                  PixelFormat.TRANSLUCENT);          lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS                  | WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; @@ -888,23 +951,28 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              mTintColor = Color.RED;          } -        // When the hwc supports screen decorations, the layer will use the A8 color mode which -        // won't be affected by the color inversion. If the composition goes the client composition -        // route, the color inversion will be handled by the RenderEngine. -        if (mOverlays == null || mHwcScreenDecorationSupport != null) { +        if (mOverlays == null) {              return;          } -        ColorStateList tintList = ColorStateList.valueOf(mTintColor); -        mRoundedCornerResDelegate.setColorTintList(tintList); - -        Integer[] roundedCornerIds = { -                R.id.rounded_corner_top_left, -                R.id.rounded_corner_top_right, -                R.id.rounded_corner_bottom_left, -                R.id.rounded_corner_bottom_right -        }; - +        // When the hwc supports screen decorations, the layer will use the A8 color mode which +        // won't be affected by the color inversion. If the composition goes the client composition +        // route, the color inversion will be handled by the RenderEngine. +        final Set<Integer> viewsMayNeedColorUpdate = new HashSet<>(); +        if (mHwcScreenDecorationSupport == null) { +            ColorStateList tintList = ColorStateList.valueOf(mTintColor); +            mRoundedCornerResDelegate.setColorTintList(tintList); +            viewsMayNeedColorUpdate.add(R.id.rounded_corner_top_left); +            viewsMayNeedColorUpdate.add(R.id.rounded_corner_top_right); +            viewsMayNeedColorUpdate.add(R.id.rounded_corner_bottom_left); +            viewsMayNeedColorUpdate.add(R.id.rounded_corner_bottom_right); +            viewsMayNeedColorUpdate.add(R.id.display_cutout); +        } +        if (getOverlayView(mFaceScanningViewId) != null) { +            viewsMayNeedColorUpdate.add(mFaceScanningViewId); +        } +        final Integer[] views = new Integer[viewsMayNeedColorUpdate.size()]; +        viewsMayNeedColorUpdate.toArray(views);          for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) {              if (mOverlays[i] == null) {                  continue; @@ -914,12 +982,13 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              View child;              for (int j = 0; j < size; j++) {                  child = overlayView.getChildAt(j); -                if (child instanceof DisplayCutoutView) { +                if (viewsMayNeedColorUpdate.contains(child.getId()) +                        && child instanceof DisplayCutoutView) {                      ((DisplayCutoutView) child).setColor(mTintColor);                  }              } -            mOverlays[i].onReloadResAndMeasure(roundedCornerIds, mProviderRefreshToken, mRotation, -                    mDisplayUniqueId); +            mOverlays[i].onReloadResAndMeasure(views, mProviderRefreshToken, +                    mRotation, mDisplayUniqueId);          }      } @@ -971,8 +1040,20 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab      public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {          pw.println("ScreenDecorations state:");          pw.println("  DEBUG_DISABLE_SCREEN_DECORATIONS:" + DEBUG_DISABLE_SCREEN_DECORATIONS); +        if (DEBUG_DISABLE_SCREEN_DECORATIONS) { +            return; +        } +          pw.println("  mIsPrivacyDotEnabled:" + isPrivacyDotEnabled()); -        pw.println("  isOnlyPrivacyDotInSwLayer:" + isOnlyPrivacyDotInSwLayer()); +        pw.println("  shouldOptimizeOverlayVisibility:" + shouldOptimizeVisibility()); +        final boolean supportsShowingFaceScanningAnim = mFaceScanningFactory.getHasProviders(); +        pw.println("    supportsShowingFaceScanningAnim:" + supportsShowingFaceScanningAnim); +        if (supportsShowingFaceScanningAnim) { +            pw.println("      canShowFaceScanningAnim:" +                    + mFaceScanningFactory.canShowFaceScanningAnim()); +            pw.println("      shouldShowFaceScanningAnim (at time dump was taken):" +                    + mFaceScanningFactory.shouldShowFaceScanningAnim()); +        }          pw.println("  mPendingConfigChange:" + mPendingConfigChange);          if (mHwcScreenDecorationSupport != null) {              pw.println("  mHwcScreenDecorationSupport:"); @@ -1041,6 +1122,14 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              // update all provider views inside overlay              updateOverlayProviderViews();          } + +        FaceScanningOverlay faceScanningOverlay = +                (FaceScanningOverlay) getOverlayView(mFaceScanningViewId); +        if (faceScanningOverlay != null) { +            faceScanningOverlay.setFaceScanningAnimColor( +                    Utils.getColorAttrDefaultColor(faceScanningOverlay.getContext(), +                            com.android.systemui.R.attr.wallpaperTextColorAccent)); +        }      }      private boolean hasRoundedCorners() { @@ -1074,6 +1163,11 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab          return isPrivacyDotEnabled() && isDefaultShownOverlayPos(pos, cutout);      } +    private boolean shouldShowSwLayerFaceScan(@BoundsPosition int pos, +            @Nullable DisplayCutout cutout) { +        return mFaceScanningFactory.getHasProviders() && isDefaultShownOverlayPos(pos, cutout); +    } +      private boolean shouldShowSwLayerCutout(@BoundsPosition int pos,              @Nullable DisplayCutout cutout) {          final Rect[] bounds = cutout == null ? null : cutout.getBoundingRectsAll(); @@ -1082,8 +1176,8 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab                  && mHwcScreenDecorationSupport == null);      } -    private boolean isOnlyPrivacyDotInSwLayer() { -        return isPrivacyDotEnabled() +    private boolean shouldOptimizeVisibility() { +        return (isPrivacyDotEnabled() || mFaceScanningFactory.getHasProviders())                  && (mHwcScreenDecorationSupport != null                      || (!hasRoundedCorners() && !shouldDrawCutout())                  ); @@ -1197,9 +1291,9 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab      }      public static class DisplayCutoutView extends DisplayCutoutBaseView { -        private final List<Rect> mBounds = new ArrayList(); -        private final Rect mBoundingRect = new Rect(); -        private Rect mTotalBounds = new Rect(); +        final List<Rect> mBounds = new ArrayList(); +        final Rect mBoundingRect = new Rect(); +        Rect mTotalBounds = new Rect();          private int mColor = Color.BLACK;          private int mRotation; @@ -1209,6 +1303,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab          public DisplayCutoutView(Context context, @BoundsPosition int pos) {              super(context);              mInitialPosition = pos; +              paint.setColor(mColor);              paint.setStyle(Paint.Style.FILL);              setId(R.id.display_cutout); @@ -1253,11 +1348,15 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              } else {                  newVisible = GONE;              } -            if (newVisible != getVisibility()) { +            if (updateVisOnUpdateCutout() && newVisible != getVisibility()) {                  setVisibility(newVisible);              }          } +        protected boolean updateVisOnUpdateCutout() { +            return true; +        } +          private void updateBoundingPath() {              final Path path = displayInfo.displayCutout.getCutoutPath();              if (path != null) { @@ -1305,7 +1404,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab              }              if (showProtection) { -                // Make sure that our measured height encompases the protection +                // Make sure that our measured height encompasses the protection                  mTotalBounds.union(mBoundingRect);                  mTotalBounds.union((int) protectionRect.left, (int) protectionRect.top,                          (int) protectionRect.right, (int) protectionRect.bottom); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt index cd16379cd5b4..606a73a6ac38 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt @@ -36,12 +36,20 @@ open class AuthBiometricFingerprintIconController(      iconView: ImageView  ) : AuthIconController(context, iconView) { +    var iconLayoutParamsSize = 0 +        set(value) { +            if (field == value) { +                return +            } +            iconView.layoutParams.width = value +            iconView.layoutParams.height = value +            field = value +        } +      init { -        val size = context.resources.getDimensionPixelSize( +        iconLayoutParamsSize = context.resources.getDimensionPixelSize(              R.dimen.biometric_dialog_fingerprint_icon_size          ) -        iconView.layoutParams.width = size -        iconView.layoutParams.height = size      }      override fun updateIcon(@BiometricState lastState: Int, @BiometricState newState: Int) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.kt index 368bc3aadb70..24046f08e489 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.kt @@ -22,6 +22,7 @@ import android.util.Log  import android.widget.FrameLayout  import android.widget.TextView  import com.android.systemui.R +import com.android.systemui.biometrics.AuthController.ScaleFactorProvider  private const val TAG = "AuthBiometricFingerprintView" @@ -35,6 +36,7 @@ open class AuthBiometricFingerprintView(          private set      private var udfpsAdapter: UdfpsDialogMeasureAdapter? = null +    private var scaleFactorProvider: ScaleFactorProvider? = null      /** Set the [sensorProps] of this sensor so the view can be customized prior to layout. */      fun setSensorProperties(sensorProps: FingerprintSensorPropertiesInternal) { @@ -42,9 +44,15 @@ open class AuthBiometricFingerprintView(          udfpsAdapter = if (isUdfps) UdfpsDialogMeasureAdapter(this, sensorProps) else null      } +    fun setScaleFactorProvider(scaleProvider: ScaleFactorProvider?) { +        scaleFactorProvider = scaleProvider +    } +      override fun onMeasureInternal(width: Int, height: Int): AuthDialog.LayoutParams {          val layoutParams = super.onMeasureInternal(width, height) -        return udfpsAdapter?.onMeasureInternal(width, height, layoutParams) ?: layoutParams +        val scale = scaleFactorProvider?.provide() ?: 1.0f +        return udfpsAdapter?.onMeasureInternal(width, height, layoutParams, +            scale) ?: layoutParams      }      override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { @@ -80,6 +88,13 @@ open class AuthBiometricFingerprintView(      override fun createIconController(): AuthIconController =          AuthBiometricFingerprintIconController(mContext, mIconView) +    fun updateOverrideIconLayoutParamsSize() { +        udfpsAdapter?.let { +            (mIconController as? AuthBiometricFingerprintIconController)?.iconLayoutParamsSize = +                    it.getSensorDiameter(scaleFactorProvider?.provide() ?: 1.0f) +        } +    } +      override fun onAttachedToWindow() {          super.onAttachedToWindow()          showTouchSensorString() diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java index 1413f4a81574..d7ae9ef841bf 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java @@ -59,7 +59,7 @@ import java.util.Set;  /**   * Contains the Biometric views (title, subtitle, icon, buttons, etc.) and its controllers.   */ -public class AuthBiometricView extends LinearLayout { +public abstract class AuthBiometricView extends LinearLayout {      private static final String TAG = "AuthBiometricView"; @@ -116,7 +116,7 @@ public class AuthBiometricView extends LinearLayout {          void onAction(int action);      } -    protected final Handler mHandler; +    private final Handler mHandler;      private final AccessibilityManager mAccessibilityManager;      private final LockPatternUtils mLockPatternUtils;      protected final int mTextColorError; @@ -155,8 +155,8 @@ public class AuthBiometricView extends LinearLayout {      // Measurements when biometric view is showing text, buttons, etc.      @Nullable @VisibleForTesting AuthDialog.LayoutParams mLayoutParams; -    protected Callback mCallback; -    protected @BiometricState int mState; +    private Callback mCallback; +    @BiometricState private int mState;      private float mIconOriginalY; @@ -166,6 +166,8 @@ public class AuthBiometricView extends LinearLayout {      private final Runnable mResetErrorRunnable;      private final Runnable mResetHelpRunnable; +    private Animator.AnimatorListener mJankListener; +      private final OnClickListener mBackgroundClickListener = (view) -> {          if (mState == STATE_AUTHENTICATED) {              Log.w(TAG, "Ignoring background click after authenticated"); @@ -250,18 +252,9 @@ public class AuthBiometricView extends LinearLayout {          return false;      } -    /** -     * Create the controller for managing the icons transitions during the prompt. -     * -     * Subclass should override. -     */ +    /** Create the controller for managing the icons transitions during the prompt.*/      @NonNull -    protected AuthIconController createIconController() { -        return new AuthIconController(mContext, mIconView) { -            @Override -            public void updateIcon(int lastState, int newState) {} -        }; -    } +    protected abstract AuthIconController createIconController();      void setPanelController(AuthPanelController panelController) {          mPanelController = panelController; @@ -291,6 +284,10 @@ public class AuthBiometricView extends LinearLayout {          mRequireConfirmation = requireConfirmation && supportsRequireConfirmation();      } +    void setJankListener(Animator.AnimatorListener jankListener) { +        mJankListener = jankListener; +    } +      @VisibleForTesting      final void updateSize(@AuthDialog.DialogSize int newSize) {          Log.v(TAG, "Current size: " + mSize + " New size: " + newSize); @@ -381,6 +378,9 @@ public class AuthBiometricView extends LinearLayout {                  }              }); +            if (mJankListener != null) { +                as.addListener(mJankListener); +            }              as.play(iconAnimator).with(opacityAnimator);              as.start();              // Animate the panel @@ -436,6 +436,9 @@ public class AuthBiometricView extends LinearLayout {              animators.add(translationAnimator);              animators.add(opacityAnimator); +            if (mJankListener != null) { +                as.addListener(mJankListener); +            }              as.playTogether(animators);              as.setDuration(mAnimationDurationLong * 2 / 3);              as.start(); @@ -881,4 +884,14 @@ public class AuthBiometricView extends LinearLayout {      @AuthDialog.DialogSize int getSize() {          return mSize;      } + +    /** If authentication has successfully occurred and the view is done. */ +    boolean isAuthenticated() { +        return mState == STATE_AUTHENTICATED; +    } + +    /** If authentication is currently in progress. */ +    boolean isAuthenticating() { +        return mState == STATE_AUTHENTICATING; +    }  } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java index 6da2f50aac27..bc1c5f4baceb 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java @@ -19,6 +19,9 @@ package com.android.systemui.biometrics;  import static android.hardware.biometrics.BiometricManager.BIOMETRIC_MULTI_SENSOR_DEFAULT;  import static android.hardware.biometrics.BiometricManager.BiometricMultiSensorMode; +import static com.android.internal.jank.InteractionJankMonitor.CUJ_BIOMETRIC_PROMPT_TRANSITION; + +import android.animation.Animator;  import android.annotation.DurationMillisLong;  import android.annotation.IntDef;  import android.annotation.NonNull; @@ -53,13 +56,16 @@ import android.widget.LinearLayout;  import android.widget.ScrollView;  import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.jank.InteractionJankMonitor;  import com.android.internal.widget.LockPatternUtils;  import com.android.systemui.R;  import com.android.systemui.animation.Interpolators; +import com.android.systemui.biometrics.AuthController.ScaleFactorProvider;  import com.android.systemui.dagger.qualifiers.Background;  import com.android.systemui.keyguard.WakefulnessLifecycle;  import com.android.systemui.util.concurrency.DelayableExecutor; +import java.io.PrintWriter;  import java.lang.annotation.Retention;  import java.lang.annotation.RetentionPolicy;  import java.util.HashSet; @@ -84,6 +90,13 @@ public class AuthContainerView extends LinearLayout      private static final int STATE_ANIMATING_OUT = 4;      private static final int STATE_GONE = 5; +    /** Shows biometric prompt dialog animation. */ +    private static final String SHOW = "show"; +    /** Dismiss biometric prompt dialog animation.  */ +    private static final String DISMISS = "dismiss"; +    /** Transit biometric prompt dialog to pin, password, pattern credential panel. */ +    private static final String TRANSIT = "transit"; +      @Retention(RetentionPolicy.SOURCE)      @IntDef({STATE_UNKNOWN, STATE_ANIMATING_IN, STATE_PENDING_DISMISS, STATE_SHOWING,              STATE_ANIMATING_OUT, STATE_GONE}) @@ -98,6 +111,7 @@ public class AuthContainerView extends LinearLayout      private final CredentialCallback mCredentialCallback;      private final LockPatternUtils mLockPatternUtils;      private final WakefulnessLifecycle mWakefulnessLifecycle; +    private final InteractionJankMonitor mInteractionJankMonitor;      @VisibleForTesting final BiometricCallback mBiometricCallback; @@ -133,6 +147,7 @@ public class AuthContainerView extends LinearLayout          long mRequestId = -1;          boolean mSkipAnimation = false;          @BiometricMultiSensorMode int mMultiSensorConfig = BIOMETRIC_MULTI_SENSOR_DEFAULT; +        ScaleFactorProvider mScaleProvider;      }      public static class Builder { @@ -196,15 +211,22 @@ public class AuthContainerView extends LinearLayout              return this;          } +        public Builder setScaleFactorProvider(ScaleFactorProvider scaleProvider) { +            mConfig.mScaleProvider = scaleProvider; +            return this; +        } +          public AuthContainerView build(@Background DelayableExecutor bgExecutor, int[] sensorIds,                  @Nullable List<FingerprintSensorPropertiesInternal> fpProps,                  @Nullable List<FaceSensorPropertiesInternal> faceProps,                  @NonNull WakefulnessLifecycle wakefulnessLifecycle,                  @NonNull UserManager userManager, -                @NonNull LockPatternUtils lockPatternUtils) { +                @NonNull LockPatternUtils lockPatternUtils, +                @NonNull InteractionJankMonitor jankMonitor) {              mConfig.mSensorIds = sensorIds;              return new AuthContainerView(mConfig, fpProps, faceProps, wakefulnessLifecycle, -                    userManager, lockPatternUtils, new Handler(Looper.getMainLooper()), bgExecutor); +                    userManager, lockPatternUtils, jankMonitor, new Handler(Looper.getMainLooper()), +                    bgExecutor);          }      } @@ -257,6 +279,7 @@ public class AuthContainerView extends LinearLayout              @NonNull WakefulnessLifecycle wakefulnessLifecycle,              @NonNull UserManager userManager,              @NonNull LockPatternUtils lockPatternUtils, +            @NonNull InteractionJankMonitor jankMonitor,              @NonNull Handler mainHandler,              @NonNull @Background DelayableExecutor bgExecutor) {          super(config.mContext); @@ -283,6 +306,7 @@ public class AuthContainerView extends LinearLayout          mPanelView = mFrameLayout.findViewById(R.id.panel);          mPanelController = new AuthPanelController(mContext, mPanelView);          mBackgroundExecutor = bgExecutor; +        mInteractionJankMonitor = jankMonitor;          // Inflate biometric view only if necessary.          if (Utils.isBiometricAllowed(mConfig.mPromptInfo)) { @@ -296,12 +320,16 @@ public class AuthContainerView extends LinearLayout                          (AuthBiometricFingerprintAndFaceView) layoutInflater.inflate(                                  R.layout.auth_biometric_fingerprint_and_face_view, null, false);                  fingerprintAndFaceView.setSensorProperties(fpProperties); +                fingerprintAndFaceView.setScaleFactorProvider(config.mScaleProvider); +                fingerprintAndFaceView.updateOverrideIconLayoutParamsSize();                  mBiometricView = fingerprintAndFaceView;              } else if (fpProperties != null) {                  final AuthBiometricFingerprintView fpView =                          (AuthBiometricFingerprintView) layoutInflater.inflate(                                  R.layout.auth_biometric_fingerprint_view, null, false);                  fpView.setSensorProperties(fpProperties); +                fpView.setScaleFactorProvider(config.mScaleProvider); +                fpView.updateOverrideIconLayoutParamsSize();                  mBiometricView = fpView;              } else if (faceProperties != null) {                  mBiometricView = (AuthBiometricFaceView) layoutInflater.inflate( @@ -320,6 +348,8 @@ public class AuthContainerView extends LinearLayout              mBiometricView.setBackgroundView(mBackgroundView);              mBiometricView.setUserId(mConfig.mUserId);              mBiometricView.setEffectiveUserId(mEffectiveUserId); +            mBiometricView.setJankListener(getJankListener(mBiometricView, TRANSIT, +                    AuthDialog.ANIMATE_MEDIUM_TO_LARGE_DURATION_MS));          }          // TODO: De-dupe the logic with AuthCredentialPasswordView @@ -447,6 +477,7 @@ public class AuthContainerView extends LinearLayout                          .translationY(0)                          .setDuration(animateDuration)                          .setInterpolator(mLinearOutSlowIn) +                        .setListener(getJankListener(mPanelView, SHOW, animateDuration))                          .withLayer()                          .withEndAction(this::onDialogAnimatedIn)                          .start(); @@ -454,6 +485,7 @@ public class AuthContainerView extends LinearLayout                          .translationY(0)                          .setDuration(animateDuration)                          .setInterpolator(mLinearOutSlowIn) +                        .setListener(getJankListener(mBiometricScrollView, SHOW, animateDuration))                          .withLayer()                          .start();                  if (mCredentialView != null && mCredentialView.isAttachedToWindow()) { @@ -462,6 +494,7 @@ public class AuthContainerView extends LinearLayout                              .translationY(0)                              .setDuration(animateDuration)                              .setInterpolator(mLinearOutSlowIn) +                            .setListener(getJankListener(mCredentialView, SHOW, animateDuration))                              .withLayer()                              .start();                  } @@ -470,11 +503,49 @@ public class AuthContainerView extends LinearLayout                          .setDuration(animateDuration)                          .setInterpolator(mLinearOutSlowIn)                          .withLayer() +                        .setListener(getJankListener(this, SHOW, animateDuration))                          .start();              });          }      } +    private Animator.AnimatorListener getJankListener(View v, String type, long timeout) { +        return new Animator.AnimatorListener() { +            @Override +            public void onAnimationStart(@androidx.annotation.NonNull Animator animation) { +                if (!v.isAttachedToWindow()) { +                    Log.w(TAG, "Un-attached view should not begin Jank trace."); +                    return; +                } +                mInteractionJankMonitor.begin(InteractionJankMonitor.Configuration.Builder.withView( +                        CUJ_BIOMETRIC_PROMPT_TRANSITION, v).setTag(type).setTimeout(timeout)); +            } + +            @Override +            public void onAnimationEnd(@androidx.annotation.NonNull Animator animation) { +                if (!v.isAttachedToWindow()) { +                    Log.w(TAG, "Un-attached view should not end Jank trace."); +                    return; +                } +                mInteractionJankMonitor.end(CUJ_BIOMETRIC_PROMPT_TRANSITION); +            } + +            @Override +            public void onAnimationCancel(@androidx.annotation.NonNull Animator animation) { +                if (!v.isAttachedToWindow()) { +                    Log.w(TAG, "Un-attached view should not cancel Jank trace."); +                    return; +                } +                mInteractionJankMonitor.cancel(CUJ_BIOMETRIC_PROMPT_TRANSITION); +            } + +            @Override +            public void onAnimationRepeat(@androidx.annotation.NonNull Animator animation) { +                // no-op +            } +        }; +    } +      private static boolean shouldUpdatePositionForUdfps(@NonNull View view) {          if (view instanceof AuthBiometricFingerprintView) {              return ((AuthBiometricFingerprintView) view).isUdfps(); @@ -658,6 +729,7 @@ public class AuthContainerView extends LinearLayout                      .translationY(mTranslationY)                      .setDuration(animateDuration)                      .setInterpolator(mLinearOutSlowIn) +                    .setListener(getJankListener(mPanelView, DISMISS, animateDuration))                      .withLayer()                      .withEndAction(endActionRunnable)                      .start(); @@ -665,6 +737,7 @@ public class AuthContainerView extends LinearLayout                      .translationY(mTranslationY)                      .setDuration(animateDuration)                      .setInterpolator(mLinearOutSlowIn) +                    .setListener(getJankListener(mBiometricScrollView, DISMISS, animateDuration))                      .withLayer()                      .start();              if (mCredentialView != null && mCredentialView.isAttachedToWindow()) { @@ -672,6 +745,7 @@ public class AuthContainerView extends LinearLayout                          .translationY(mTranslationY)                          .setDuration(animateDuration)                          .setInterpolator(mLinearOutSlowIn) +                        .setListener(getJankListener(mCredentialView, DISMISS, animateDuration))                          .withLayer()                          .start();              } @@ -679,6 +753,7 @@ public class AuthContainerView extends LinearLayout                      .alpha(0f)                      .setDuration(animateDuration)                      .setInterpolator(mLinearOutSlowIn) +                    .setListener(getJankListener(this, DISMISS, animateDuration))                      .withLayer()                      .start();          }); @@ -739,4 +814,36 @@ public class AuthContainerView extends LinearLayout          lp.token = windowToken;          return lp;      } + +    @Override +    public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { +        pw.println("    isAttachedToWindow=" + isAttachedToWindow()); +        pw.println("    containerState=" + mContainerState); +        pw.println("    pendingCallbackReason=" + mPendingCallbackReason); +        pw.println("    config exist=" + (mConfig != null)); +        if (mConfig != null) { +            pw.println("    config.sensorIds exist=" + (mConfig.mSensorIds != null)); +        } +        final AuthBiometricView biometricView = mBiometricView; +        pw.println("    scrollView=" + findViewById(R.id.biometric_scrollview)); +        pw.println("      biometricView=" + biometricView); +        if (biometricView != null) { +            int[] ids = { +                    R.id.title, +                    R.id.subtitle, +                    R.id.description, +                    R.id.biometric_icon_frame, +                    R.id.biometric_icon, +                    R.id.indicator, +                    R.id.button_bar, +                    R.id.button_negative, +                    R.id.button_use_credential, +                    R.id.button_confirm, +                    R.id.button_try_again +            }; +            for (final int id: ids) { +                pw.println("        " + biometricView.findViewById(id)); +            } +        } +    }  } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index 17396469c10a..a097c5e76149 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -62,6 +62,7 @@ import android.view.WindowManager;  import com.android.internal.R;  import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.jank.InteractionJankMonitor;  import com.android.internal.os.SomeArgs;  import com.android.internal.widget.LockPatternUtils;  import com.android.systemui.CoreStartable; @@ -75,6 +76,7 @@ import com.android.systemui.statusbar.CommandQueue;  import com.android.systemui.util.concurrency.DelayableExecutor;  import com.android.systemui.util.concurrency.Execution; +import java.io.PrintWriter;  import java.util.ArrayList;  import java.util.Arrays;  import java.util.HashSet; @@ -143,6 +145,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba      private boolean mAllFingerprintAuthenticatorsRegistered;      @NonNull private final UserManager mUserManager;      @NonNull private final LockPatternUtils mLockPatternUtils; +    @NonNull private final InteractionJankMonitor mInteractionJankMonitor;      private final @Background DelayableExecutor mBackgroundExecutor;      @VisibleForTesting @@ -489,6 +492,9 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba          final float scaleFactor = android.util.DisplayUtils.getPhysicalPixelDisplaySizeRatio(                  mStableDisplaySize.x, mStableDisplaySize.y, displayInfo.getNaturalWidth(),                  displayInfo.getNaturalHeight()); +        if (scaleFactor == Float.POSITIVE_INFINITY) { +            return new PointF(mFaceAuthSensorLocation.x, mFaceAuthSensorLocation.y); +        }          return new PointF(mFaceAuthSensorLocation.x * scaleFactor,                  mFaceAuthSensorLocation.y * scaleFactor);      } @@ -549,6 +555,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba              @NonNull UserManager userManager,              @NonNull LockPatternUtils lockPatternUtils,              @NonNull StatusBarStateController statusBarStateController, +            @NonNull InteractionJankMonitor jankMonitor,              @Main Handler handler,              @Background DelayableExecutor bgExecutor) {          super(context); @@ -566,6 +573,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba          mSidefpsControllerFactory = sidefpsControllerFactory;          mDisplayManager = displayManager;          mWindowManager = windowManager; +        mInteractionJankMonitor = jankMonitor;          mUdfpsEnrolledForUser = new SparseBooleanArray();          mOrientationListener = new BiometricDisplayListener( @@ -1037,8 +1045,36 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba                  .setOperationId(operationId)                  .setRequestId(requestId)                  .setMultiSensorConfig(multiSensorConfig) +                .setScaleFactorProvider(() -> { +                    return getScaleFactor(); +                })                  .build(bgExecutor, sensorIds, mFpProps, mFaceProps, wakefulnessLifecycle, -                        userManager, lockPatternUtils); +                        userManager, lockPatternUtils, mInteractionJankMonitor); +    } + +    @Override +    public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { +        final AuthDialog dialog = mCurrentDialog; +        pw.println("  stableDisplaySize=" + mStableDisplaySize); +        pw.println("  faceAuthSensorLocation=" + mFaceAuthSensorLocation); +        pw.println("  fingerprintLocation=" + mFingerprintLocation); +        pw.println("  udfpsBounds=" + mUdfpsBounds); +        pw.println("  allFingerprintAuthenticatorsRegistered=" +                + mAllFingerprintAuthenticatorsRegistered); +        pw.println("  currentDialog=" + dialog); +        if (dialog != null) { +            dialog.dump(pw, args); +        } +    } + +    /** +     * Provides a float that represents the resolution scale(if the controller is for UDFPS). +     */ +    public interface ScaleFactorProvider { +        /** +         * Returns a float representing the scaled resolution(if the controller if for UDFPS). +         */ +        float provide();      }      /** diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java index 4ff19f6adc11..51f39b358659 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java @@ -23,13 +23,15 @@ import android.hardware.biometrics.BiometricAuthenticator.Modality;  import android.os.Bundle;  import android.view.WindowManager; +import com.android.systemui.Dumpable; +  import java.lang.annotation.Retention;  import java.lang.annotation.RetentionPolicy;  /**   * Interface for the biometric dialog UI.   */ -public interface AuthDialog { +public interface AuthDialog extends Dumpable {      String KEY_CONTAINER_GOING_AWAY = "container_going_away";      String KEY_BIOMETRIC_SHOWING = "biometric_showing"; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index 86e501670440..38fab8ffbfad 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -23,7 +23,6 @@ import android.content.Context  import android.graphics.PointF  import android.hardware.biometrics.BiometricFingerprintConstants  import android.hardware.biometrics.BiometricSourceType -import android.util.DisplayMetrics  import android.util.Log  import androidx.annotation.VisibleForTesting  import com.android.keyguard.KeyguardUpdateMonitor @@ -46,7 +45,6 @@ import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.Cent  import com.android.systemui.statusbar.policy.ConfigurationController  import com.android.systemui.statusbar.policy.KeyguardStateController  import com.android.systemui.util.ViewController -import com.android.systemui.util.leak.RotationUtils  import java.io.PrintWriter  import javax.inject.Inject  import javax.inject.Provider @@ -127,17 +125,37 @@ class AuthRippleController @Inject constructor(          }          updateSensorLocation() -        if (biometricSourceType == BiometricSourceType.FINGERPRINT && -            fingerprintSensorLocation != null) { -            mView.setFingerprintSensorLocation(fingerprintSensorLocation!!, udfpsRadius) -            showUnlockedRipple() -        } else if (biometricSourceType == BiometricSourceType.FACE && -            faceSensorLocation != null) { -            if (!bypassController.canBypass()) { +        if (biometricSourceType == BiometricSourceType.FINGERPRINT) { +            fingerprintSensorLocation?.let { +                mView.setFingerprintSensorLocation(it, udfpsRadius) +                circleReveal = CircleReveal( +                        it.x, +                        it.y, +                        0f, +                        Math.max( +                                Math.max(it.x, centralSurfaces.displayWidth - it.x), +                                Math.max(it.y, centralSurfaces.displayHeight - it.y) +                        ) +                ) +                showUnlockedRipple() +            } +        } else if (biometricSourceType == BiometricSourceType.FACE) { +            if (!bypassController.canBypass() && !authController.isUdfpsFingerDown) {                  return              } -            mView.setSensorLocation(faceSensorLocation!!) -            showUnlockedRipple() +            faceSensorLocation?.let { +                mView.setSensorLocation(it) +                circleReveal = CircleReveal( +                        it.x, +                        it.y, +                        0f, +                        Math.max( +                                Math.max(it.x, centralSurfaces.displayWidth - it.x), +                                Math.max(it.y, centralSurfaces.displayHeight - it.y) +                        ) +                ) +                showUnlockedRipple() +            }          }      } @@ -209,48 +227,8 @@ class AuthRippleController @Inject constructor(      }      fun updateSensorLocation() { -        updateFingerprintLocation() +        fingerprintSensorLocation = authController.fingerprintSensorLocation          faceSensorLocation = authController.faceAuthSensorLocation -        fingerprintSensorLocation?.let { -            circleReveal = CircleReveal( -                it.x, -                it.y, -                0f, -                Math.max( -                    Math.max(it.x, centralSurfaces.displayWidth - it.x), -                    Math.max(it.y, centralSurfaces.displayHeight - it.y) -                ) -            ) -        } -    } - -    private fun updateFingerprintLocation() { -        val displayMetrics = DisplayMetrics() -        sysuiContext.display?.getRealMetrics(displayMetrics) -        val width = displayMetrics.widthPixels -        val height = displayMetrics.heightPixels - -        authController.fingerprintSensorLocation?.let { -            fingerprintSensorLocation = when (RotationUtils.getRotation(sysuiContext)) { -                RotationUtils.ROTATION_LANDSCAPE -> { -                    val normalizedYPos: Float = it.y / width -                    val normalizedXPos: Float = it.x / height -                    PointF(width * normalizedYPos, height * (1 - normalizedXPos)) -                } -                RotationUtils.ROTATION_UPSIDE_DOWN -> { -                    PointF(width - it.x, height - it.y) -                } -                RotationUtils.ROTATION_SEASCAPE -> { -                    val normalizedYPos: Float = it.y / width -                    val normalizedXPos: Float = it.x / height -                    PointF(width * (1 - normalizedYPos), height * normalizedXPos) -                } -                else -> { -                    // ROTATION_NONE -                    PointF(it.x, it.y) -                } -            } -        }      }      private fun updateRippleColor() { @@ -372,6 +350,7 @@ class AuthRippleController @Inject constructor(                          showUnlockRipple(BiometricSourceType.FINGERPRINT)                      }                      "face" -> { +                        // note: only shows when about to proceed to the home screen                          updateSensorLocation()                          pw.println("face ripple sensorLocation=$faceSensorLocation")                          showUnlockRipple(BiometricSourceType.FACE) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 6e2dcae4728e..fb502e5b72cc 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -20,6 +20,7 @@ import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPR  import static android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_KEYGUARD;  import static com.android.internal.util.Preconditions.checkNotNull; +import static com.android.systemui.classifier.Classifier.LOCK_ICON;  import static com.android.systemui.classifier.Classifier.UDFPS_AUTHENTICATION;  import android.annotation.NonNull; @@ -167,11 +168,16 @@ public class UdfpsController implements DozeReceiver {      private final Set<Callback> mCallbacks = new HashSet<>();      @VisibleForTesting -    public static final VibrationAttributes VIBRATION_ATTRIBUTES = +    public static final VibrationAttributes UDFPS_VIBRATION_ATTRIBUTES =              new VibrationAttributes.Builder()                      // vibration will bypass battery saver mode:                      .setUsage(VibrationAttributes.USAGE_COMMUNICATION_REQUEST)                      .build(); +    @VisibleForTesting +    public static final VibrationAttributes LOCK_ICON_VIBRATION_ATTRIBUTES = +            new VibrationAttributes.Builder() +                    .setUsage(VibrationAttributes.USAGE_TOUCH) +                    .build();      // haptic to use for successful device entry      public static final VibrationEffect EFFECT_CLICK = @@ -671,7 +677,7 @@ public class UdfpsController implements DozeReceiver {                      mContext.getOpPackageName(),                      EFFECT_CLICK,                      "udfps-onStart-click", -                    VIBRATION_ATTRIBUTES); +                    UDFPS_VIBRATION_ATTRIBUTES);          }      } @@ -748,7 +754,19 @@ public class UdfpsController implements DozeReceiver {          }          if (!mKeyguardUpdateMonitor.isFingerprintDetectionRunning()) { +            if (mFalsingManager.isFalseTouch(LOCK_ICON)) { +                Log.v(TAG, "aod lock icon long-press rejected by the falsing manager."); +                return; +            }              mKeyguardViewManager.showBouncer(true); + +            // play the same haptic as the LockIconViewController longpress +            mVibrator.vibrate( +                    Process.myUid(), +                    mContext.getOpPackageName(), +                    UdfpsController.EFFECT_CLICK, +                    "aod-lock-icon-longpress", +                    LOCK_ICON_VIBRATION_ATTRIBUTES);              return;          } @@ -841,6 +859,11 @@ public class UdfpsController implements DozeReceiver {              mBiometricExecutor.execute(() -> {                  mAlternateTouchProvider.onPointerDown(requestId, x, y, minor, major);              }); +            mFgExecutor.execute(() -> { +                if (mKeyguardUpdateMonitor.isFingerprintDetectionRunning()) { +                    mKeyguardUpdateMonitor.onUdfpsPointerDown((int) requestId); +                } +            });          } else {              mFingerprintManager.onPointerDown(requestId, mSensorId, x, y, minor, major);          } @@ -856,7 +879,6 @@ public class UdfpsController implements DozeReceiver {                  } else {                      mFingerprintManager.onUiReady(requestId, mSensorId);                      mLatencyTracker.onActionEnd(LatencyTracker.ACTION_UDFPS_ILLUMINATE); -                  }              });          } @@ -875,6 +897,11 @@ public class UdfpsController implements DozeReceiver {                  mBiometricExecutor.execute(() -> {                      mAlternateTouchProvider.onPointerUp(requestId);                  }); +                mFgExecutor.execute(() -> { +                    if (mKeyguardUpdateMonitor.isFingerprintDetectionRunning()) { +                        mKeyguardUpdateMonitor.onUdfpsPointerUp((int) requestId); +                    } +                });              } else {                  mFingerprintManager.onPointerUp(requestId, mSensorId);              } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapter.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapter.java index 8de721352069..43745bf74aae 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapter.java @@ -64,15 +64,16 @@ public class UdfpsDialogMeasureAdapter {      @NonNull      AuthDialog.LayoutParams onMeasureInternal( -            int width, int height, @NonNull AuthDialog.LayoutParams layoutParams) { +            int width, int height, @NonNull AuthDialog.LayoutParams layoutParams, +            float scaleFactor) {          final int displayRotation = mView.getDisplay().getRotation();          switch (displayRotation) {              case Surface.ROTATION_0: -                return onMeasureInternalPortrait(width, height); +                return onMeasureInternalPortrait(width, height, scaleFactor);              case Surface.ROTATION_90:              case Surface.ROTATION_270: -                return onMeasureInternalLandscape(width, height); +                return onMeasureInternalLandscape(width, height, scaleFactor);              default:                  Log.e(TAG, "Unsupported display rotation: " + displayRotation);                  return layoutParams; @@ -89,8 +90,16 @@ public class UdfpsDialogMeasureAdapter {          return mBottomSpacerHeight;      } +    /** +     * @return sensor diameter size as scaleFactor +     */ +    public int getSensorDiameter(float scaleFactor) { +        return (int) (scaleFactor * mSensorProps.getLocation().sensorRadius * 2); +    } +      @NonNull -    private AuthDialog.LayoutParams onMeasureInternalPortrait(int width, int height) { +    private AuthDialog.LayoutParams onMeasureInternalPortrait(int width, int height, +            float scaleFactor) {          final WindowMetrics windowMetrics = mWindowManager.getMaximumWindowMetrics();          // Figure out where the bottom of the sensor anim should be. @@ -101,12 +110,12 @@ public class UdfpsDialogMeasureAdapter {          final Insets navbarInsets = getNavbarInsets(windowMetrics);          mBottomSpacerHeight = calculateBottomSpacerHeightForPortrait(                  mSensorProps, displayHeight, textIndicatorHeight, buttonBarHeight, -                dialogMargin, navbarInsets.bottom); +                dialogMargin, navbarInsets.bottom, scaleFactor);          // Go through each of the children and do the custom measurement.          int totalHeight = 0;          final int numChildren = mView.getChildCount(); -        final int sensorDiameter = mSensorProps.getLocation().sensorRadius * 2; +        final int sensorDiameter = getSensorDiameter(scaleFactor);          for (int i = 0; i < numChildren; i++) {              final View child = mView.getChildAt(i);              if (child.getId() == R.id.biometric_icon_frame) { @@ -176,7 +185,8 @@ public class UdfpsDialogMeasureAdapter {      }      @NonNull -    private AuthDialog.LayoutParams onMeasureInternalLandscape(int width, int height) { +    private AuthDialog.LayoutParams onMeasureInternalLandscape(int width, int height, +            float scaleFactor) {          final WindowMetrics windowMetrics = mWindowManager.getMaximumWindowMetrics();          // Find the spacer height needed to vertically align the icon with the sensor. @@ -197,9 +207,9 @@ public class UdfpsDialogMeasureAdapter {          final int dialogMargin = getDialogMarginPx();          final int horizontalInset = navbarInsets.left + navbarInsets.right;          final int horizontalSpacerWidth = calculateHorizontalSpacerWidthForLandscape( -                mSensorProps, displayWidth, dialogMargin, horizontalInset); +                mSensorProps, displayWidth, dialogMargin, horizontalInset, scaleFactor); -        final int sensorDiameter = mSensorProps.getLocation().sensorRadius * 2; +        final int sensorDiameter = getSensorDiameter(scaleFactor);          final int remeasuredWidth = sensorDiameter + 2 * horizontalSpacerWidth;          int remeasuredHeight = 0; @@ -281,11 +291,11 @@ public class UdfpsDialogMeasureAdapter {      static int calculateBottomSpacerHeightForPortrait(              @NonNull FingerprintSensorPropertiesInternal sensorProperties, int displayHeightPx,              int textIndicatorHeightPx, int buttonBarHeightPx, int dialogMarginPx, -            int navbarBottomInsetPx) { +            int navbarBottomInsetPx, float scaleFactor) {          final SensorLocationInternal location = sensorProperties.getLocation();          final int sensorDistanceFromBottom = displayHeightPx -                - location.sensorLocationY -                - location.sensorRadius; +                - (int) (scaleFactor * location.sensorLocationY) +                - (int) (scaleFactor * location.sensorRadius);          final int spacerHeight = sensorDistanceFromBottom                  - textIndicatorHeightPx @@ -298,7 +308,8 @@ public class UdfpsDialogMeasureAdapter {                      + ", Distance from bottom: " + sensorDistanceFromBottom                      + ", Bottom margin: " + dialogMarginPx                      + ", Navbar bottom inset: " + navbarBottomInsetPx -                    + ", Bottom spacer height (portrait): " + spacerHeight); +                    + ", Bottom spacer height (portrait): " + spacerHeight +                    + ", Scale Factor: " + scaleFactor);          }          return spacerHeight; @@ -346,11 +357,11 @@ public class UdfpsDialogMeasureAdapter {      @VisibleForTesting      static int calculateHorizontalSpacerWidthForLandscape(              @NonNull FingerprintSensorPropertiesInternal sensorProperties, int displayWidthPx, -            int dialogMarginPx, int navbarHorizontalInsetPx) { +            int dialogMarginPx, int navbarHorizontalInsetPx, float scaleFactor) {          final SensorLocationInternal location = sensorProperties.getLocation();          final int sensorDistanceFromEdge = displayWidthPx -                - location.sensorLocationY -                - location.sensorRadius; +                - (int) (scaleFactor * location.sensorLocationY) +                - (int) (scaleFactor * location.sensorRadius);          final int horizontalPadding = sensorDistanceFromEdge                  - dialogMarginPx @@ -361,7 +372,8 @@ public class UdfpsDialogMeasureAdapter {                      + ", Distance from edge: " + sensorDistanceFromEdge                      + ", Dialog margin: " + dialogMarginPx                      + ", Navbar horizontal inset: " + navbarHorizontalInsetPx -                    + ", Horizontal spacer width (landscape): " + horizontalPadding); +                    + ", Horizontal spacer width (landscape): " + horizontalPadding +                    + ", Scale Factor: " + scaleFactor);          }          return horizontalPadding; diff --git a/packages/SystemUI/src/com/android/systemui/decor/DecorProvider.kt b/packages/SystemUI/src/com/android/systemui/decor/DecorProvider.kt index 03ee8b11ab41..169b50edccfc 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/DecorProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/DecorProvider.kt @@ -79,4 +79,16 @@ abstract class CornerDecorProvider : DecorProvider() {      override val alignedBounds: List<Int> by lazy {          listOf(alignedBound1, alignedBound2)      } -}
\ No newline at end of file +} + +/** + * A provider for view shown on bound. + */ +abstract class BoundDecorProvider : DecorProvider() { +    /** The bound which a view is aligned based on rotation 0 */ +    @DisplayCutout.BoundsPosition protected abstract val alignedBound: Int + +    override val alignedBounds: List<Int> by lazy { +        listOf(alignedBound) +    } +} diff --git a/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt new file mode 100644 index 000000000000..81d3d6caebd7 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.decor + +import android.content.Context +import android.util.Log +import android.view.DisplayCutout +import android.view.DisplayCutout.BOUNDS_POSITION_BOTTOM +import android.view.DisplayCutout.BOUNDS_POSITION_LEFT +import android.view.DisplayCutout.BOUNDS_POSITION_RIGHT +import android.view.DisplayCutout.BOUNDS_POSITION_TOP +import android.view.DisplayInfo +import android.view.Gravity +import android.view.Surface +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.systemui.FaceScanningOverlay +import com.android.systemui.biometrics.AuthController +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags +import com.android.systemui.plugins.statusbar.StatusBarStateController +import java.util.concurrent.Executor +import javax.inject.Inject + +@SysUISingleton +class FaceScanningProviderFactory @Inject constructor( +    private val authController: AuthController, +    private val context: Context, +    private val statusBarStateController: StatusBarStateController, +    private val keyguardUpdateMonitor: KeyguardUpdateMonitor, +    @Main private val mainExecutor: Executor, +    private val featureFlags: FeatureFlags +) : DecorProviderFactory() { +    private val display = context.display +    private val displayInfo = DisplayInfo() + +    override val hasProviders: Boolean +        get() { +            if (!featureFlags.isEnabled(Flags.FACE_SCANNING_ANIM) || +                    authController.faceAuthSensorLocation == null) { +                return false +            } + +            // update display info +            display?.getDisplayInfo(displayInfo) ?: run { +                Log.w(TAG, "display is null, can't update displayInfo") +            } +            return DisplayCutout.getFillBuiltInDisplayCutout( +                    context.resources, displayInfo.uniqueId) +        } + +    override val providers: List<DecorProvider> +        get() { +            if (!hasProviders) { +                return emptyList() +            } + +            return ArrayList<DecorProvider>().also { list -> +                // displayInfo must be updated before using it; however it will already have +                // been updated when accessing the hasProviders field above +                displayInfo.displayCutout?.getBoundBaseOnCurrentRotation()?.let { bounds -> +                    // Add a face scanning view for each screen orientation. +                    // Cutout drawing is updated in ScreenDecorations#updateCutout +                    for (bound in bounds) { +                        list.add( +                                FaceScanningOverlayProviderImpl( +                                        bound.baseOnRotation0(displayInfo.rotation), +                                        authController, +                                        statusBarStateController, +                                        keyguardUpdateMonitor, +                                        mainExecutor +                                ) +                        ) +                    } +                } +            } +        } + +    fun canShowFaceScanningAnim(): Boolean { +        return hasProviders && keyguardUpdateMonitor.isFaceEnrolled +    } + +    fun shouldShowFaceScanningAnim(): Boolean { +        return canShowFaceScanningAnim() && keyguardUpdateMonitor.isFaceScanning +    } +} + +class FaceScanningOverlayProviderImpl( +    override val alignedBound: Int, +    private val authController: AuthController, +    private val statusBarStateController: StatusBarStateController, +    private val keyguardUpdateMonitor: KeyguardUpdateMonitor, +    private val mainExecutor: Executor +) : BoundDecorProvider() { +    override val viewId: Int = com.android.systemui.R.id.face_scanning_anim + +    override fun onReloadResAndMeasure( +        view: View, +        reloadToken: Int, +        rotation: Int, +        displayUniqueId: String? +    ) { +        (view.layoutParams as FrameLayout.LayoutParams).let { +            updateLayoutParams(it, rotation) +            view.layoutParams = it +        } +    } + +    override fun inflateView( +        context: Context, +        parent: ViewGroup, +        @Surface.Rotation rotation: Int +    ): View { +        val view = FaceScanningOverlay( +                context, +                alignedBound, +                statusBarStateController, +                keyguardUpdateMonitor, +                mainExecutor +        ) +        view.id = viewId +        FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, +                ViewGroup.LayoutParams.MATCH_PARENT).let { +            updateLayoutParams(it, rotation) +            parent.addView(view, it) +        } +        return view +    } + +    private fun updateLayoutParams( +        layoutParams: FrameLayout.LayoutParams, +        @Surface.Rotation rotation: Int +    ) { +        layoutParams.let { lp -> +            lp.width = ViewGroup.LayoutParams.MATCH_PARENT +            lp.height = ViewGroup.LayoutParams.MATCH_PARENT +            authController.faceAuthSensorLocation?.y?.let { faceAuthSensorHeight -> +                val faceScanningHeight = (faceAuthSensorHeight * 2).toInt() +                when (rotation) { +                    Surface.ROTATION_0, Surface.ROTATION_180 -> +                        lp.height = faceScanningHeight +                    Surface.ROTATION_90, Surface.ROTATION_270 -> +                        lp.width = faceScanningHeight +                } +            } + +            lp.gravity = when (rotation) { +                Surface.ROTATION_0 -> Gravity.TOP or Gravity.START +                Surface.ROTATION_90 -> Gravity.LEFT or Gravity.START +                Surface.ROTATION_180 -> Gravity.BOTTOM or Gravity.END +                Surface.ROTATION_270 -> Gravity.RIGHT or Gravity.END +                else -> -1 /* invalid rotation */ +            } +        } +    } +} + +fun DisplayCutout.getBoundBaseOnCurrentRotation(): List<Int> { +    return ArrayList<Int>().also { +        if (!boundingRectLeft.isEmpty) { +            it.add(BOUNDS_POSITION_LEFT) +        } +        if (!boundingRectTop.isEmpty) { +            it.add(BOUNDS_POSITION_TOP) +        } +        if (!boundingRectRight.isEmpty) { +            it.add(BOUNDS_POSITION_RIGHT) +        } +        if (!boundingRectBottom.isEmpty) { +            it.add(BOUNDS_POSITION_BOTTOM) +        } +    } +} + +fun Int.baseOnRotation0(@DisplayCutout.BoundsPosition currentRotation: Int): Int { +    return when (currentRotation) { +        Surface.ROTATION_0 -> this +        Surface.ROTATION_90 -> when (this) { +            BOUNDS_POSITION_LEFT -> BOUNDS_POSITION_TOP +            BOUNDS_POSITION_TOP -> BOUNDS_POSITION_RIGHT +            BOUNDS_POSITION_RIGHT -> BOUNDS_POSITION_BOTTOM +            else /* BOUNDS_POSITION_BOTTOM */ -> BOUNDS_POSITION_LEFT +        } +        Surface.ROTATION_270 -> when (this) { +            BOUNDS_POSITION_LEFT -> BOUNDS_POSITION_BOTTOM +            BOUNDS_POSITION_TOP -> BOUNDS_POSITION_LEFT +            BOUNDS_POSITION_RIGHT -> BOUNDS_POSITION_TOP +            else /* BOUNDS_POSITION_BOTTOM */ -> BOUNDS_POSITION_RIGHT +        } +        else /* Surface.ROTATION_180 */ -> when (this) { +            BOUNDS_POSITION_LEFT -> BOUNDS_POSITION_RIGHT +            BOUNDS_POSITION_TOP -> BOUNDS_POSITION_BOTTOM +            BOUNDS_POSITION_RIGHT -> BOUNDS_POSITION_LEFT +            else /* BOUNDS_POSITION_BOTTOM */ -> BOUNDS_POSITION_TOP +        } +    } +} + +private const val TAG = "FaceScanningProvider" diff --git a/packages/SystemUI/src/com/android/systemui/decor/PrivacyDotDecorProviderFactory.kt b/packages/SystemUI/src/com/android/systemui/decor/PrivacyDotDecorProviderFactory.kt index 136f135af759..9f624b3dcb09 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/PrivacyDotDecorProviderFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/PrivacyDotDecorProviderFactory.kt @@ -28,6 +28,10 @@ import com.android.systemui.dagger.SysUISingleton  import com.android.systemui.dagger.qualifiers.Main  import javax.inject.Inject +/** + * Provides privacy dot views for each orientation. The PrivacyDot orientation and visibility + * of the privacy dot views are controlled by the PrivacyDotViewController. + */  @SysUISingleton  class PrivacyDotDecorProviderFactory @Inject constructor(      @Main private val res: Resources diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index c8720e409883..da6c163b1eea 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -183,7 +183,8 @@ public class DozeSensors {                          mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION),                          null /* setting */,                          dozeParameters.getPulseOnSigMotion(), -                        DozeLog.PULSE_REASON_SENSOR_SIGMOTION, false /* touchCoords */, +                        DozeLog.PULSE_REASON_SENSOR_SIGMOTION, +                        false /* touchCoords */,                          false /* touchscreen */),                  new TriggerSensor(                          mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE), @@ -193,7 +194,8 @@ public class DozeSensors {                          DozeLog.REASON_SENSOR_PICKUP, false /* touchCoords */,                          false /* touchscreen */,                          false /* ignoresSetting */, -                        false /* requires prox */), +                        false /* requires prox */, +                        true /* immediatelyReRegister */),                  new TriggerSensor(                          findSensor(config.doubleTapSensorType()),                          Settings.Secure.DOZE_DOUBLE_TAP_GESTURE, @@ -211,6 +213,7 @@ public class DozeSensors {                          true /* touchscreen */,                          false /* ignoresSetting */,                          dozeParameters.singleTapUsesProx(mDevicePosture) /* requiresProx */, +                        true /* immediatelyReRegister */,                          mDevicePosture),                  new TriggerSensor(                          findSensor(config.longPressSensorType()), @@ -221,7 +224,8 @@ public class DozeSensors {                          true /* reports touch coordinates */,                          true /* touchscreen */,                          false /* ignoresSetting */, -                        dozeParameters.longPressUsesProx() /* requiresProx */), +                        dozeParameters.longPressUsesProx() /* requiresProx */, +                        true /* immediatelyReRegister */),                  new TriggerSensor(                          findSensor(config.udfpsLongPressSensorType()),                          "doze_pulse_on_auth", @@ -231,7 +235,8 @@ public class DozeSensors {                          true /* reports touch coordinates */,                          true /* touchscreen */,                          false /* ignoresSetting */, -                        dozeParameters.longPressUsesProx()), +                        dozeParameters.longPressUsesProx(), +                        false /* immediatelyReRegister */),                  new PluginSensor(                          new SensorManagerPlugin.Sensor(TYPE_WAKE_DISPLAY),                          Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE, @@ -257,7 +262,8 @@ public class DozeSensors {                          false /* requiresTouchCoordinates */,                          false /* requiresTouchscreen */,                          false /* ignoresSetting */, -                        false /* requiresProx */), +                        false /* requiresProx */, +                        true /* immediatelyReRegister */),          };          setProxListening(false);  // Don't immediately start listening when we register.          mProximitySensor.register( @@ -493,6 +499,10 @@ public class DozeSensors {          private final boolean mRequiresTouchscreen;          private final boolean mRequiresProx; +        // Whether to immediately re-register this sensor after the sensor is triggered. +        // If false, the sensor registration will be updated on the next AOD state transition. +        private final boolean mImmediatelyReRegister; +          protected boolean mRequested;          protected boolean mRegistered;          protected boolean mDisabled; @@ -516,7 +526,8 @@ public class DozeSensors {                      reportsTouchCoordinates,                      requiresTouchscreen,                      false /* ignoresSetting */, -                    false /* requiresProx */ +                    false /* requiresProx */, +                    true /* immediatelyReRegister */              );          } @@ -529,7 +540,8 @@ public class DozeSensors {                  boolean reportsTouchCoordinates,                  boolean requiresTouchscreen,                  boolean ignoresSetting, -                boolean requiresProx +                boolean requiresProx, +                boolean immediatelyReRegister          ) {              this(                      new Sensor[]{ sensor }, @@ -541,6 +553,7 @@ public class DozeSensors {                      requiresTouchscreen,                      ignoresSetting,                      requiresProx, +                    immediatelyReRegister,                      DevicePostureController.DEVICE_POSTURE_UNKNOWN              );          } @@ -555,6 +568,7 @@ public class DozeSensors {                  boolean requiresTouchscreen,                  boolean ignoresSetting,                  boolean requiresProx, +                boolean immediatelyReRegister,                  @DevicePostureController.DevicePostureInt int posture          ) {              mSensors = sensors; @@ -567,6 +581,7 @@ public class DozeSensors {              mIgnoresSetting = ignoresSetting;              mRequiresProx = requiresProx;              mPosture = posture; +            mImmediatelyReRegister = immediatelyReRegister;          }          /** @@ -702,8 +717,8 @@ public class DozeSensors {                      screenY = event.values[1];                  }                  mSensorCallback.onSensorPulse(mPulseReason, screenX, screenY, event.values); -                if (!mRegistered) { -                    updateListening();  // reregister, this sensor only fires once +                if (!mRegistered && mImmediatelyReRegister) { +                    updateListening();                  }              }));          } diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.java b/packages/SystemUI/src/com/android/systemui/flags/Flags.java index c43dd9041a50..2c798307c196 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.java +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.java @@ -80,6 +80,9 @@ public class Flags {      public static final ResourceBooleanFlag BOUNCER_USER_SWITCHER =              new ResourceBooleanFlag(204, R.bool.config_enableBouncerUserSwitcher); +    public static final ResourceBooleanFlag FACE_SCANNING_ANIM = +            new ResourceBooleanFlag(205, R.bool.config_enableFaceScanningAnimation); +      /***************************************/      // 300 - power menu      public static final BooleanFlag POWER_MENU_LITE = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt index c686b48278a3..5ffc3f101c6f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt @@ -169,7 +169,8 @@ class KeyguardUnlockAnimationController @Inject constructor(              playingCannedAnimation: Boolean,              fromWakeAndUnlock: Boolean,              unlockAnimationStartDelay: Long, -            unlockAnimationDuration: Long) {} +            unlockAnimationDuration: Long +        ) {}          /**           * Called when the remote unlock animation ends, in all cases, canned or swipe-to-unlock. @@ -308,8 +309,12 @@ class KeyguardUnlockAnimationController @Inject constructor(                      // call onKeyguardExitRemoteAnimationFinished since that will hide the keyguard                      // and unlock the device as well as hiding the surface.                      if (surfaceBehindAlpha == 0f) { +                        Log.d(TAG, "surfaceBehindAlphaAnimator#onAnimationEnd")                          keyguardViewMediator.get().finishSurfaceBehindRemoteAnimation(                              false /* cancelled */) +                    } else { +                        Log.d(TAG, "skip finishSurfaceBehindRemoteAnimation" + +                                " surfaceBehindAlpha=$surfaceBehindAlpha")                      }                  }              }) @@ -325,6 +330,7 @@ class KeyguardUnlockAnimationController @Inject constructor(              }              addListener(object : AnimatorListenerAdapter() {                  override fun onAnimationEnd(animation: Animator) { +                    Log.d(TAG, "surfaceBehindEntryAnimator#onAnimationEnd")                      playingCannedUnlockAnimation = false                      keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished(                          false /* cancelled */ @@ -361,7 +367,6 @@ class KeyguardUnlockAnimationController @Inject constructor(                  // the animations since they won't be visible.                  !notificationShadeWindowController.isLaunchingActivity &&                  launcherUnlockController != null && -                !keyguardStateController.isDismissingFromSwipe &&                  // Temporarily disable for foldables since foldable launcher has two first pages,                  // which breaks the in-window animation.                  !isFoldable(context) @@ -372,8 +377,8 @@ class KeyguardUnlockAnimationController @Inject constructor(       * changed.       */      override fun onKeyguardGoingAwayChanged() { -        if (keyguardStateController.isKeyguardGoingAway -            && !statusBarStateController.leaveOpenOnKeyguardHide()) { +        if (keyguardStateController.isKeyguardGoingAway && +                !statusBarStateController.leaveOpenOnKeyguardHide()) {              prepareForInWindowLauncherAnimations()          }      } @@ -427,7 +432,7 @@ class KeyguardUnlockAnimationController @Inject constructor(              launcherUnlockController?.prepareForUnlock(                  willUnlockWithSmartspaceTransition, /* willAnimateSmartspace */                  lockscreenSmartspaceBounds, /* lockscreenSmartspaceBounds */ -                selectedPage, /* selectedPage */ +                selectedPage /* selectedPage */              )          } catch (e: RemoteException) {              Log.e(TAG, "Remote exception in prepareForInWindowUnlockAnimations.", e) @@ -466,16 +471,34 @@ class KeyguardUnlockAnimationController @Inject constructor(          // If we specifically requested that the surface behind be made visible (vs. it being made          // visible because we're unlocking), then we're in the middle of a swipe-to-unlock touch -        // gesture and the surface behind the keyguard should be made visible. +        // gesture and the surface behind the keyguard should be made visible so that we can animate +        // it in.          if (requestedShowSurfaceBehindKeyguard) { -            // Fade in the surface, as long as we're not now flinging. The touch gesture ending in -            // a fling during the time it takes the keyguard exit animation to start is an edge -            // case race condition, and we'll handle it by playing a canned animation on the -            // now-visible surface to finish unlocking. -            if (!keyguardStateController.isFlingingToDismissKeyguard) { -                fadeInSurfaceBehind() -            } else { + +            // If we're flinging to dismiss here, it means the touch gesture ended in a fling during +            // the time it takes the keyguard exit animation to start. This is an edge case race +            // condition, which we handle by just playing a canned animation on the now-visible +            // surface behind the keyguard to finish unlocking. +            if (keyguardStateController.isFlingingToDismissKeyguard) {                  playCannedUnlockAnimation() +            } else if (keyguardStateController.isDismissingFromSwipe +                    && willUnlockWithInWindowLauncherAnimations) { +                // If we're swiping to unlock to the Launcher, and can play in-window animations, +                // make the launcher surface fully visible and play the in-window unlock animation +                // on the launcher icons. System UI will remain locked, using the swipe-to-unlock +                // translation logic on the launcher window, until the swipe gesture ends (either in +                // a successful unlock, or an aborted unlock). +                surfaceBehindAlpha = 1f +                setSurfaceBehindAppearAmount(1f) + +                launcherUnlockController?.playUnlockAnimation( +                        true, +                        UNLOCK_ANIMATION_DURATION_MS + CANNED_UNLOCK_START_DELAY, +                        0 /* startDelay */) +            } else { +                // Otherwise, we're swiping in an app and should just fade it in. The swipe gesture +                // will translate it until the end of the swipe gesture. +                fadeInSurfaceBehind()              }          } else {              // The surface was made visible since we're unlocking not from a swipe (fingerprint, @@ -502,19 +525,23 @@ class KeyguardUnlockAnimationController @Inject constructor(       * by the dismiss amount via [onKeyguardDismissAmountChanged].       */      private fun playCannedUnlockAnimation() { +        Log.d(TAG, "playCannedUnlockAnimation")          playingCannedUnlockAnimation = true -          when {              // If we're set up for in-window launcher animations, ask Launcher to play its in-window              // canned animation. -            willUnlockWithInWindowLauncherAnimations -> unlockToLauncherWithInWindowAnimations() +            willUnlockWithInWindowLauncherAnimations -> { +                Log.d(TAG, "playCannedUnlockAnimation, unlockToLauncherWithInWindowAnimations") +                unlockToLauncherWithInWindowAnimations() +            }              // If we're waking and unlocking to a non-Launcher app surface (or Launcher in-window              // animations are not available), show it immediately and end the remote animation. The              // circular light reveal will show the app surface, and it looks weird if it's moving              // around behind that.              biometricUnlockControllerLazy.get().isWakeAndUnlock -> { +                Log.d(TAG, "playCannedUnlockAnimation, isWakeAndUnlock")                  setSurfaceBehindAppearAmount(1f)                  keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished(                      false /* cancelled */) @@ -522,7 +549,10 @@ class KeyguardUnlockAnimationController @Inject constructor(              // Otherwise, we're doing a normal full-window unlock. Start this animator, which will              // scale/translate the window underneath the lockscreen. -            else -> surfaceBehindEntryAnimator.start() +            else -> { +                Log.d(TAG, "playCannedUnlockAnimation, surfaceBehindEntryAnimator#start") +                surfaceBehindEntryAnimator.start() +            }          }      } @@ -687,10 +717,18 @@ class KeyguardUnlockAnimationController @Inject constructor(          // Otherwise, animate in the surface's scale/transltion.          val surfaceHeight: Int = surfaceBehindRemoteAnimationTarget!!.screenSpaceBounds.height() -        val scaleFactor = (SURFACE_BEHIND_START_SCALE_FACTOR + + +        var scaleFactor = (SURFACE_BEHIND_START_SCALE_FACTOR +                  (1f - SURFACE_BEHIND_START_SCALE_FACTOR) *                  MathUtils.clamp(amount, 0f, 1f)) +        // If we're dismissing via swipe to the Launcher, we'll play in-window scale animations, so +        // don't also scale the window. +        if (keyguardStateController.isDismissingFromSwipe +                && willUnlockWithInWindowLauncherAnimations) { +            scaleFactor = 1f +        } +          // Scale up from a point at the center-bottom of the surface.          surfaceBehindMatrix.setScale(              scaleFactor, @@ -774,16 +812,17 @@ class KeyguardUnlockAnimationController @Inject constructor(      }      private fun fadeInSurfaceBehind() { +        Log.d(TAG, "fadeInSurfaceBehind")          surfaceBehindAlphaAnimator.cancel()          surfaceBehindAlphaAnimator.start()      }      private fun fadeOutSurfaceBehind() { +        Log.d(TAG, "fadeOutSurfaceBehind")          surfaceBehindAlphaAnimator.cancel()          surfaceBehindAlphaAnimator.reverse()      } -      private fun shouldPerformSmartspaceTransition(): Boolean {          // Feature is disabled, so we don't want to.          if (!featureFlags.isEnabled(Flags.SMARTSPACE_SHARED_ELEMENT_TRANSITION_ENABLED)) { @@ -837,6 +876,12 @@ class KeyguardUnlockAnimationController @Inject constructor(              return false          } +        // If we're swiping to dismiss, the smartspace will be swiped off the top of the screen +        // so we can't shared element animate it. +        if (keyguardStateController.isDismissingFromSwipe) { +            return false +        } +          // We don't do the shared element on tablets because they're large and the smartspace has to          // fly across large distances, which is distracting.          if (Utilities.isTablet(context)) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index e13e42fbe3ad..85faf3bf991f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -635,13 +635,13 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,                  case TelephonyManager.SIM_STATE_PUK_REQUIRED:                      synchronized (KeyguardViewMediator.this) {                          mSimWasLocked.append(slotId, true); +                        mPendingPinLock = true;                          if (!mShowing) {                              if (DEBUG_SIM_STATES) Log.d(TAG,                                      "INTENT_VALUE_ICC_LOCKED and keygaurd isn't "                                      + "showing; need to show keyguard so user can enter sim pin");                              doKeyguardLocked(null);                          } else { -                            mPendingPinLock = true;                              resetStateLocked();                          }                      } @@ -2435,7 +2435,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,              RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers,              RemoteAnimationTarget[] nonApps, IRemoteAnimationFinishedCallback finishedCallback) {          Trace.beginSection("KeyguardViewMediator#handleStartKeyguardExitAnimation"); -        if (DEBUG) Log.d(TAG, "handleStartKeyguardExitAnimation startTime=" + startTime +        Log.d(TAG, "handleStartKeyguardExitAnimation startTime=" + startTime                  + " fadeoutDuration=" + fadeoutDuration);          synchronized (KeyguardViewMediator.this) { @@ -2631,7 +2631,11 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,       * @param cancelled {@code true} if the animation was cancelled before it finishes.       */      public void onKeyguardExitRemoteAnimationFinished(boolean cancelled) { +        Log.d(TAG, "onKeyguardExitRemoteAnimationFinished");          if (!mSurfaceBehindRemoteAnimationRunning && !mSurfaceBehindRemoteAnimationRequested) { +            Log.d(TAG, "skip onKeyguardExitRemoteAnimationFinished cancelled=" + cancelled +                    + " surfaceAnimationRunning=" + mSurfaceBehindRemoteAnimationRunning +                    + " surfaceAnimationRequested=" + mSurfaceBehindRemoteAnimationRequested);              return;          } @@ -2645,7 +2649,13 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,              onKeyguardExitFinished();              if (mKeyguardStateController.isDismissingFromSwipe() || wasShowing) { +                Log.d(TAG, "onKeyguardExitRemoteAnimationFinished" +                        + "#hideKeyguardViewAfterRemoteAnimation");                  mKeyguardUnlockAnimationControllerLazy.get().hideKeyguardViewAfterRemoteAnimation(); +            } else { +                Log.d(TAG, "skip hideKeyguardViewAfterRemoteAnimation" +                        + " dismissFromSwipe=" + mKeyguardStateController.isDismissingFromSwipe() +                        + " wasShowing=" + wasShowing);              }              finishSurfaceBehindRemoteAnimation(cancelled); @@ -2693,7 +2703,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,      /** Hides the surface behind the keyguard by re-showing the keyguard/activity lock screen. */      public void hideSurfaceBehindKeyguard() {          mSurfaceBehindRemoteAnimationRequested = false; - +        mKeyguardStateController.notifyKeyguardGoingAway(false);          if (mShowing) {              setShowingLocked(true, true);          } @@ -2985,6 +2995,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,          pw.print("  mPendingReset: "); pw.println(mPendingReset);          pw.print("  mPendingLock: "); pw.println(mPendingLock);          pw.print("  wakeAndUnlocking: "); pw.println(mWakeAndUnlocking); +        pw.print("  mPendingPinLock: "); pw.println(mPendingPinLock);      }      /** diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt index db343e52b3ca..4c2336eeb22c 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -18,13 +18,11 @@ package com.android.systemui.media  import android.app.Notification  import android.app.PendingIntent -import android.app.UriGrantsManager  import android.app.smartspace.SmartspaceConfig  import android.app.smartspace.SmartspaceManager  import android.app.smartspace.SmartspaceSession  import android.app.smartspace.SmartspaceTarget  import android.content.BroadcastReceiver -import android.content.ContentProvider  import android.content.ContentResolver  import android.content.Context  import android.content.Intent @@ -594,13 +592,10 @@ class MediaDataManager(              Log.d(TAG, "adding track for $userId from browser: $desc")          } -        val currentEntry = mediaEntries.get(packageName) -        val appUid = currentEntry?.appUid ?: Process.INVALID_UID -          // Album art          var artworkBitmap = desc.iconBitmap          if (artworkBitmap == null && desc.iconUri != null) { -            artworkBitmap = loadBitmapFromUriForUser(desc.iconUri!!, userId, appUid, packageName) +            artworkBitmap = loadBitmapFromUri(desc.iconUri!!)          }          val artworkIcon = if (artworkBitmap != null) {              Icon.createWithBitmap(artworkBitmap) @@ -608,7 +603,9 @@ class MediaDataManager(              null          } +        val currentEntry = mediaEntries.get(packageName)          val instanceId = currentEntry?.instanceId ?: logger.getNewInstanceId() +        val appUid = currentEntry?.appUid ?: Process.INVALID_UID          val mediaAction = getResumeMediaAction(resumeAction)          val lastActive = systemClock.elapsedRealtime() @@ -1003,30 +1000,6 @@ class MediaDataManager(              false          }      } - -    /** Returns a bitmap if the user can access the given URI, else null */ -    private fun loadBitmapFromUriForUser( -        uri: Uri, -        userId: Int, -        appUid: Int, -        packageName: String, -    ): Bitmap? { -        try { -            val ugm = UriGrantsManager.getService() -            ugm.checkGrantUriPermission_ignoreNonSystem( -                appUid, -                packageName, -                ContentProvider.getUriWithoutUserId(uri), -                Intent.FLAG_GRANT_READ_URI_PERMISSION, -                ContentProvider.getUserIdFromUri(uri, userId) -            ) -            return loadBitmapFromUri(uri) -        } catch (e: SecurityException) { -            Log.e(TAG, "Failed to get URI permission: $e") -        } -        return null -    } -      /**       * Load a bitmap from a URI       * @param uri the uri to load diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt index 54b0c1345601..7cc52e428218 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt @@ -106,6 +106,7 @@ abstract class MediaTttChipControllerCommon<T : ChipInfoCommon>(                  PowerManager.WAKE_REASON_APPLICATION,                  "com.android.systemui:media_tap_to_transfer_activated"              ) +            animateChipIn(currentChipView)          }          // Cancel and re-set the chip timeout each time we get a new state. @@ -138,6 +139,12 @@ abstract class MediaTttChipControllerCommon<T : ChipInfoCommon>(      abstract fun updateChipView(chipInfo: T, currentChipView: ViewGroup)      /** +     * A method that can be implemented by subclcasses to do custom animations for when the chip +     * appears. +     */ +    open fun animateChipIn(chipView: ViewGroup) {} + +    /**       * Returns the size that the icon should be, or null if no size override is needed.       */      open fun getIconSize(isAppIcon: Boolean): Int? = null diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt index 9f5ec7e1a330..54b4380e2443 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt @@ -27,6 +27,8 @@ import android.view.WindowManager  import android.widget.TextView  import com.android.internal.statusbar.IUndoMediaTransferCallback  import com.android.systemui.R +import com.android.systemui.animation.Interpolators +import com.android.systemui.animation.ViewHierarchyAnimator  import com.android.systemui.dagger.SysUISingleton  import com.android.systemui.dagger.qualifiers.Main  import com.android.systemui.media.taptotransfer.common.ChipInfoCommon @@ -124,7 +126,6 @@ class MediaTttChipControllerSender @Inject constructor(          currentChipView.requireViewById<View>(R.id.loading).visibility =              chipState.isMidTransfer.visibleIfTrue() -          // Undo          val undoView = currentChipView.requireViewById<View>(R.id.undo)          val undoClickListener = chipState.undoClickListener( @@ -138,6 +139,17 @@ class MediaTttChipControllerSender @Inject constructor(              chipState.isTransferFailure.visibleIfTrue()      } +    override fun animateChipIn(chipView: ViewGroup) { +        ViewHierarchyAnimator.animateAddition( +            chipView.requireViewById<ViewGroup>(R.id.media_ttt_sender_chip_inner), +            ViewHierarchyAnimator.Hotspot.TOP, +            Interpolators.EMPHASIZED_DECELERATE, +            duration = 500L, +            includeMargins = true, +            includeFadeIn = true, +        ) +    } +      override fun removeChip(removalReason: String) {          // Don't remove the chip if we're mid-transfer since the user should still be able to          // see the status of the transfer. (But do remove it if it's finally timed out.) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index fcd9e10089bc..bf83ad6bff74 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -110,6 +110,11 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D      private Context mUserContext;      private UserTracker mUserTracker;      private SecureSettings mSecureSettings; +    // Keep track of whether mTilesList contains the same information as the Settings value. +    // This is a performance optimization to reduce the number of blocking calls to Settings from +    // main thread. +    // This is enforced by only cleaning the flag at the end of a successful run of #onTuningChanged +    private boolean mTilesListDirty = true;      private final TileServiceRequestController mTileServiceRequestController;      private TileLifecycleManager.Factory mTileLifeCycleManagerFactory; @@ -374,6 +379,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D                  // the ones that are in the setting, update the Setting.                  saveTilesToSettings(mTileSpecs);              } +            mTilesListDirty = false;              for (int i = 0; i < mCallbacks.size(); i++) {                  mCallbacks.get(i).onTilesChanged();              } @@ -437,6 +443,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D      } +    // When calling this, you may want to modify mTilesListDirty accordingly.      @MainThread      private void saveTilesToSettings(List<String> tileSpecs) {          mSecureSettings.putStringForUser(TILES_SETTING, TextUtils.join(",", tileSpecs), @@ -446,9 +453,15 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D      @MainThread      private void changeTileSpecs(Predicate<List<String>> changeFunction) { -        final String setting = mSecureSettings.getStringForUser(TILES_SETTING, mCurrentUser); -        final List<String> tileSpecs = loadTileSpecs(mContext, setting); +        final List<String> tileSpecs; +        if (!mTilesListDirty) { +            tileSpecs = new ArrayList<>(mTileSpecs); +        } else { +            tileSpecs = loadTileSpecs(mContext, +                    mSecureSettings.getStringForUser(TILES_SETTING, mCurrentUser)); +        }          if (changeFunction.test(tileSpecs)) { +            mTilesListDirty = true;              saveTilesToSettings(tileSpecs);          }      } @@ -508,6 +521,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D              }          }          if (DEBUG) Log.d(TAG, "saveCurrentTiles " + newTiles); +        mTilesListDirty = true;          saveTilesToSettings(newTiles);      } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java index f4a257fdd3ec..50ee1f7ba97a 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java @@ -135,12 +135,7 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {                  // Since Quick Share target recommendation does not rely on image URL, it is                  // queried and surfaced before image compress/export. Action intent would not be                  // used, because it does not contain image URL. -                Notification.Action quickShare = -                        queryQuickShareAction(mScreenshotId, image, user, null); -                if (quickShare != null) { -                    mQuickShareData.quickShareAction = quickShare; -                    mParams.mQuickShareActionsReadyListener.onActionsReady(mQuickShareData); -                } +                queryQuickShareAction(image, user);              }              // Call synchronously here since already on a background thread. @@ -173,9 +168,8 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {              mImageData.shareTransition = createShareAction(mContext, mContext.getResources(), uri);              mImageData.editTransition = createEditAction(mContext, mContext.getResources(), uri);              mImageData.deleteAction = createDeleteAction(mContext, mContext.getResources(), uri); -            mImageData.quickShareAction = createQuickShareAction( -                    mQuickShareData.quickShareAction, mScreenshotId, uri, mImageTime, image, -                    user); +            mImageData.quickShareAction = createQuickShareAction(mContext, +                    mQuickShareData.quickShareAction, uri);              mParams.mActionsReadyListener.onActionsReady(mImageData);              if (DEBUG_CALLBACK) { @@ -415,73 +409,59 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {      }      /** -     * Wrap the quickshare intent and populate the fillin intent with the URI +     * Populate image uri into intent of Quick Share action.       */      @VisibleForTesting -    Notification.Action createQuickShareAction( -            Notification.Action quickShare, String screenshotId, Uri uri, long imageTime, -            Bitmap image, UserHandle user) { -        if (quickShare == null) { +    private Notification.Action createQuickShareAction(Context context, Notification.Action action, +            Uri uri) { +        if (action == null) {              return null; -        } else if (quickShare.actionIntent.isImmutable()) { -            Notification.Action quickShareWithUri = -                    queryQuickShareAction(screenshotId, image, user, uri); -            if (quickShareWithUri == null -                    || !quickShareWithUri.title.toString().contentEquals(quickShare.title)) { -                return null; -            } -            quickShare = quickShareWithUri;          } - -        Intent wrappedIntent = new Intent(mContext, SmartActionsReceiver.class) -                .putExtra(ScreenshotController.EXTRA_ACTION_INTENT, quickShare.actionIntent) -                .putExtra(ScreenshotController.EXTRA_ACTION_INTENT_FILLIN, -                        createFillInIntent(uri, imageTime)) -                .addFlags(Intent.FLAG_RECEIVER_FOREGROUND); -        Bundle extras = quickShare.getExtras(); -        String actionType = extras.getString( -                ScreenshotNotificationSmartActionsProvider.ACTION_TYPE, -                ScreenshotNotificationSmartActionsProvider.DEFAULT_ACTION_TYPE); -        addIntentExtras(screenshotId, wrappedIntent, actionType, mSmartActionsEnabled); -        PendingIntent broadcastIntent = -                PendingIntent.getBroadcast(mContext, mRandom.nextInt(), wrappedIntent, -                        PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); -        return new Notification.Action.Builder(quickShare.getIcon(), quickShare.title, -                broadcastIntent) -                .setContextual(true) -                .addExtras(extras) -                .build(); -    } - -    private Intent createFillInIntent(Uri uri, long imageTime) { -        Intent fillIn = new Intent(); -        fillIn.setType("image/png"); -        fillIn.putExtra(Intent.EXTRA_STREAM, uri); -        String subjectDate = DateFormat.getDateTimeInstance().format(new Date(imageTime)); +        // Populate image URI into Quick Share chip intent +        Intent sharingIntent = action.actionIntent.getIntent(); +        sharingIntent.setType("image/png"); +        sharingIntent.putExtra(Intent.EXTRA_STREAM, uri); +        String subjectDate = DateFormat.getDateTimeInstance().format(new Date(mImageTime));          String subject = String.format(SCREENSHOT_SHARE_SUBJECT_TEMPLATE, subjectDate); -        fillIn.putExtra(Intent.EXTRA_SUBJECT, subject); +        sharingIntent.putExtra(Intent.EXTRA_SUBJECT, subject);          // Include URI in ClipData also, so that grantPermission picks it up.          // We don't use setData here because some apps interpret this as "to:". -        ClipData clipData = new ClipData( -                new ClipDescription("content", new String[]{"image/png"}), +        ClipData clipdata = new ClipData(new ClipDescription("content", +                new String[]{"image/png"}),                  new ClipData.Item(uri)); -        fillIn.setClipData(clipData); -        fillIn.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); -        return fillIn; +        sharingIntent.setClipData(clipdata); +        sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); +        PendingIntent updatedPendingIntent = PendingIntent.getActivity( +                context, 0, sharingIntent, +                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); + +        // Proxy smart actions through {@link SmartActionsReceiver} for logging smart actions. +        Bundle extras = action.getExtras(); +        String actionType = extras.getString( +                ScreenshotNotificationSmartActionsProvider.ACTION_TYPE, +                ScreenshotNotificationSmartActionsProvider.DEFAULT_ACTION_TYPE); +        Intent intent = new Intent(context, SmartActionsReceiver.class) +                .putExtra(ScreenshotController.EXTRA_ACTION_INTENT, updatedPendingIntent) +                .addFlags(Intent.FLAG_RECEIVER_FOREGROUND); +        addIntentExtras(mScreenshotId, intent, actionType, mSmartActionsEnabled); +        PendingIntent broadcastIntent = PendingIntent.getBroadcast(context, +                mRandom.nextInt(), +                intent, +                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); +        return new Notification.Action.Builder(action.getIcon(), action.title, +                broadcastIntent).setContextual(true).addExtras(extras).build();      }      /**       * Query and surface Quick Share chip if it is available. Action intent would not be used,       * because it does not contain image URL which would be populated in {@link -     * #createQuickShareAction(Notification.Action, String, Uri, long, Bitmap, UserHandle)} +     * #createQuickShareAction(Context, Notification.Action, Uri)}       */ - -    @VisibleForTesting -    Notification.Action queryQuickShareAction( -            String screenshotId, Bitmap image, UserHandle user, Uri uri) { +    private void queryQuickShareAction(Bitmap image, UserHandle user) {          CompletableFuture<List<Notification.Action>> quickShareActionsFuture =                  mScreenshotSmartActions.getSmartActionsFuture( -                        screenshotId, uri, image, mSmartActionsProvider, QUICK_SHARE_ACTION, +                        mScreenshotId, null, image, mSmartActionsProvider, +                        QUICK_SHARE_ACTION,                          mSmartActionsEnabled, user);          int timeoutMs = DeviceConfig.getInt(                  DeviceConfig.NAMESPACE_SYSTEMUI, @@ -489,11 +469,11 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {                  500);          List<Notification.Action> quickShareActions =                  mScreenshotSmartActions.getSmartActions( -                        screenshotId, quickShareActionsFuture, timeoutMs, +                        mScreenshotId, quickShareActionsFuture, timeoutMs,                          mSmartActionsProvider, QUICK_SHARE_ACTION);          if (!quickShareActions.isEmpty()) { -            return quickShareActions.get(0); +            mQuickShareData.quickShareAction = quickShareActions.get(0); +            mParams.mQuickShareActionsReadyListener.onActionsReady(mQuickShareData);          } -        return null;      }  } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java index e3089f859601..c213f192291a 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java @@ -234,7 +234,6 @@ public class ScreenshotController {      static final String EXTRA_SMART_ACTIONS_ENABLED = "android:smart_actions_enabled";      static final String EXTRA_OVERRIDE_TRANSITION = "android:screenshot_override_transition";      static final String EXTRA_ACTION_INTENT = "android:screenshot_action_intent"; -    static final String EXTRA_ACTION_INTENT_FILLIN = "android:screenshot_action_intent_fillin";      static final String SCREENSHOT_URI_ID = "android:screenshot_uri_id";      static final String EXTRA_CANCEL_NOTIFICATION = "android:screenshot_cancel_notification"; diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SmartActionsReceiver.java b/packages/SystemUI/src/com/android/systemui/screenshot/SmartActionsReceiver.java index ecc13ee747c8..f703058f4a0f 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/SmartActionsReceiver.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/SmartActionsReceiver.java @@ -18,7 +18,6 @@ package com.android.systemui.screenshot;  import static com.android.systemui.screenshot.LogConfig.DEBUG_ACTIONS;  import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ACTION_INTENT; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ACTION_INTENT_FILLIN;  import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ACTION_TYPE;  import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ID; @@ -47,9 +46,7 @@ public class SmartActionsReceiver extends BroadcastReceiver {      @Override      public void onReceive(Context context, Intent intent) { -        PendingIntent pendingIntent = -                intent.getParcelableExtra(EXTRA_ACTION_INTENT, PendingIntent.class); -        Intent fillIn = intent.getParcelableExtra(EXTRA_ACTION_INTENT_FILLIN, Intent.class); +        PendingIntent pendingIntent = intent.getParcelableExtra(EXTRA_ACTION_INTENT);          String actionType = intent.getStringExtra(EXTRA_ACTION_TYPE);          if (DEBUG_ACTIONS) {              Log.d(TAG, "Executing smart action [" + actionType + "]:" + pendingIntent.getIntent()); @@ -57,7 +54,7 @@ public class SmartActionsReceiver extends BroadcastReceiver {          ActivityOptions opts = ActivityOptions.makeBasic();          try { -            pendingIntent.send(context, 0, fillIn, null, null, null, opts.toBundle()); +            pendingIntent.send(context, 0, null, null, null, null, opts.toBundle());          } catch (PendingIntent.CanceledException e) {              Log.e(TAG, "Pending intent canceled", e);          } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 1fb771ef2991..9e029095ea6b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -50,6 +50,7 @@ import android.hardware.biometrics.BiometricSourceType;  import android.hardware.face.FaceManager;  import android.hardware.fingerprint.FingerprintManager;  import android.os.BatteryManager; +import android.os.Build;  import android.os.Handler;  import android.os.Looper;  import android.os.Message; @@ -61,6 +62,7 @@ import android.text.format.Formatter;  import android.util.Log;  import android.view.View;  import android.view.ViewGroup; +import android.view.accessibility.AccessibilityManager;  import androidx.annotation.Nullable; @@ -93,6 +95,8 @@ import com.android.systemui.util.wakelock.WakeLock;  import java.io.PrintWriter;  import java.text.NumberFormat; +import java.util.HashSet; +import java.util.Set;  import javax.inject.Inject; @@ -113,12 +117,12 @@ public class KeyguardIndicationController {      private static final String TAG = "KeyguardIndication";      private static final boolean DEBUG_CHARGING_SPEED = false; +    private static final boolean DEBUG = Build.IS_DEBUGGABLE;      private static final int MSG_HIDE_TRANSIENT = 1;      private static final int MSG_SHOW_ACTION_TO_UNLOCK = 2;      private static final int MSG_HIDE_BIOMETRIC_MESSAGE = 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 BroadcastDispatcher mBroadcastDispatcher; @@ -139,6 +143,7 @@ public class KeyguardIndicationController {      private final IActivityManager mIActivityManager;      private final FalsingManager mFalsingManager;      private final KeyguardBypassController mKeyguardBypassController; +    private final AccessibilityManager mAccessibilityManager;      private final Handler mHandler;      protected KeyguardIndicationRotateTextViewController mRotateTextViewController; @@ -167,6 +172,7 @@ public class KeyguardIndicationController {      private boolean mBatteryPresent = true;      private long mChargingTimeRemaining;      private String mMessageToShowOnScreenOn; +    private final Set<Integer> mCoExFaceHelpMsgIdsToShow;      private boolean mInited;      private KeyguardUpdateMonitorCallback mUpdateMonitorCallback; @@ -214,7 +220,8 @@ public class KeyguardIndicationController {              LockPatternUtils lockPatternUtils,              ScreenLifecycle screenLifecycle,              IActivityManager iActivityManager, -            KeyguardBypassController keyguardBypassController) { +            KeyguardBypassController keyguardBypassController, +            AccessibilityManager accessibilityManager) {          mContext = context;          mBroadcastDispatcher = broadcastDispatcher;          mDevicePolicyManager = devicePolicyManager; @@ -232,9 +239,17 @@ public class KeyguardIndicationController {          mIActivityManager = iActivityManager;          mFalsingManager = falsingManager;          mKeyguardBypassController = keyguardBypassController; +        mAccessibilityManager = accessibilityManager;          mScreenLifecycle = screenLifecycle;          mScreenLifecycle.addObserver(mScreenObserver); +        mCoExFaceHelpMsgIdsToShow = new HashSet<>(); +        int[] msgIds = context.getResources().getIntArray( +                com.android.systemui.R.array.config_face_help_msgs_when_fingerprint_enrolled); +        for (int msgId : msgIds) { +            mCoExFaceHelpMsgIdsToShow.add(msgId); +        } +          mHandler = new Handler(mainLooper) {              @Override              public void handleMessage(Message msg) { @@ -885,7 +900,9 @@ public class KeyguardIndicationController {                  mStatusBarKeyguardViewManager.showBouncerMessage(message, mInitialTextColorState);              }          } else { -            if (mKeyguardUpdateMonitor.isUdfpsSupported() +            if (!mAccessibilityManager.isEnabled() +                    && !mAccessibilityManager.isTouchExplorationEnabled() +                    && mKeyguardUpdateMonitor.isUdfpsSupported()                      && mKeyguardUpdateMonitor.getUserCanSkipBouncer(                      KeyguardUpdateMonitor.getCurrentUser())) {                  final int stringId = mKeyguardUpdateMonitor.getIsFaceAuthenticated() @@ -898,15 +915,6 @@ public class KeyguardIndicationController {          }      } -    private void showFaceFailedTryFingerprintMsg(int msgId, String a11yString) { -        showBiometricMessage(R.string.keyguard_face_failed_use_fp); - -        // Although we suppress face auth errors visually, we still announce them for a11y -        if (!TextUtils.isEmpty(a11yString)) { -            mLockScreenIndicationView.announceForAccessibility(a11yString); -        } -    } -      public void dump(PrintWriter pw, String[] args) {          pw.println("KeyguardIndicationController:");          pw.println("  mInitialTextColorState: " + mInitialTextColorState); @@ -925,6 +933,7 @@ public class KeyguardIndicationController {                  mTopIndicationView == null ? null : mTopIndicationView.getText()));          pw.println("  computePowerIndication(): " + computePowerIndication());          pw.println("  trustGrantedIndication: " + getTrustGrantedIndication()); +        pw.println("    mCoExFaceHelpMsgIdsToShow=" + mCoExFaceHelpMsgIdsToShow);          mRotateTextViewController.dump(pw, args);      } @@ -983,9 +992,20 @@ public class KeyguardIndicationController {                      .isUnlockingWithBiometricAllowed(true /* isStrongBiometric */)) {                  return;              } +              boolean showActionToUnlock =                      msgId == KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED; -            if (mStatusBarKeyguardViewManager.isBouncerShowing()) { +            if (biometricSourceType == BiometricSourceType.FACE +                    && !showActionToUnlock +                    && mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( +                            KeyguardUpdateMonitor.getCurrentUser()) +                    && !mCoExFaceHelpMsgIdsToShow.contains(msgId)) { +                if (DEBUG) { +                    Log.d(TAG, "skip showing msgId=" + msgId + " helpString=" + helpString +                            + ", due to co-ex logic"); +                } +                return; +            } else if (mStatusBarKeyguardViewManager.isBouncerShowing()) {                  mStatusBarKeyguardViewManager.showBouncerMessage(helpString,                          mInitialTextColorState);              } else if (mScreenLifecycle.getScreenState() == SCREEN_ON) { @@ -1002,14 +1022,28 @@ public class KeyguardIndicationController {              if (shouldSuppressBiometricError(msgId, biometricSourceType, mKeyguardUpdateMonitor)) {                  return;              } -            if (msgId == FaceManager.FACE_ERROR_TIMEOUT) { + +            if (biometricSourceType == BiometricSourceType.FACE +                    && msgId == FaceManager.FACE_ERROR_UNABLE_TO_PROCESS) { +                // suppress all face UNABLE_TO_PROCESS errors +                if (DEBUG) { +                    Log.d(TAG, "skip showing FACE_ERROR_UNABLE_TO_PROCESS errString=" +                            + errString); +                } +            } else if (biometricSourceType == BiometricSourceType.FACE +                    && msgId == FaceManager.FACE_ERROR_TIMEOUT) { +                if (mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( +                        KeyguardUpdateMonitor.getCurrentUser())) { +                    // no message if fingerprint is also enrolled +                    if (DEBUG) { +                        Log.d(TAG, "skip showing FACE_ERROR_TIMEOUT due to co-ex logic"); +                    } +                    return; +                } +                  // The face timeout message is not very actionable, let's ask the user to                  // manually retry. -                if (!mStatusBarKeyguardViewManager.isBouncerShowing() -                        && mKeyguardUpdateMonitor.isUdfpsEnrolled() -                        && mKeyguardUpdateMonitor.isFingerprintDetectionRunning()) { -                    showFaceFailedTryFingerprintMsg(msgId, errString); -                } else if (mStatusBarKeyguardViewManager.isShowingAlternateAuth()) { +                if (mStatusBarKeyguardViewManager.isShowingAlternateAuth()) {                      mStatusBarKeyguardViewManager.showBouncerMessage(                              mContext.getResources().getString(R.string.keyguard_try_fingerprint),                              mInitialTextColorState diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index 76f9db44af66..1ce05ec7e7ad 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -736,12 +736,10 @@ public class NotificationMediaManager implements Dumpable {                  }                  boolean cannotAnimateDoze = mStatusBarStateController.isDozing()                          && !ScrimState.AOD.getAnimateChange(); -                boolean needsBypassFading = mKeyguardStateController.isBypassFadingAnimation();                  if (((mBiometricUnlockController != null && mBiometricUnlockController.getMode()                          == BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING -                                || cannotAnimateDoze) && !needsBypassFading) +                                || cannotAnimateDoze))                          || hideBecauseOccluded) { -                      // We are unlocking directly - no animation!                      mBackdrop.setVisibility(View.GONE);                      mBackdropBack.setImageDrawable(null); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index 4f27fb4a9661..d88f07ca304c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -195,7 +195,6 @@ class PrivacyDotViewController @Inject constructor(      @UiThread      private fun showDotView(dot: View, animate: Boolean) { -        showingListener?.onPrivacyDotShown(dot)          dot.clearAnimation()          if (animate) {              dot.visibility = View.VISIBLE @@ -209,6 +208,7 @@ class PrivacyDotViewController @Inject constructor(              dot.visibility = View.VISIBLE              dot.alpha = 1f          } +        showingListener?.onPrivacyDotShown(dot)      }      // Update the gravity and margins of the privacy views 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 577d536262b2..755e3e1a208e 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 @@ -151,6 +151,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView                  R.color.notification_ripple_tinted_color);          mNormalRippleColor = mContext.getColor(                  R.color.notification_ripple_untinted_color); +        // Reset background color tint and override tint, as they are from an old theme +        mBgTint = NO_COLOR; +        mOverrideTint = NO_COLOR; +        mOverrideAmount = 0.0f;      }      /** 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 36d6a96f16e8..5c8de18262c7 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 @@ -143,7 +143,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView      public static final float DEFAULT_HEADER_VISIBLE_AMOUNT = 1.0f;      private static final long RECENTLY_ALERTED_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(30); -    private boolean mUpdateBackgroundOnUpdate; +    // We don't correctly track dark mode until the content views are inflated, so always update +    // the background on first content update just in case it happens to be during a theme change. +    private boolean mUpdateBackgroundOnUpdate = true;      private boolean mNotificationTranslationFinished = false;      private boolean mIsSnoozed;      private boolean mIsFaded; 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 a552f999aeb4..a76f0827fc18 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 @@ -1312,6 +1312,7 @@ public class NotificationChildrenContainer extends ViewGroup              }              float bottomRoundness = last ? currentBottomRoundness : 0.0f;              child.setBottomRoundness(bottomRoundness, isShown() /* animate */); +            child.setTopRoundness(0.0f, false /* animate */);              last = false;          }      } 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 e946bf1bb238..39620ac23117 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -27,8 +27,11 @@ import android.hardware.fingerprint.FingerprintManager;  import android.metrics.LogMaker;  import android.os.Handler;  import android.os.PowerManager; +import android.os.Process;  import android.os.SystemClock;  import android.os.Trace; +import android.os.VibrationAttributes; +import android.os.VibrationEffect;  import android.util.Log;  import androidx.annotation.Nullable; @@ -61,6 +64,7 @@ import com.android.systemui.statusbar.CommandQueue;  import com.android.systemui.statusbar.NotificationMediaManager;  import com.android.systemui.statusbar.NotificationShadeWindowController;  import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.VibratorHelper;  import com.android.systemui.statusbar.policy.KeyguardStateController;  import java.io.PrintWriter; @@ -83,6 +87,12 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp      private static final String BIOMETRIC_WAKE_LOCK_NAME = "wake-and-unlock:wakelock";      private static final UiEventLogger UI_EVENT_LOGGER = new UiEventLoggerImpl();      private static final int FP_ATTEMPTS_BEFORE_SHOW_BOUNCER = 2; +    private static final VibrationEffect SUCCESS_VIBRATION_EFFECT = +            VibrationEffect.get(VibrationEffect.EFFECT_CLICK); +    private static final VibrationEffect ERROR_VIBRATION_EFFECT = +            VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK); +    private static final VibrationAttributes HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES = +            VibrationAttributes.createForUsage(VibrationAttributes.USAGE_HARDWARE_FEEDBACK);      @IntDef(prefix = { "MODE_" }, value = {              MODE_NONE, @@ -91,7 +101,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp              MODE_SHOW_BOUNCER,              MODE_ONLY_WAKE,              MODE_UNLOCK_COLLAPSING, -            MODE_UNLOCK_FADING,              MODE_DISMISS_BOUNCER,              MODE_WAKE_AND_UNLOCK_FROM_DREAM      }) @@ -138,15 +147,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp      public static final int MODE_WAKE_AND_UNLOCK_FROM_DREAM = 6;      /** -     * Faster mode of dismissing the lock screen when we cross fade to an app -     * (used for keyguard bypass.) -     */ -    public static final int MODE_UNLOCK_FADING = 7; - -    /**       * When bouncer is visible and will be dismissed.       */ -    public static final int MODE_DISMISS_BOUNCER = 8; +    public static final int MODE_DISMISS_BOUNCER = 7;      /**       * How much faster we collapse the lockscreen when authenticating with biometric. @@ -165,6 +168,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp      private final NotificationShadeWindowController mNotificationShadeWindowController;      private final SessionTracker mSessionTracker;      private final int mConsecutiveFpFailureThreshold; +    private final boolean mShouldVibrate;      private int mMode;      private BiometricSourceType mBiometricType;      private KeyguardViewController mKeyguardViewController; @@ -181,6 +185,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp      private final AuthController mAuthController;      private final StatusBarStateController mStatusBarStateController;      private final LatencyTracker mLatencyTracker; +    private final VibratorHelper mVibratorHelper;      private long mLastFpFailureUptimeMillis;      private int mNumConsecutiveFpFailures; @@ -285,7 +290,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp              KeyguardUnlockAnimationController keyguardUnlockAnimationController,              SessionTracker sessionTracker,              LatencyTracker latencyTracker, -            ScreenOffAnimationController screenOffAnimationController) { +            ScreenOffAnimationController screenOffAnimationController, +            VibratorHelper vibrator) {          mPowerManager = powerManager;          mShadeController = shadeController;          mUpdateMonitor = keyguardUpdateMonitor; @@ -304,6 +310,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp          mHandler = handler;          mConsecutiveFpFailureThreshold = resources.getInteger(                  R.integer.fp_consecutive_failure_time_ms); +        mShouldVibrate = !(resources.getBoolean( +                com.android.internal.R.bool.system_server_plays_face_haptics));          mKeyguardBypassController = keyguardBypassController;          mKeyguardBypassController.setUnlockController(this);          mMetricsLogger = metricsLogger; @@ -312,6 +320,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp          mKeyguardUnlockAnimationController = keyguardUnlockAnimationController;          mSessionTracker = sessionTracker;          mScreenOffAnimationController = screenOffAnimationController; +        mVibratorHelper = vibrator; +          dumpManager.registerDumpable(getClass().getName(), this);      } @@ -414,8 +424,14 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp      }      public void startWakeAndUnlock(BiometricSourceType biometricSourceType, -            boolean isStrongBiometric) { -        startWakeAndUnlock(calculateMode(biometricSourceType, isStrongBiometric)); +                                   boolean isStrongBiometric) { +        int mode = calculateMode(biometricSourceType, isStrongBiometric); +        if (BiometricSourceType.FACE == biometricSourceType && (mode == MODE_WAKE_AND_UNLOCK +                || mode == MODE_WAKE_AND_UNLOCK_PULSING || mode == MODE_UNLOCK_COLLAPSING +                || mode == MODE_WAKE_AND_UNLOCK_FROM_DREAM || mode == MODE_DISMISS_BOUNCER)) { +            vibrateSuccess(); +        } +        startWakeAndUnlock(mode);      }      public void startWakeAndUnlock(@WakeAndUnlockMode int mode) { @@ -451,8 +467,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp          }          switch (mMode) {              case MODE_DISMISS_BOUNCER: -            case MODE_UNLOCK_FADING: -                Trace.beginSection("MODE_DISMISS_BOUNCER or MODE_UNLOCK_FADING"); +                Trace.beginSection("MODE_DISMISS_BOUNCER");                  mKeyguardViewController.notifyKeyguardAuthenticated(                          false /* strongAuth */);                  Trace.endSection(); @@ -590,7 +605,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp                  mUpdateMonitor.isUnlockingWithBiometricAllowed(isStrongBiometric);          boolean deviceDreaming = mUpdateMonitor.isDreaming();          boolean bypass = mKeyguardBypassController.getBypassEnabled() -                || mKeyguardBypassController.getUserHasDeviceEntryIntent(); +                || mAuthController.isUdfpsFingerDown();          if (!mUpdateMonitor.isDeviceInteractive()) {              if (!mKeyguardViewController.isShowing()) {                  return bypass ? MODE_WAKE_AND_UNLOCK : MODE_ONLY_WAKE; @@ -619,14 +634,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp          if (mKeyguardViewController.isShowing()) {              if ((mKeyguardViewController.bouncerIsOrWillBeShowing()                      || mKeyguardBypassController.getAltBouncerShowing()) && unlockingAllowed) { -                if (bypass && mKeyguardBypassController.canPlaySubtleWindowAnimations()) { -                    return MODE_UNLOCK_FADING; -                } else { -                    return MODE_DISMISS_BOUNCER; -                } -            } else if (unlockingAllowed) { -                return bypass || mAuthController.isUdfpsFingerDown() -                        ? MODE_UNLOCK_FADING : MODE_NONE; +                return MODE_DISMISS_BOUNCER; +            } else if (unlockingAllowed && (bypass || mAuthController.isUdfpsFingerDown())) { +                return MODE_UNLOCK_COLLAPSING;              } else {                  return bypass ? MODE_SHOW_BOUNCER : MODE_NONE;              } @@ -665,6 +675,14 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp                  mNumConsecutiveFpFailures = 0;              }          } + +        // Suppress all face auth errors if fingerprint can be used to authenticate +        if (biometricSourceType == BiometricSourceType.FACE +                && !mUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( +                KeyguardUpdateMonitor.getCurrentUser())) { +            vibrateError(); +        } +          cleanup();      } @@ -687,9 +705,30 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp              startWakeAndUnlock(MODE_SHOW_BOUNCER);              UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN, getSessionId());          } +          cleanup();      } +    private void vibrateSuccess() { +        if (mShouldVibrate) { +            mVibratorHelper.vibrate(Process.myUid(), +                    "com.android.systemui", +                    SUCCESS_VIBRATION_EFFECT, +                    getClass().getSimpleName() + "::success", +                    HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES); +        } +    } + +    private void vibrateError() { +        if (mShouldVibrate) { +            mVibratorHelper.vibrate(Process.myUid(), +                    "com.android.systemui", +                    ERROR_VIBRATION_EFFECT, +                    getClass().getSimpleName() + "::error", +                    HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES); +        } +    } +      private void cleanup() {          releaseBiometricWakeLock();      } @@ -802,7 +841,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp       * on or off.       */      public boolean isBiometricUnlock() { -        return isWakeAndUnlock() || mMode == MODE_UNLOCK_COLLAPSING || mMode == MODE_UNLOCK_FADING; +        return isWakeAndUnlock() || mMode == MODE_UNLOCK_COLLAPSING;      }      /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java index 9c6ba3af5154..37079e500aa7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -396,8 +396,7 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn      void keyguardGoingAway(); -    void setKeyguardFadingAway(long startTime, long delay, long fadeoutDuration, -            boolean isBypassFading); +    void setKeyguardFadingAway(long startTime, long delay, long fadeoutDuration);      void finishKeyguardFadingAway(); @@ -565,8 +564,6 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn      void setLaunchEmergencyActionOnFinishedWaking(boolean launch); -    void setTopHidesStatusBar(boolean hides); -      QSPanelController getQSPanelController();      boolean areNotificationAlertsDisabled(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 54da45a4e907..7ca502d7e2f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -207,7 +207,6 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager;  import com.android.systemui.statusbar.notification.NotificationLaunchAnimatorControllerProvider;  import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;  import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager; -import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;  import com.android.systemui.statusbar.notification.init.NotificationsController;  import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;  import com.android.systemui.statusbar.notification.logging.NotificationLogger; @@ -238,7 +237,6 @@ import com.android.systemui.util.WallpaperController;  import com.android.systemui.util.concurrency.DelayableExecutor;  import com.android.systemui.util.concurrency.MessageRouter;  import com.android.systemui.volume.VolumeComponent; -import com.android.systemui.wmshell.BubblesManager;  import com.android.wm.shell.bubbles.Bubbles;  import com.android.wm.shell.startingsurface.SplashscreenContentDrawer;  import com.android.wm.shell.startingsurface.StartingSurface; @@ -405,11 +403,6 @@ public class CentralSurfacesImpl extends CoreStartable implements      }      @Override -    public void setTopHidesStatusBar(boolean hides) { -        mTopHidesStatusBar = hides; -    } - -    @Override      public QSPanelController getQSPanelController() {          return mQSPanelController;      } @@ -451,7 +444,6 @@ public class CentralSurfacesImpl extends CoreStartable implements      private BiometricUnlockController mBiometricUnlockController;      private final LightBarController mLightBarController;      private final Lazy<LockscreenWallpaper> mLockscreenWallpaperLazy; -    private final LockscreenGestureLogger mLockscreenGestureLogger;      @Nullable      protected LockscreenWallpaper mLockscreenWallpaper;      private final AutoHideController mAutoHideController; @@ -518,9 +510,6 @@ public class CentralSurfacesImpl extends CoreStartable implements      private boolean mExpandedVisible; -    private final int[] mAbsPos = new int[2]; - -    private final NotifShadeEventSource mNotifShadeEventSource;      protected final NotificationEntryManager mEntryManager;      private final NotificationGutsManager mGutsManager;      private final NotificationLogger mNotificationLogger; @@ -602,7 +591,6 @@ public class CentralSurfacesImpl extends CoreStartable implements          }      } -    private Handler mMainHandler;      private final DelayableExecutor mMainExecutor;      private int mInteractingWindows; @@ -636,12 +624,9 @@ public class CentralSurfacesImpl extends CoreStartable implements      // Fingerprint (as computed by getLoggingFingerprint() of the last logged state.      private int mLastLoggedStateFingerprint; -    private boolean mTopHidesStatusBar; -    private boolean mStatusBarWindowHidden;      private boolean mIsLaunchingActivityOverLockscreen;      private final UserSwitcherController mUserSwitcherController; -    private final NetworkController mNetworkController;      private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this);      protected final BatteryController mBatteryController;      protected boolean mPanelExpanded; @@ -661,7 +646,6 @@ public class CentralSurfacesImpl extends CoreStartable implements      protected NotificationPresenter mPresenter;      private NotificationActivityStarter mNotificationActivityStarter;      private final Lazy<NotificationShadeDepthController> mNotificationShadeDepthControllerLazy; -    private final Optional<BubblesManager> mBubblesManagerOptional;      private final Optional<Bubbles> mBubblesOptional;      private final Bubbles.BubbleExpandListener mBubbleExpandListener;      private final Optional<StartingSurface> mStartingSurfaceOptional; @@ -703,7 +687,6 @@ public class CentralSurfacesImpl extends CoreStartable implements              FalsingManager falsingManager,              FalsingCollector falsingCollector,              BroadcastDispatcher broadcastDispatcher, -            NotifShadeEventSource notifShadeEventSource,              NotificationEntryManager notificationEntryManager,              NotificationGutsManager notificationGutsManager,              NotificationLogger notificationLogger, @@ -718,13 +701,11 @@ public class CentralSurfacesImpl extends CoreStartable implements              NotificationLockscreenUserManager lockScreenUserManager,              NotificationRemoteInputManager remoteInputManager,              UserSwitcherController userSwitcherController, -            NetworkController networkController,              BatteryController batteryController,              SysuiColorExtractor colorExtractor,              ScreenLifecycle screenLifecycle,              WakefulnessLifecycle wakefulnessLifecycle,              SysuiStatusBarStateController statusBarStateController, -            Optional<BubblesManager> bubblesManagerOptional,              Optional<Bubbles> bubblesOptional,              VisualStabilityManager visualStabilityManager,              DeviceProvisionedController deviceProvisionedController, @@ -736,7 +717,6 @@ public class CentralSurfacesImpl extends CoreStartable implements              DozeParameters dozeParameters,              ScrimController scrimController,              Lazy<LockscreenWallpaper> lockscreenWallpaperLazy, -            LockscreenGestureLogger lockscreenGestureLogger,              Lazy<BiometricUnlockController> biometricUnlockControllerLazy,              DozeServiceHost dozeServiceHost,              PowerManager powerManager, @@ -769,7 +749,6 @@ public class CentralSurfacesImpl extends CoreStartable implements              LockscreenShadeTransitionController lockscreenShadeTransitionController,              FeatureFlags featureFlags,              KeyguardUnlockAnimationController keyguardUnlockAnimationController, -            @Main Handler mainHandler,              @Main DelayableExecutor delayableExecutor,              @Main MessageRouter messageRouter,              WallpaperManager wallpaperManager, @@ -799,7 +778,6 @@ public class CentralSurfacesImpl extends CoreStartable implements          mFalsingCollector = falsingCollector;          mFalsingManager = falsingManager;          mBroadcastDispatcher = broadcastDispatcher; -        mNotifShadeEventSource = notifShadeEventSource;          mEntryManager = notificationEntryManager;          mGutsManager = notificationGutsManager;          mNotificationLogger = notificationLogger; @@ -814,13 +792,11 @@ public class CentralSurfacesImpl extends CoreStartable implements          mLockscreenUserManager = lockScreenUserManager;          mRemoteInputManager = remoteInputManager;          mUserSwitcherController = userSwitcherController; -        mNetworkController = networkController;          mBatteryController = batteryController;          mColorExtractor = colorExtractor;          mScreenLifecycle = screenLifecycle;          mWakefulnessLifecycle = wakefulnessLifecycle;          mStatusBarStateController = statusBarStateController; -        mBubblesManagerOptional = bubblesManagerOptional;          mBubblesOptional = bubblesOptional;          mVisualStabilityManager = visualStabilityManager;          mDeviceProvisionedController = deviceProvisionedController; @@ -834,7 +810,6 @@ public class CentralSurfacesImpl extends CoreStartable implements          mDozeParameters = dozeParameters;          mScrimController = scrimController;          mLockscreenWallpaperLazy = lockscreenWallpaperLazy; -        mLockscreenGestureLogger = lockscreenGestureLogger;          mScreenPinningRequest = screenPinningRequest;          mDozeScrimController = dozeScrimController;          mBiometricUnlockControllerLazy = biometricUnlockControllerLazy; @@ -861,7 +836,6 @@ public class CentralSurfacesImpl extends CoreStartable implements          mStatusBarHideIconsForBouncerManager = statusBarHideIconsForBouncerManager;          mFeatureFlags = featureFlags;          mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; -        mMainHandler = mainHandler;          mMainExecutor = delayableExecutor;          mMessageRouter = messageRouter;          mWallpaperManager = wallpaperManager; @@ -1485,12 +1459,16 @@ public class CentralSurfacesImpl extends CoreStartable implements              mPowerManager.wakeUp(                      time, PowerManager.WAKE_REASON_GESTURE, "com.android.systemui:" + why);              mWakeUpComingFromTouch = true; -            where.getLocationInWindow(mTmpInt2);              // NOTE, the incoming view can sometimes be the entire container... unsure if              // this location is valuable enough -            mWakeUpTouchLocation = new PointF(mTmpInt2[0] + where.getWidth() / 2, -                    mTmpInt2[1] + where.getHeight() / 2); +            if (where != null) { +                where.getLocationInWindow(mTmpInt2); +                mWakeUpTouchLocation = new PointF(mTmpInt2[0] + where.getWidth() / 2, +                        mTmpInt2[1] + where.getHeight() / 2); +            } else { +                mWakeUpTouchLocation = new PointF(-1, -1); +            }              mFalsingCollector.onScreenOnFromTouch();          }      } @@ -2274,8 +2252,7 @@ public class CentralSurfacesImpl extends CoreStartable implements      public void updateBubblesVisibility() {          mBubblesOptional.ifPresent(bubbles -> bubbles.onStatusBarVisibilityChanged(                  mStatusBarMode != MODE_LIGHTS_OUT -                        && mStatusBarMode != MODE_LIGHTS_OUT_TRANSPARENT -                        && !mStatusBarWindowHidden)); +                        && mStatusBarMode != MODE_LIGHTS_OUT_TRANSPARENT));      }      void checkBarMode(@TransitionMode int mode, @WindowVisibleState int windowState, @@ -2517,6 +2494,12 @@ public class CentralSurfacesImpl extends CoreStartable implements                      animate, intent.getPackage(), (adapter) -> {                          ActivityOptions options = new ActivityOptions(                                  CentralSurfaces.getActivityOptions(mDisplayId, adapter)); + +                        // We know that the intent of the caller is to dismiss the keyguard and +                        // this runnable is called right after the keyguard is solved, so we tell +                        // WM that we should dismiss it to avoid flickers when opening an activity +                        // that can also be shown over the keyguard. +                        options.setDismissKeyguard();                          options.setDisallowEnterPictureInPictureWhileLaunching(                                  disallowEnterPictureInPictureWhileLaunching);                          if (CameraIntents.isInsecureCameraIntent(intent)) { @@ -3194,14 +3177,12 @@ public class CentralSurfacesImpl extends CoreStartable implements      /**       * 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       */      @Override -    public void setKeyguardFadingAway(long startTime, long delay, long fadeoutDuration, -            boolean isBypassFading) { +    public void setKeyguardFadingAway(long startTime, long delay, long fadeoutDuration) {          mCommandQueue.appTransitionStarting(mDisplayId, startTime + fadeoutDuration                          - LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION,                  LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, true); @@ -3209,7 +3190,7 @@ public class CentralSurfacesImpl extends CoreStartable implements          mCommandQueue.appTransitionStarting(mDisplayId,                      startTime - LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION,                      LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, true); -        mKeyguardStateController.notifyKeyguardFadingAway(delay, fadeoutDuration, isBypassFading); +        mKeyguardStateController.notifyKeyguardFadingAway(delay, fadeoutDuration);      }      /** @@ -3560,6 +3541,9 @@ public class CentralSurfacesImpl extends CoreStartable implements          setBouncerShowingForStatusBarComponents(bouncerShowing);          mStatusBarHideIconsForBouncerManager.setBouncerShowingAndTriggerUpdate(bouncerShowing);          mCommandQueue.recomputeDisableFlags(mDisplayId, true /* animate */); +        if (mBouncerShowing) { +            wakeUpIfDozing(SystemClock.uptimeMillis(), null, "BOUNCER_VISIBLE"); +        }          updateScrimController();          if (!mBouncerShowing) {              updatePanelExpansionForKeyguard(); @@ -3926,7 +3910,8 @@ public class CentralSurfacesImpl extends CoreStartable implements              mScrimController.transitionTo(ScrimState.AOD);          } else if (mKeyguardStateController.isShowing() && !isOccluded() && !unlocking) {              mScrimController.transitionTo(ScrimState.KEYGUARD); -        } else if (mKeyguardStateController.isShowing() && mKeyguardUpdateMonitor.isDreaming()) { +        } else if (mKeyguardStateController.isShowing() && mKeyguardUpdateMonitor.isDreaming() +                && !unlocking) {              mScrimController.transitionTo(ScrimState.DREAMING);          } else {              mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback); 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 8792118fb9ef..9b88e2650816 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -216,9 +216,12 @@ public class KeyguardBouncer {              // Split up the work over multiple frames.              DejankUtils.removeCallbacks(mResetRunnable); -            if (mKeyguardStateController.isFaceAuthEnabled() && !needsFullscreenBouncer() -                && !mKeyguardUpdateMonitor.userNeedsStrongAuth() -                && !mKeyguardBypassController.getBypassEnabled()) { +            if (mKeyguardStateController.isFaceAuthEnabled() +                    && !mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( +                            KeyguardUpdateMonitor.getCurrentUser()) +                    && !needsFullscreenBouncer() +                    && !mKeyguardUpdateMonitor.userNeedsStrongAuth() +                    && !mKeyguardBypassController.getBypassEnabled()) {                  mHandler.postDelayed(mShowRunnable, BOUNCER_FACE_DELAY);              } else {                  DejankUtils.postAfterTraversal(mShowRunnable); @@ -394,10 +397,6 @@ public class KeyguardBouncer {          return mShowingSoon || mExpansion != EXPANSION_HIDDEN && mExpansion != EXPANSION_VISIBLE;      } -    public boolean getShowingSoon() { -        return mShowingSoon; -    } -      /**       * @return {@code true} when bouncer's pre-hide animation already started but isn't completely       *         hidden yet, {@code false} otherwise. @@ -641,6 +640,10 @@ public class KeyguardBouncer {      public interface BouncerExpansionCallback {          /**           * Invoked when the bouncer expansion reaches {@link KeyguardBouncer#EXPANSION_VISIBLE}. +         * This is NOT called each time the bouncer is shown, but rather only when the fully +         * shown amount has changed based on the panel expansion. The bouncer is visibility +         * can still change when the expansion amount hasn't changed. +         * See {@link KeyguardBouncer#isShowing()} for the checks for the bouncer showing state.           */          default void onFullyShown() {          } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index 034fc589df97..b987f6815000 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -43,7 +43,6 @@ open class KeyguardBypassController : Dumpable, StackScrollAlgorithm.BypassContr      private var hasFaceFeature: Boolean      private var pendingUnlock: PendingUnlock? = null      private val listeners = mutableListOf<OnBypassStateChangedListener>() -    var userHasDeviceEntryIntent: Boolean = false // ie: attempted udfps auth      private val faceAuthEnabledChangedCallback = object : KeyguardStateController.Callback {          override fun onFaceAuthEnabledChanged() = notifyListeners() @@ -197,20 +196,6 @@ open class KeyguardBypassController : Dumpable, StackScrollAlgorithm.BypassContr          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() {          pendingUnlock = null      } @@ -231,7 +216,6 @@ open class KeyguardBypassController : Dumpable, StackScrollAlgorithm.BypassContr          pw.println("  launchingAffordance: $launchingAffordance")          pw.println("  qSExpanded: $qSExpanded")          pw.println("  hasFaceFeature: $hasFaceFeature") -        pw.println("  userHasDeviceEntryIntent: $userHasDeviceEntryIntent")      }      /** Registers a listener for bypass state changes. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java index 5d417e0b59e2..3e10166e4c3e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -165,6 +165,7 @@ public abstract class PanelViewController {      private float mInitialTouchY;      private float mInitialTouchX;      private boolean mTouchDisabled; +    private boolean mInitialTouchFromKeyguard;      /**       * Whether or not the PanelView can be expanded or collapsed with a drag. @@ -394,6 +395,7 @@ public abstract class PanelViewController {          mInitialOffsetOnTouch = expandedHeight;          mInitialTouchY = newY;          mInitialTouchX = newX; +        mInitialTouchFromKeyguard = mKeyguardStateController.isShowing();          if (startTracking) {              mTouchSlopExceeded = true;              setExpandedHeight(mInitialOffsetOnTouch); @@ -412,24 +414,16 @@ public abstract class PanelViewController {              float vectorVel = (float) Math.hypot(                      mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity()); -            final boolean onKeyguard = -                    mStatusBarStateController.getState() == StatusBarState.KEYGUARD; - +            final boolean onKeyguard = mKeyguardStateController.isShowing();              final boolean expand; -            if (event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel) { -                // If the keyguard is fading away, don't expand it again. This can happen if you're -                // swiping to unlock, the app below the keyguard is in landscape, and the screen -                // rotates while your finger is still down after the swipe to unlock. -                if (mKeyguardStateController.isKeyguardFadingAway()) { -                    expand = false; -                } else if (onKeyguard) { +            if (mKeyguardStateController.isKeyguardFadingAway() +                    || (mInitialTouchFromKeyguard && !onKeyguard)) { +                // Don't expand for any touches that started from the keyguard and ended after the +                // keyguard is gone. +                expand = false; +            } else if (event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel) { +                if (onKeyguard) {                      expand = true; -                } else if (mKeyguardStateController.isKeyguardFadingAway()) { -                    // If we're in the middle of dismissing the keyguard, don't expand due to the -                    // cancelled gesture. Gesture cancellation during an unlock is expected in some -                    // situations, such keeping your finger down while swiping to unlock to an app -                    // that is locked in landscape (the rotation will cancel the touch event). -                    expand = false;                  } else {                      // If we get a cancel, put the shade back to the state it was in when the                      // gesture started @@ -438,7 +432,6 @@ public abstract class PanelViewController {              } else {                  expand = flingExpands(vel, vectorVel, x, y);              } -              mDozeLog.traceFling(expand, mTouchAboveFalsingThreshold,                      mCentralSurfaces.isFalsingThresholdNeeded(),                      mCentralSurfaces.isWakeUpComingFromTouch()); 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 4a5f712d587c..b447f0d36c10 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -252,7 +252,7 @@ public enum ScrimState {              mBehindTint = Color.BLACK;              mBlankScreen = false; -            if (previousState == ScrimState.AOD) { +            if (mDisplayRequiresBlanking && previousState == ScrimState.AOD) {                  // Set all scrims black, before they fade transparent.                  updateScrimColor(mScrimInFront, 1f /* alpha */, Color.BLACK /* tint */);                  updateScrimColor(mScrimBehind, 1f /* alpha */, Color.BLACK /* tint */); 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 61e123a8e42a..68d95e882ced 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -19,8 +19,8 @@ package com.android.systemui.statusbar.phone;  import static android.view.WindowInsets.Type.navigationBars;  import static com.android.systemui.plugins.ActivityStarter.OnDismissAction; +import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_DISMISS_BOUNCER;  import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_UNLOCK_COLLAPSING; -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; @@ -130,8 +130,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb          public void onFullyShown() {              mBouncerAnimating = false;              updateStates(); -            mCentralSurfaces.wakeUpIfDozing(SystemClock.uptimeMillis(), -                    mCentralSurfaces.getBouncerContainer(), "BOUNCER_VISIBLE");          }          @Override @@ -384,6 +382,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb              mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);          } else if (mShowing && !hideBouncerOverDream) {              if (!isWakeAndUnlocking() +                    && !(mBiometricUnlockController.getMode() == MODE_DISMISS_BOUNCER)                      && !mCentralSurfaces.isInLaunchTransition()                      && !isUnlockCollapsing()) {                  mBouncer.setExpansion(fraction); @@ -395,9 +394,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb              }          } else if (!mShowing && mBouncer.inTransit()) {              // Keyguard is not visible anymore, but expansion animation was still running. -            // We need to keep propagating the expansion state to the bouncer, otherwise it will be -            // stuck in transit. -            mBouncer.setExpansion(fraction); +            // We need to hide the bouncer, otherwise it will be stuck in transit. +            mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN);          } else if (mPulsing && fraction == KeyguardBouncer.EXPANSION_VISIBLE) {              // Panel expanded while pulsing but didn't translate the bouncer (because we are              // unlocked.) Let's simply wake-up to dismiss the lock screen. @@ -736,8 +734,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb          }          mNotificationShadeWindowController.setKeyguardOccluded(mOccluded); -        // setDozing(false) will call reset once we stop dozing. -        if (!mDozing) { +        // setDozing(false) will call reset once we stop dozing. Also, if we're going away, there's +        // no need to reset the keyguard views as we'll be gone shortly. Resetting now could cause +        // unexpected visible behavior if the keyguard is still visible as we're animating unlocked. +        if (!mDozing && !mKeyguardStateController.isKeyguardGoingAway()) {              // If Keyguard is reshown, don't hide the bouncer as it might just have been requested              // by a FLAG_DISMISS_KEYGUARD_ACTIVITY.              reset(isOccluding /* hideBouncerWhenShowing*/); @@ -832,46 +832,17 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb              executeAfterKeyguardGoneAction();              boolean wakeUnlockPulsing =                      mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING; -            boolean needsFading = needsBypassFading(); -            if (needsFading) { -                delay = 0; -                fadeoutDuration = KeyguardBypassController.BYPASS_FADE_DURATION; -            } else if (wakeUnlockPulsing) { -                delay = 0; -                fadeoutDuration = 240; -            } -            mCentralSurfaces.setKeyguardFadingAway(startTime, delay, fadeoutDuration, needsFading); +            mCentralSurfaces.setKeyguardFadingAway(startTime, delay, fadeoutDuration);              mBiometricUnlockController.startKeyguardFadingAway();              hideBouncer(true /* destroyView */);              if (wakeUnlockPulsing) { -                if (needsFading) { -                    ViewGroupFadeHelper.fadeOutAllChildrenExcept( -                            mNotificationPanelViewController.getView(), -                            mNotificationContainer, -                            fadeoutDuration, -                                    () -> { -                        mCentralSurfaces.hideKeyguard(); -                        onKeyguardFadedAway(); -                    }); -                } else { -                    mCentralSurfaces.fadeKeyguardWhilePulsing(); -                } +                mCentralSurfaces.fadeKeyguardWhilePulsing();                  wakeAndUnlockDejank();              } else {                  boolean staying = mStatusBarStateController.leaveOpenOnKeyguardHide();                  if (!staying) {                      mNotificationShadeWindowController.setKeyguardFadingAway(true); -                    if (needsFading) { -                        ViewGroupFadeHelper.fadeOutAllChildrenExcept( -                                mNotificationPanelViewController.getView(), -                                mNotificationContainer, -                                fadeoutDuration, -                                () -> { -                                    mCentralSurfaces.hideKeyguard(); -                                }); -                    } else { -                        mCentralSurfaces.hideKeyguard(); -                    } +                    mCentralSurfaces.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 @@ -884,6 +855,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb                      mBiometricUnlockController.finishKeyguardFadingAway();                  }              } +              updateStates();              mNotificationShadeWindowController.setKeyguardShowing(false);              mViewMediatorCallback.keyguardGone(); @@ -893,13 +865,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb          Trace.endSection();      } -    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 onNavigationModeChanged(int mode) {          boolean gesturalNav = QuickStepContract.isGesturalMode(mode); @@ -999,7 +964,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb      @Override      public boolean bouncerIsOrWillBeShowing() { -        return isBouncerShowing() || mBouncer.getShowingSoon(); +        return isBouncerShowing() || mBouncer.inTransit();      }      public boolean isFullscreenBouncer() { @@ -1186,7 +1151,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb      @Override      public boolean shouldSubtleWindowAnimationsForUnlock() { -        return needsBypassFading(); +        return false;      }      @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index 597c949168d4..cf1edf9094df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -483,6 +483,10 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue          int state = mAnimationScheduler.getAnimationState();          if (state == IDLE || state == SHOWING_PERSISTENT_DOT) {              animateShow(mSystemIconArea, animate); +        } else { +            // We are in the middle of a system status event animation, which will animate the +            // alpha (but not the visibility). Allow the view to become visible again +            mSystemIconArea.setVisibility(View.VISIBLE);          }      } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java index dce24122aa7e..250d9d46de66 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java @@ -109,28 +109,15 @@ public interface KeyguardStateController extends CallbackController<Callback> {       * we're bypassing       */      default long getShortenedFadingAwayDuration() { -        if (isBypassFadingAnimation()) { -            return getKeyguardFadingAwayDuration(); -        } else { -            return getKeyguardFadingAwayDuration() / 2; -        } -    } - -    /** -     * @return {@code true} if the current fading away animation is the fast bypass fading. -     */ -    default boolean isBypassFadingAnimation() { -        return false; +        return getKeyguardFadingAwayDuration() / 2;      }      /**       * 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 notifyKeyguardFadingAway(long delay, long fadeoutDuratio) {      }      /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java index 2a225b909f90..2fb16ee9b3b9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java @@ -72,7 +72,6 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum      private long mKeyguardFadingAwayDuration;      private boolean mKeyguardGoingAway;      private boolean mLaunchTransitionFadingAway; -    private boolean mBypassFadingAnimation;      private boolean mTrustManaged;      private boolean mTrusted;      private boolean mDebugUnlocked = false; @@ -203,10 +202,9 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum      }      @Override -    public void notifyKeyguardFadingAway(long delay, long fadeoutDuration, boolean isBypassFading) { +    public void notifyKeyguardFadingAway(long delay, long fadeoutDuration) {          mKeyguardFadingAwayDelay = delay;          mKeyguardFadingAwayDuration = fadeoutDuration; -        mBypassFadingAnimation = isBypassFading;          setKeyguardFadingAway(true);      } @@ -284,11 +282,6 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum      }      @Override -    public boolean isBypassFadingAnimation() { -        return mBypassFadingAnimation; -    } - -    @Override      public long getKeyguardFadingAwayDelay() {          return mKeyguardFadingAwayDelay;      } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java index 80385e69cfa4..dffad6ccbea5 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java @@ -44,7 +44,6 @@ import android.view.SurfaceView;  import androidx.test.filters.SmallTest; -import com.android.keyguard.KeyguardSecurityModel.SecurityMode;  import com.android.systemui.SysuiTestCase;  import org.junit.After; @@ -191,7 +190,7 @@ public class AdminSecondaryLockScreenControllerTest extends SysuiTestCase {      private void verifyViewDismissed(SurfaceView v) throws Exception {          verify(mKeyguardSecurityContainer).removeView(v); -        verify(mKeyguardCallback).dismiss(true, TARGET_USER_ID, true, SecurityMode.Invalid); +        verify(mKeyguardCallback).dismiss(true, TARGET_USER_ID, true);          assertThat(mContext.isBound(mComponentName)).isFalse();      }  } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java index e717656c4c8a..4d3343059718 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java @@ -21,10 +21,7 @@ import static android.view.WindowInsets.Type.ime;  import static com.android.keyguard.KeyguardSecurityContainer.MODE_DEFAULT;  import static com.android.keyguard.KeyguardSecurityContainer.MODE_ONE_HANDED; -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.anyInt;  import static org.mockito.ArgumentMatchers.anyLong;  import static org.mockito.ArgumentMatchers.eq; @@ -55,7 +52,6 @@ import com.android.systemui.flags.FeatureFlags;  import com.android.systemui.log.SessionTracker;  import com.android.systemui.plugins.FalsingManager;  import com.android.systemui.statusbar.policy.ConfigurationController; -import com.android.systemui.statusbar.policy.DeviceProvisionedController;  import com.android.systemui.statusbar.policy.KeyguardStateController;  import com.android.systemui.statusbar.policy.UserSwitcherController;  import com.android.systemui.util.settings.GlobalSettings; @@ -73,7 +69,6 @@ import org.mockito.junit.MockitoRule;  @TestableLooper.RunWithLooper()  public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {      private static final int VIEW_WIDTH = 1600; -    private static final int TARGET_USER_ID = 100;      @Rule      public MockitoRule mRule = MockitoJUnit.rule(); @@ -165,8 +160,7 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {                  mKeyguardStateController, mKeyguardSecurityViewFlipperController,                  mConfigurationController, mFalsingCollector, mFalsingManager,                  mUserSwitcherController, mFeatureFlags, mGlobalSettings, -                mSessionTracker, mock(DeviceProvisionedController.class)) -                  .create(mSecurityCallback); +                mSessionTracker).create(mSecurityCallback);      }      @Test @@ -305,42 +299,4 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {          verify(mUserSwitcherController)                  .removeUserSwitchCallback(any(UserSwitcherController.UserSwitchCallback.class));      } - -    @Test -    public void showNextSecurityScreenOrFinish_setsSecurityScreenToPinAfterSimPinUnlock() { -        // GIVEN the current security method is SimPin -        when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false); -        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(TARGET_USER_ID)).thenReturn(false); -        mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.SimPin); - -        // WHEN a request is made from the SimPin screens to show the next security method -        when(mKeyguardSecurityModel.getSecurityMode(TARGET_USER_ID)).thenReturn(SecurityMode.PIN); -        mKeyguardSecurityContainerController.showNextSecurityScreenOrFinish( -                /* authenticated= */true, -                TARGET_USER_ID, -                /* bypassSecondaryLockScreen= */true, -                SecurityMode.SimPin); - -        // THEN the next security method of PIN is set, and the keyguard is not marked as done -        verify(mSecurityCallback, never()).finish(anyBoolean(), anyInt()); -        assertThat(mKeyguardSecurityContainerController.getCurrentSecurityMode()) -                .isEqualTo(SecurityMode.PIN); -    } - -    @Test -    public void showNextSecurityScreenOrFinish_ignoresCallWhenSecurityMethodHasChanged() { -        //GIVEN current security mode has been set to PIN -        mKeyguardSecurityContainerController.showSecurityScreen(SecurityMode.PIN); - -        //WHEN a request comes from SimPin to dismiss the security screens -        boolean keyguardDone = mKeyguardSecurityContainerController.showNextSecurityScreenOrFinish( -                /* authenticated= */true, -                TARGET_USER_ID, -                /* bypassSecondaryLockScreen= */true, -                SecurityMode.SimPin); - -        //THEN no action has happened, which will not dismiss the security screens -        assertThat(keyguardDone).isEqualTo(false); -        verify(mKeyguardUpdateMonitor, never()).getUserHasTrust(anyInt()); -    }  } diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index 92e49473927f..90609fa2772f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -50,6 +50,7 @@ import android.content.pm.PackageManager;  import android.content.res.Configuration;  import android.content.res.TypedArray;  import android.graphics.Insets; +import android.graphics.Path;  import android.graphics.PixelFormat;  import android.graphics.Rect;  import android.graphics.drawable.Drawable; @@ -75,14 +76,19 @@ import androidx.annotation.NonNull;  import androidx.annotation.Nullable;  import androidx.test.filters.SmallTest; +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.systemui.biometrics.AuthController;  import com.android.systemui.broadcast.BroadcastDispatcher;  import com.android.systemui.decor.CornerDecorProvider;  import com.android.systemui.decor.DecorProvider;  import com.android.systemui.decor.DecorProviderFactory; +import com.android.systemui.decor.FaceScanningOverlayProviderImpl; +import com.android.systemui.decor.FaceScanningProviderFactory;  import com.android.systemui.decor.OverlayWindow;  import com.android.systemui.decor.PrivacyDotCornerDecorProviderImpl;  import com.android.systemui.decor.PrivacyDotDecorProviderFactory;  import com.android.systemui.decor.RoundedCornerResDelegate; +import com.android.systemui.plugins.statusbar.StatusBarStateController;  import com.android.systemui.settings.UserTracker;  import com.android.systemui.statusbar.events.PrivacyDotViewController;  import com.android.systemui.tuner.TunerService; @@ -113,6 +119,13 @@ public class ScreenDecorationsTest extends SysuiTestCase {      private final FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());      private FakeThreadFactory mThreadFactory;      private ArrayList<DecorProvider> mPrivacyDecorProviders; +    private ArrayList<DecorProvider> mFaceScanningProviders; +    @Mock +    private KeyguardUpdateMonitor mKeyguardUpdateMonitor; +    @Mock +    private StatusBarStateController mStatusBarStateController; +    @Mock +    private AuthController mAuthController;      @Mock      private Display mDisplay;      @Mock @@ -128,6 +141,10 @@ public class ScreenDecorationsTest extends SysuiTestCase {      @Mock      private PrivacyDotDecorProviderFactory mPrivacyDotDecorProviderFactory;      @Mock +    private FaceScanningProviderFactory mFaceScanningProviderFactory; +    @Mock +    private FaceScanningOverlayProviderImpl mFaceScanningDecorProvider; +    @Mock      private CornerDecorProvider mPrivacyDotTopLeftDecorProvider;      @Mock      private CornerDecorProvider mPrivacyDotTopRightDecorProvider; @@ -189,9 +206,16 @@ public class ScreenDecorationsTest extends SysuiTestCase {                  DisplayCutout.BOUNDS_POSITION_RIGHT,                  R.layout.privacy_dot_bottom_right)); +        mFaceScanningDecorProvider = spy(new FaceScanningOverlayProviderImpl( +                BOUNDS_POSITION_TOP, +                mAuthController, +                mStatusBarStateController, +                mKeyguardUpdateMonitor, +                mExecutor)); +          mScreenDecorations = spy(new ScreenDecorations(mContext, mExecutor, mSecureSettings,                  mBroadcastDispatcher, mTunerService, mUserTracker, mDotViewController, -                mThreadFactory, mPrivacyDotDecorProviderFactory) { +                mThreadFactory, mPrivacyDotDecorProviderFactory, mFaceScanningProviderFactory) {              @Override              public void start() {                  super.start(); @@ -211,9 +235,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {              }              @Override -            protected void setOverlayWindowVisibilityIfViewExist(@Nullable View view, -                    @View.Visibility int visibility) { -                super.setOverlayWindowVisibilityIfViewExist(view, visibility); +            protected void updateOverlayWindowVisibilityIfViewExists(@Nullable View view) { +                super.updateOverlayWindowVisibilityIfViewExists(view);                  mExecutor.runAllReady();              }          }); @@ -269,6 +292,16 @@ public class ScreenDecorationsTest extends SysuiTestCase {          }      } +    private void verifyFaceScanningViewExists(final boolean exists) { +        final View overlay = mScreenDecorations.mOverlays[BOUNDS_POSITION_TOP].getRootView(); +        final View view = overlay.findViewById(mFaceScanningDecorProvider.getViewId()); +        if (exists) { +            assertNotNull(view); +        } else { +            assertNull(view); +        } +    } +      @Nullable      private View findViewFromOverlays(@IdRes int id) {          for (OverlayWindow overlay: mScreenDecorations.mOverlays) { @@ -393,10 +426,11 @@ public class ScreenDecorationsTest extends SysuiTestCase {      }      @Test -    public void testNoRounding_NoCutout_NoPrivacyDot() { +    public void testNoRounding_NoCutout_NoPrivacyDot_NoFaceScanning() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // no cutout          doReturn(null).when(mScreenDecorations).getCutout(); @@ -411,10 +445,11 @@ public class ScreenDecorationsTest extends SysuiTestCase {      }      @Test -    public void testNoRounding_NoCutout_PrivacyDot() { +    public void testNoRounding_NoCutout_PrivacyDot_NoFaceScanning() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // no cutout          doReturn(null).when(mScreenDecorations).getCutout(); @@ -435,6 +470,9 @@ public class ScreenDecorationsTest extends SysuiTestCase {          // Privacy dots shall exist but invisible          verifyDotViewsVisibility(View.INVISIBLE); +        // Face scanning doesn't exist +        verifyFaceScanningViewExists(false); +          // One tunable.          verify(mTunerService, times(1)).addTunable(any(), any());          // Dot controller init @@ -443,10 +481,11 @@ public class ScreenDecorationsTest extends SysuiTestCase {      }      @Test -    public void testRounding_NoCutout_NoPrivacyDot() { +    public void testRounding_NoCutout_NoPrivacyDot_NoFaceScanning() {          setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                20 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */); +                20 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // no cutout          doReturn(null).when(mScreenDecorations).getCutout(); @@ -464,6 +503,9 @@ public class ScreenDecorationsTest extends SysuiTestCase {          // Privacy dots shall not exist          verifyDotViewsNullable(true); +        // Face scanning doesn't exist +        verifyFaceScanningViewExists(false); +          // One tunable.          verify(mTunerService, times(1)).addTunable(any(), any());          // No dot controller init @@ -471,10 +513,11 @@ public class ScreenDecorationsTest extends SysuiTestCase {      }      @Test -    public void testRounding_NoCutout_PrivacyDot() { +    public void testRounding_NoCutout_PrivacyDot_NoFaceScanning() {          setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                20 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                20 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // no cutout          doReturn(null).when(mScreenDecorations).getCutout(); @@ -494,6 +537,9 @@ public class ScreenDecorationsTest extends SysuiTestCase {          // Privacy dots shall exist but invisible          verifyDotViewsVisibility(View.INVISIBLE); +        // Face scanning doesn't exist +        verifyFaceScanningViewExists(false); +          // One tunable.          verify(mTunerService, times(1)).addTunable(any(), any());          // Dot controller init @@ -509,7 +555,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {                  /* roundedTopDrawable */,                  getTestsDrawable(com.android.systemui.tests.R.drawable.rounded3px)                  /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // no cutout          doReturn(null).when(mScreenDecorations).getCutout(); @@ -527,7 +574,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {                  /* roundedTopDrawable */,                  getTestsDrawable(com.android.systemui.tests.R.drawable.rounded3px)                  /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // no cutout          doReturn(null).when(mScreenDecorations).getCutout(); @@ -563,7 +611,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {                  /* roundedTopDrawable */,                  getTestsDrawable(com.android.systemui.tests.R.drawable.rounded5px)                  /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // left cutout          final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null}; @@ -598,7 +647,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testNoRounding_CutoutShortEdge_NoPrivacyDot() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // top cutout          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -621,7 +671,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testNoRounding_CutoutShortEdge_PrivacyDot() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // top cutout          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -655,7 +706,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testNoRounding_CutoutLongEdge_NoPrivacyDot() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // left cutout          final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null}; @@ -682,7 +734,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testNoRounding_CutoutLongEdge_PrivacyDot() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // left cutout          final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null}; @@ -709,7 +762,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testRounding_CutoutShortEdge_NoPrivacyDot() {          setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                20 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                20 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // top cutout          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -737,7 +791,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testRounding_CutoutShortEdge_PrivacyDot() {          setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                20 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */); +                20 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // top cutout          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -768,7 +823,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testRounding_CutoutLongEdge_NoPrivacyDot() {          setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                20 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                20 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // left cutout          final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null}; @@ -786,7 +842,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testRounding_CutoutLongEdge_PrivacyDot() {          setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                20 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */); +                20 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // left cutout          final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null}; @@ -806,7 +863,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testRounding_CutoutShortAndLongEdge_NoPrivacyDot() {          setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                20 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                20 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // top and left cutout          final Rect[] bounds = {new Rect(0, 50, 1, 60), new Rect(9, 0, 10, 1), null, null}; @@ -825,7 +883,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testRounding_CutoutShortAndLongEdge_PrivacyDot() {          setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                20 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */); +                20 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // top and left cutout          final Rect[] bounds = {new Rect(0, 50, 1, 60), new Rect(9, 0, 10, 1), null, null}; @@ -846,7 +905,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testNoRounding_SwitchFrom_ShortEdgeCutout_To_LongCutout_NoPrivacyDot() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // Set to short edge cutout(top).          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -869,7 +929,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testNoRounding_SwitchFrom_ShortEdgeCutout_To_LongCutout_PrivacyDot() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // Set to short edge cutout(top).          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -912,7 +973,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testDelayedCutout_NoPrivacyDot() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // top cutout          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -935,7 +997,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testDelayedCutout_PrivacyDot() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          // top cutout          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -980,7 +1043,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {                  /* roundedTopDrawable */,                  getTestsDrawable(com.android.systemui.tests.R.drawable.rounded4px)                  /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning*/);          mDisplayInfo.rotation = Surface.ROTATION_0;          mScreenDecorations.start(); @@ -994,7 +1058,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {                  /* roundedTopDrawable */,                  getTestsDrawable(com.android.systemui.tests.R.drawable.rounded5px)                  /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning*/);          mDisplayInfo.rotation = Surface.ROTATION_270;          mScreenDecorations.onConfigurationChanged(null); @@ -1007,7 +1072,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testOnlyRoundedCornerRadiusTop() {          setupResources(0 /* radius */, 10 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          mScreenDecorations.start(); @@ -1028,7 +1094,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testOnlyRoundedCornerRadiusBottom() {          setupResources(0 /* radius */, 0 /* radiusTop */, 20 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          mScreenDecorations.start(); @@ -1099,7 +1166,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testSupportHwcLayer_SwitchFrom_NotSupport() {          setupResources(0 /* radius */, 10 /* radiusTop */, 20 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // top cutout          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -1127,7 +1195,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testNotSupportHwcLayer_SwitchFrom_Support() {          setupResources(0 /* radius */, 10 /* radiusTop */, 20 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();          decorationSupport.format = PixelFormat.R_8;          doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport(); @@ -1165,7 +1234,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {                  /* roundedTopDrawable */,                  getTestsDrawable(com.android.systemui.tests.R.drawable.rounded4px)                  /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */, +                true /* faceScanning */);          final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();          decorationSupport.format = PixelFormat.R_8;          doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport(); @@ -1182,19 +1252,33 @@ public class ScreenDecorationsTest extends SysuiTestCase {          // Make sure view found and window visibility changed as well          final View view = mScreenDecorations.mOverlays[BOUNDS_POSITION_BOTTOM].getRootView()                  .findViewById(R.id.privacy_dot_bottom_right_container); +        view.setVisibility(View.VISIBLE);          mPrivacyDotShowingListener.onPrivacyDotShown(view);          assertEquals(View.VISIBLE,                  mScreenDecorations.mOverlays[BOUNDS_POSITION_BOTTOM].getRootView().getVisibility()); +        view.setVisibility(View.INVISIBLE);          mPrivacyDotShowingListener.onPrivacyDotHidden(view);          assertEquals(View.INVISIBLE,                  mScreenDecorations.mOverlays[BOUNDS_POSITION_BOTTOM].getRootView().getVisibility()); + +        // Make sure face scanning view found and window visibility updates on camera protection +        // update +        final View faceScanView = mScreenDecorations.mOverlays[BOUNDS_POSITION_TOP].getRootView() +                .findViewById(mFaceScanningDecorProvider.getViewId()); +        when(mFaceScanningProviderFactory.shouldShowFaceScanningAnim()).thenReturn(true); +        faceScanView.setVisibility(View.VISIBLE); +        mScreenDecorations.showCameraProtection(new Path(), new Rect()); +        mExecutor.runAllReady(); +        assertEquals(View.VISIBLE, +                mScreenDecorations.mOverlays[BOUNDS_POSITION_TOP].getRootView().getVisibility());      }      @Test      public void testAutoShowHideOverlayWindowWhenNoRoundedAndNoCutout() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */, +                true /* faceScanning */);          // no cutout          doReturn(null).when(mScreenDecorations).getCutout(); @@ -1206,19 +1290,33 @@ public class ScreenDecorationsTest extends SysuiTestCase {          // Make sure view found and window visibility changed as well          final View view = mScreenDecorations.mOverlays[BOUNDS_POSITION_BOTTOM].getRootView()                  .findViewById(R.id.privacy_dot_bottom_right_container); +        view.setVisibility(View.VISIBLE);          mPrivacyDotShowingListener.onPrivacyDotShown(view);          assertEquals(View.VISIBLE,                  mScreenDecorations.mOverlays[BOUNDS_POSITION_BOTTOM].getRootView().getVisibility()); +        view.setVisibility(View.INVISIBLE);          mPrivacyDotShowingListener.onPrivacyDotHidden(view);          assertEquals(View.INVISIBLE,                  mScreenDecorations.mOverlays[BOUNDS_POSITION_BOTTOM].getRootView().getVisibility()); + +        // Make sure face scanning view found and window visibility updates on camera protection +        // update +        final View faceScanView = mScreenDecorations.mOverlays[BOUNDS_POSITION_TOP].getRootView() +                .findViewById(mFaceScanningDecorProvider.getViewId()); +        faceScanView.setVisibility(View.VISIBLE); +        when(mFaceScanningProviderFactory.shouldShowFaceScanningAnim()).thenReturn(true); +        mScreenDecorations.showCameraProtection(new Path(), new Rect()); +        mExecutor.runAllReady(); +        assertEquals(View.VISIBLE, +                mScreenDecorations.mOverlays[BOUNDS_POSITION_TOP].getRootView().getVisibility());      }      @Test -    public void testHwcLayer_noPrivacyDot() { +    public void testHwcLayer_noPrivacyDot_noFaceScanning() {          setupResources(0 /* radius */, 10 /* radiusTop */, 20 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();          decorationSupport.format = PixelFormat.R_8;          doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport(); @@ -1236,10 +1334,11 @@ public class ScreenDecorationsTest extends SysuiTestCase {      }      @Test -    public void testHwcLayer_PrivacyDot() { +    public void testHwcLayer_PrivacyDot_FaceScanning() {          setupResources(0 /* radius */, 10 /* radiusTop */, 20 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */, +                true /* faceScanning */);          final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();          decorationSupport.format = PixelFormat.R_8;          doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport(); @@ -1257,13 +1356,16 @@ public class ScreenDecorationsTest extends SysuiTestCase {          verify(mDotViewController, times(1)).initialize(any(), any(), any(), any());          verify(mDotViewController, times(1)).setShowingListener(                  mScreenDecorations.mPrivacyDotShowingListener); + +        verifyFaceScanningViewExists(true);      }      @Test      public void testOnDisplayChanged_hwcLayer() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();          decorationSupport.format = PixelFormat.R_8;          doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport(); @@ -1288,7 +1390,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testOnDisplayChanged_nonHwcLayer() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          // top cutout          final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; @@ -1311,7 +1414,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testHasSameProvidersWithNullOverlays() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */); +                0 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */, +                false /* faceScanning */);          mScreenDecorations.start(); @@ -1329,7 +1433,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {      public void testHasSameProvidersWithPrivacyDots() {          setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,                  null /* roundedTopDrawable */, null /* roundedBottomDrawable */, -                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */); +                0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */, +                false /* faceScanning */);          mScreenDecorations.start(); @@ -1366,7 +1471,7 @@ public class ScreenDecorationsTest extends SysuiTestCase {      private void setupResources(int radius, int radiusTop, int radiusBottom,              @Nullable Drawable roundedTopDrawable, @Nullable Drawable roundedBottomDrawable, -            int roundedPadding, boolean fillCutout, boolean privacyDot) { +            int roundedPadding, boolean fillCutout, boolean privacyDot, boolean faceScanning) {          mContext.getOrCreateTestableResources().addOverride(                  com.android.internal.R.array.config_displayUniqueIdArray,                  new String[]{}); @@ -1418,6 +1523,13 @@ public class ScreenDecorationsTest extends SysuiTestCase {          }          when(mPrivacyDotDecorProviderFactory.getProviders()).thenReturn(mPrivacyDecorProviders);          when(mPrivacyDotDecorProviderFactory.getHasProviders()).thenReturn(privacyDot); + +        mFaceScanningProviders = new ArrayList<>(); +        if (faceScanning) { +            mFaceScanningProviders.add(mFaceScanningDecorProvider); +        } +        when(mFaceScanningProviderFactory.getProviders()).thenReturn(mFaceScanningProviders); +        when(mFaceScanningProviderFactory.getHasProviders()).thenReturn(faceScanning);      }      private DisplayCutout getDisplayCutoutForRotation(Insets safeInsets, Rect[] cutoutBounds) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt index 6a9bb3e343be..b61fbbe1ea75 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt @@ -520,6 +520,145 @@ ViewHierarchyAnimatorTest : SysuiTestCase() {          endAnimation(rootView)      } +    @Test +    fun animatesAppearingViewsFadeIn_alphaStartsAtZero_endsAtOne() { +        rootView.alpha = 0f +        ViewHierarchyAnimator.animateAddition(rootView, includeFadeIn = true) +        rootView.layout(50 /* l */, 50 /* t */, 100 /* r */, 100 /* b */) + +        advanceFadeInAnimation(rootView, fraction = 1f) +        endFadeInAnimation(rootView) + +        assertNull(rootView.getTag(R.id.tag_alpha_animator)) +        assertEquals(1f, rootView.alpha) +    } + +    @Test +    fun animatesAppearingViewsFadeIn_alphaStartsAboveZero_endsAtOne() { +        rootView.alpha = 0.2f +        ViewHierarchyAnimator.animateAddition(rootView, includeFadeIn = true) +        rootView.layout(50 /* l */, 50 /* t */, 100 /* r */, 100 /* b */) + +        advanceFadeInAnimation(rootView, fraction = 1f) +        endFadeInAnimation(rootView) + +        assertNull(rootView.getTag(R.id.tag_alpha_animator)) +        assertEquals(1f, rootView.alpha) +    } + +    @Test +    fun animatesAppearingViewsFadeIn_alphaStartsAsZero_alphaUpdatedMidAnimation() { +        rootView.alpha = 0f +        ViewHierarchyAnimator.animateAddition( +            rootView, +            includeFadeIn = true, +            fadeInInterpolator = Interpolators.LINEAR +        ) +        rootView.layout(50 /* l */, 50 /* t */, 100 /* r */, 100 /* b */) + +        advanceFadeInAnimation(rootView, fraction = 0.42f) + +        assertEquals(0.42f, rootView.alpha) +    } + +    @Test +    fun animatesAppearingViewsFadeIn_alphaStartsAboveZero_alphaUpdatedMidAnimation() { +        rootView.alpha = 0.6f +        ViewHierarchyAnimator.animateAddition( +            rootView, +            includeFadeIn = true, +            fadeInInterpolator = Interpolators.LINEAR +        ) +        rootView.layout(50 /* l */, 50 /* t */, 100 /* r */, 100 /* b */) + +        advanceFadeInAnimation(rootView, fraction = 0.5f) + +        assertEquals(0.8f, rootView.alpha) +    } + +    @Test +    fun animatesAppearingViewsFadeIn_childViewAlphasAlsoAnimated() { +        rootView.alpha = 0f +        val firstChild = View(context) +        firstChild.alpha = 0f +        val secondChild = View(context) +        secondChild.alpha = 0f +        rootView.addView(firstChild) +        rootView.addView(secondChild) + +        ViewHierarchyAnimator.animateAddition( +            rootView, +            includeFadeIn = true, +            fadeInInterpolator = Interpolators.LINEAR +        ) +        rootView.layout(50 /* l */, 50 /* t */, 100 /* r */, 100 /* b */) + +        advanceFadeInAnimation(rootView, fraction = 0.5f) + +        assertEquals(0.5f, rootView.alpha) +        assertEquals(0.5f, firstChild.alpha) +        assertEquals(0.5f, secondChild.alpha) +    } + +    @Test +    fun animatesAppearingViewsFadeIn_animatesFromPreviousAnimationProgress() { +        rootView.alpha = 0f +        ViewHierarchyAnimator.animateAddition( +            rootView, +            includeFadeIn = true, +            fadeInInterpolator = Interpolators.LINEAR +        ) +        rootView.layout(50 /* l */, 50 /* t */, 100 /* r */, 100 /* b */) + +        advanceFadeInAnimation(rootView, fraction = 0.5f) +        assertEquals(0.5f, rootView.alpha) +        assertNotNull(rootView.getTag(R.id.tag_alpha_animator)) + +        // IF we request animation again +        ViewHierarchyAnimator.animateAddition( +            rootView, +            includeFadeIn = true, +            fadeInInterpolator = Interpolators.LINEAR +        ) + +        // THEN the alpha remains at its current value (it doesn't get reset to 0) +        assertNotNull(rootView.getTag(R.id.tag_alpha_animator)) +        assertEquals(0.5f, rootView.alpha) + +        // IF we advance the new animation to the end +        advanceFadeInAnimation(rootView, fraction = 1f) +        endFadeInAnimation(rootView) + +        // THEN we still end at the correct value +        assertNull(rootView.getTag(R.id.tag_alpha_animator)) +        assertEquals(1f, rootView.alpha) +    } + +    @Test +    fun animatesAppearingViews_fadeInFalse_alphasNotUpdated() { +        rootView.alpha = 0.3f +        val firstChild = View(context) +        firstChild.alpha = 0.4f +        val secondChild = View(context) +        secondChild.alpha = 0.5f +        rootView.addView(firstChild) +        rootView.addView(secondChild) + +        ViewHierarchyAnimator.animateAddition( +            rootView, +            includeFadeIn = false, +            fadeInInterpolator = Interpolators.LINEAR +        ) +        rootView.layout(50 /* l */, 50 /* t */, 100 /* r */, 100 /* b */) + +        advanceFadeInAnimation(rootView, fraction = 1f) + +        assertEquals(0.3f, rootView.alpha) +        assertEquals(0.4f, firstChild.alpha) +        assertEquals(0.5f, secondChild.alpha) +    } + +    @Test      fun animatesViewRemovalFromStartToEnd() {          setUpRootWithChildren() @@ -1003,6 +1142,16 @@ ViewHierarchyAnimatorTest : SysuiTestCase() {          }      } +    private fun advanceFadeInAnimation(rootView: View, fraction: Float) { +        (rootView.getTag(R.id.tag_alpha_animator) as? ObjectAnimator)?.setCurrentFraction(fraction) + +        if (rootView is ViewGroup) { +            for (i in 0 until rootView.childCount) { +                advanceFadeInAnimation(rootView.getChildAt(i), fraction) +            } +        } +    } +      private fun endAnimation(rootView: View) {          (rootView.getTag(R.id.tag_animator) as? ObjectAnimator)?.end() @@ -1012,4 +1161,14 @@ ViewHierarchyAnimatorTest : SysuiTestCase() {              }          }      } + +    private fun endFadeInAnimation(rootView: View) { +        (rootView.getTag(R.id.tag_alpha_animator) as? ObjectAnimator)?.end() + +        if (rootView is ViewGroup) { +            for (i in 0 until rootView.childCount) { +                endFadeInAnimation(rootView.getChildAt(i)) +            } +        } +    }  } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintAndFaceViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintAndFaceViewTest.kt new file mode 100644 index 000000000000..328ad39cddd5 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintAndFaceViewTest.kt @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics + +import android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE +import android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.testing.TestableLooper.RunWithLooper +import android.view.View +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.junit.MockitoJUnit + +@RunWith(AndroidTestingRunner::class) +@RunWithLooper(setAsMainLooper = true) +@SmallTest +class AuthBiometricFingerprintAndFaceViewTest : SysuiTestCase() { + +    @JvmField @Rule +    var mockitoRule = MockitoJUnit.rule() + +    @Mock +    private lateinit var callback: AuthBiometricView.Callback +    @Mock +    private lateinit var panelController: AuthPanelController + +    private lateinit var biometricView: AuthBiometricFingerprintAndFaceView + +    @Before +    fun setup() { +        biometricView = R.layout.auth_biometric_fingerprint_and_face_view +                .asTestAuthBiometricView(mContext, callback, panelController) +        waitForIdleSync() +    } + +    @After +    fun tearDown() { +        biometricView.destroyDialog() +    } + +    @Test +    fun fingerprintSuccessDoesNotRequireExplicitConfirmation() { +        biometricView.onDialogAnimatedIn() +        biometricView.onAuthenticationSucceeded(TYPE_FINGERPRINT) +        waitForIdleSync() + +        assertThat(biometricView.isAuthenticated).isTrue() +        verify(callback).onAction(AuthBiometricView.Callback.ACTION_AUTHENTICATED) +    } + +    @Test +    fun faceSuccessRequiresExplicitConfirmation() { +        biometricView.onDialogAnimatedIn() +        biometricView.onAuthenticationSucceeded(TYPE_FACE) +        waitForIdleSync() + +        assertThat(biometricView.isAuthenticated).isFalse() +        assertThat(biometricView.isAuthenticating).isFalse() +        assertThat(biometricView.mConfirmButton.visibility).isEqualTo(View.GONE) +        verify(callback, never()).onAction(AuthBiometricView.Callback.ACTION_AUTHENTICATED) + +        // icon acts as confirm button +        biometricView.mIconView.performClick() +        waitForIdleSync() + +        assertThat(biometricView.isAuthenticated).isTrue() +        verify(callback).onAction(AuthBiometricView.Callback.ACTION_AUTHENTICATED) +    } + +    @Test +    fun ignoresFaceErrors() { +        biometricView.onDialogAnimatedIn() +        biometricView.onError(TYPE_FACE, "not a face") +        waitForIdleSync() + +        assertThat(biometricView.isAuthenticating).isTrue() +        verify(callback, never()).onAction(AuthBiometricView.Callback.ACTION_ERROR) + +        biometricView.onError(TYPE_FINGERPRINT, "that's a nope") +        waitForIdleSync() + +        verify(callback).onAction(AuthBiometricView.Callback.ACTION_ERROR) +    } + +    override fun waitForIdleSync() = TestableLooper.get(this).processAllMessages() +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintViewTest.kt new file mode 100644 index 000000000000..687cb517b2f4 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFingerprintViewTest.kt @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.biometrics + +import android.hardware.biometrics.BiometricAuthenticator +import android.os.Bundle +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.testing.TestableLooper.RunWithLooper +import android.view.View +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers +import org.mockito.ArgumentMatchers.eq +import org.mockito.Mock +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.junit.MockitoJUnit + +@RunWith(AndroidTestingRunner::class) +@RunWithLooper(setAsMainLooper = true) +@SmallTest +class AuthBiometricFingerprintViewTest : SysuiTestCase() { + +    @JvmField @Rule +    val mockitoRule = MockitoJUnit.rule() + +    @Mock +    private lateinit var callback: AuthBiometricView.Callback +    @Mock +    private lateinit var panelController: AuthPanelController + +    private lateinit var biometricView: AuthBiometricView + +    private fun createView(allowDeviceCredential: Boolean = false): AuthBiometricFingerprintView { +        val view = R.layout.auth_biometric_fingerprint_view.asTestAuthBiometricView( +                mContext, callback, panelController, allowDeviceCredential = allowDeviceCredential +        ) as AuthBiometricFingerprintView +        waitForIdleSync() +        return view +    } + +    @Before +    fun setup() { +        biometricView = createView() +    } + +    @After +    fun tearDown() { +        biometricView.destroyDialog() +    } + +    @Test +    fun testOnAuthenticationSucceeded_noConfirmationRequired_sendsActionAuthenticated() { +        biometricView.onAuthenticationSucceeded(BiometricAuthenticator.TYPE_FINGERPRINT) +        waitForIdleSync() + +        assertThat(biometricView.isAuthenticated).isTrue() +        verify(callback).onAction(AuthBiometricView.Callback.ACTION_AUTHENTICATED) +    } + +    @Test +    fun testOnAuthenticationSucceeded_confirmationRequired_updatesDialogContents() { +        biometricView.setRequireConfirmation(true) +        biometricView.onAuthenticationSucceeded(BiometricAuthenticator.TYPE_FINGERPRINT) +        waitForIdleSync() + +        // TODO: this should be tested in the subclasses +        if (biometricView.supportsRequireConfirmation()) { +            verify(callback, never()).onAction(ArgumentMatchers.anyInt()) +            assertThat(biometricView.mNegativeButton.visibility).isEqualTo(View.GONE) +            assertThat(biometricView.mCancelButton.visibility).isEqualTo(View.VISIBLE) +            assertThat(biometricView.mCancelButton.isEnabled).isTrue() +            assertThat(biometricView.mConfirmButton.isEnabled).isTrue() +            assertThat(biometricView.mIndicatorView.text) +                    .isEqualTo(mContext.getText(R.string.biometric_dialog_tap_confirm)) +            assertThat(biometricView.mIndicatorView.visibility).isEqualTo(View.VISIBLE) +        } else { +            assertThat(biometricView.isAuthenticated).isTrue() +            verify(callback).onAction(eq(AuthBiometricView.Callback.ACTION_AUTHENTICATED)) +        } +    } + +    @Test +    fun testPositiveButton_sendsActionAuthenticated() { +        biometricView.mConfirmButton.performClick() +        waitForIdleSync() + +        verify(callback).onAction(AuthBiometricView.Callback.ACTION_AUTHENTICATED) +        assertThat(biometricView.isAuthenticated).isTrue() +    } + +    @Test +    fun testNegativeButton_beforeAuthentication_sendsActionButtonNegative() { +        biometricView.onDialogAnimatedIn() +        biometricView.mNegativeButton.performClick() +        waitForIdleSync() + +        verify(callback).onAction(AuthBiometricView.Callback.ACTION_BUTTON_NEGATIVE) +    } + +    @Test +    fun testCancelButton_whenPendingConfirmation_sendsActionUserCanceled() { +        biometricView.setRequireConfirmation(true) +        biometricView.onAuthenticationSucceeded(BiometricAuthenticator.TYPE_FINGERPRINT) + +        assertThat(biometricView.mNegativeButton.visibility).isEqualTo(View.GONE) +        biometricView.mCancelButton.performClick() +        waitForIdleSync() + +        verify(callback).onAction(AuthBiometricView.Callback.ACTION_USER_CANCELED) +    } + +    @Test +    fun testTryAgainButton_sendsActionTryAgain() { +        biometricView.mTryAgainButton.performClick() +        waitForIdleSync() + +        verify(callback).onAction(AuthBiometricView.Callback.ACTION_BUTTON_TRY_AGAIN) +        assertThat(biometricView.mTryAgainButton.visibility).isEqualTo(View.GONE) +        assertThat(biometricView.isAuthenticating).isTrue() +    } + +    @Test +    fun testOnErrorSendsActionError() { +        biometricView.onError(BiometricAuthenticator.TYPE_FACE, "testError") +        waitForIdleSync() + +        verify(callback).onAction(eq(AuthBiometricView.Callback.ACTION_ERROR)) +    } + +    @Test +    fun testOnErrorShowsMessage() { +        // prevent error state from instantly returning to authenticating in the test +        biometricView.mAnimationDurationHideDialog = 10_000 + +        val message = "another error" +        biometricView.onError(BiometricAuthenticator.TYPE_FACE, message) +        waitForIdleSync() + +        assertThat(biometricView.isAuthenticating).isFalse() +        assertThat(biometricView.isAuthenticated).isFalse() +        assertThat(biometricView.mIndicatorView.visibility).isEqualTo(View.VISIBLE) +        assertThat(biometricView.mIndicatorView.text).isEqualTo(message) +    } + +    @Test +    fun testBackgroundClicked_sendsActionUserCanceled() { +        val view = View(mContext) +        biometricView.setBackgroundView(view) +        view.performClick() + +        verify(callback).onAction(eq(AuthBiometricView.Callback.ACTION_USER_CANCELED)) +    } + +    @Test +    fun testBackgroundClicked_afterAuthenticated_neverSendsUserCanceled() { +        val view = View(mContext) +        biometricView.setBackgroundView(view) +        biometricView.onAuthenticationSucceeded(BiometricAuthenticator.TYPE_FINGERPRINT) +        view.performClick() + +        verify(callback, never()) +                .onAction(eq(AuthBiometricView.Callback.ACTION_USER_CANCELED)) +    } + +    @Test +    fun testBackgroundClicked_whenSmallDialog_neverSendsUserCanceled() { +        biometricView.mLayoutParams = AuthDialog.LayoutParams(0, 0) +        biometricView.updateSize(AuthDialog.SIZE_SMALL) +        val view = View(mContext) +        biometricView.setBackgroundView(view) +        view.performClick() + +        verify(callback, never()).onAction(eq(AuthBiometricView.Callback.ACTION_USER_CANCELED)) +    } + +    @Test +    fun testIgnoresUselessHelp() { +        biometricView.mAnimationDurationHideDialog = 10_000 +        biometricView.onDialogAnimatedIn() +        waitForIdleSync() + +        assertThat(biometricView.isAuthenticating).isTrue() + +        val helpText = biometricView.mIndicatorView.text +        biometricView.onHelp(BiometricAuthenticator.TYPE_FINGERPRINT, "") +        waitForIdleSync() + +        // text should not change +        assertThat(biometricView.mIndicatorView.text).isEqualTo(helpText) +        verify(callback, never()).onAction(eq(AuthBiometricView.Callback.ACTION_ERROR)) +    } + +    @Test +    fun testRestoresState() { +        val requireConfirmation = true +        biometricView.mAnimationDurationHideDialog = 10_000 +        val failureMessage = "testFailureMessage" +        biometricView.setRequireConfirmation(requireConfirmation) +        biometricView.onAuthenticationFailed(BiometricAuthenticator.TYPE_FACE, failureMessage) +        waitForIdleSync() + +        val state = Bundle() +        biometricView.onSaveState(state) +        assertThat(biometricView.mTryAgainButton.visibility).isEqualTo(View.GONE) +        assertThat(state.getInt(AuthDialog.KEY_BIOMETRIC_TRY_AGAIN_VISIBILITY)) +            .isEqualTo(View.GONE) +        assertThat(state.getInt(AuthDialog.KEY_BIOMETRIC_STATE)) +            .isEqualTo(AuthBiometricView.STATE_ERROR) +        assertThat(biometricView.mIndicatorView.visibility).isEqualTo(View.VISIBLE) +        assertThat(state.getBoolean(AuthDialog.KEY_BIOMETRIC_INDICATOR_ERROR_SHOWING)).isTrue() +        assertThat(biometricView.mIndicatorView.text).isEqualTo(failureMessage) +        assertThat(state.getString(AuthDialog.KEY_BIOMETRIC_INDICATOR_STRING)) +            .isEqualTo(failureMessage) + +        // TODO: Test dialog size. Should move requireConfirmation to buildBiometricPromptBundle + +        // Create new dialog and restore the previous state into it +        biometricView.destroyDialog() +        biometricView = createView() +        biometricView.restoreState(state) +        biometricView.mAnimationDurationHideDialog = 10_000 +        biometricView.setRequireConfirmation(requireConfirmation) +        waitForIdleSync() + +        assertThat(biometricView.mTryAgainButton.visibility).isEqualTo(View.GONE) +        assertThat(biometricView.mIndicatorView.visibility).isEqualTo(View.VISIBLE) + +        // TODO: Test restored text. Currently cannot test this, since it gets restored only after +        // dialog size is known. +    } + +    @Test +    fun testCredentialButton_whenDeviceCredentialAllowed() { +        biometricView.destroyDialog() +        biometricView = createView(allowDeviceCredential = true) + +        assertThat(biometricView.mUseCredentialButton.visibility).isEqualTo(View.VISIBLE) +        assertThat(biometricView.mNegativeButton.visibility).isEqualTo(View.GONE) + +        biometricView.mUseCredentialButton.performClick() +        waitForIdleSync() + +        verify(callback).onAction(AuthBiometricView.Callback.ACTION_USE_DEVICE_CREDENTIAL) +    } + +    override fun waitForIdleSync() = TestableLooper.get(this).processAllMessages() +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java deleted file mode 100644 index f99b20d47ab8..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java +++ /dev/null @@ -1,324 +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. - */ - -package com.android.systemui.biometrics; - -import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; -import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; -import static android.hardware.biometrics.BiometricManager.Authenticators; - -import static com.android.systemui.biometrics.AuthBiometricView.Callback.ACTION_AUTHENTICATED; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -import android.hardware.biometrics.PromptInfo; -import android.os.Bundle; -import android.test.suitebuilder.annotation.SmallTest; -import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; -import android.testing.TestableLooper.RunWithLooper; -import android.testing.ViewUtils; -import android.view.LayoutInflater; -import android.view.View; - -import com.android.systemui.R; -import com.android.systemui.SysuiTestCase; - -import org.junit.After; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -@RunWith(AndroidTestingRunner.class) -@RunWithLooper -@SmallTest -public class AuthBiometricViewTest extends SysuiTestCase { - -    @Rule -    public final MockitoRule mMockitoRule = MockitoJUnit.rule(); - -    @Mock -    private AuthBiometricView.Callback mCallback; -    @Mock -    private AuthPanelController mPanelController; - -    private AuthBiometricView mBiometricView; - -    @After -    public void tearDown() { -        destroyDialog(); -    } - -    @Test -    public void testOnAuthenticationSucceeded_noConfirmationRequired_sendsActionAuthenticated() { -        initDialog(false /* allowDeviceCredential */, mCallback); - -        // The onAuthenticated runnable is posted when authentication succeeds. -        mBiometricView.onAuthenticationSucceeded(TYPE_FINGERPRINT); -        waitForIdleSync(); -        assertEquals(AuthBiometricView.STATE_AUTHENTICATED, mBiometricView.mState); -        verify(mCallback).onAction(ACTION_AUTHENTICATED); -    } - -    @Test -    public void testOnAuthenticationSucceeded_confirmationRequired_updatesDialogContents() { -        initDialog(false /* allowDeviceCredential */, mCallback); - -        mBiometricView.setRequireConfirmation(true); -        mBiometricView.onAuthenticationSucceeded(TYPE_FINGERPRINT); -        waitForIdleSync(); - -        // TODO: this should be tested in the subclasses -        if (mBiometricView.supportsRequireConfirmation()) { -            assertEquals(AuthBiometricView.STATE_PENDING_CONFIRMATION, mBiometricView.mState); - -            verify(mCallback, never()).onAction(anyInt()); - -            assertEquals(View.GONE, mBiometricView.mNegativeButton.getVisibility()); -            assertEquals(View.VISIBLE, mBiometricView.mCancelButton.getVisibility()); -            assertTrue(mBiometricView.mCancelButton.isEnabled()); - -            assertTrue(mBiometricView.mConfirmButton.isEnabled()); -            assertEquals(mContext.getText(R.string.biometric_dialog_tap_confirm), -                    mBiometricView.mIndicatorView.getText()); -            assertEquals(View.VISIBLE, mBiometricView.mIndicatorView.getVisibility()); -        } else { -            assertEquals(AuthBiometricView.STATE_AUTHENTICATED, mBiometricView.mState); -            verify(mCallback).onAction(eq(ACTION_AUTHENTICATED)); -        } - -    } - -    @Test -    public void testPositiveButton_sendsActionAuthenticated() { -        initDialog(false /* allowDeviceCredential */, mCallback); - -        mBiometricView.mConfirmButton.performClick(); -        waitForIdleSync(); - -        verify(mCallback).onAction(ACTION_AUTHENTICATED); -        assertEquals(AuthBiometricView.STATE_AUTHENTICATED, mBiometricView.mState); -    } - -    @Test -    public void testNegativeButton_beforeAuthentication_sendsActionButtonNegative() { -        initDialog(false /* allowDeviceCredential */, mCallback); - -        mBiometricView.onDialogAnimatedIn(); -        mBiometricView.mNegativeButton.performClick(); -        waitForIdleSync(); - -        verify(mCallback).onAction(AuthBiometricView.Callback.ACTION_BUTTON_NEGATIVE); -    } - -    @Test -    public void testCancelButton_whenPendingConfirmation_sendsActionUserCanceled() { -        initDialog(false /* allowDeviceCredential */, mCallback); - -        mBiometricView.setRequireConfirmation(true); -        mBiometricView.onAuthenticationSucceeded(TYPE_FINGERPRINT); - -        assertEquals(View.GONE, mBiometricView.mNegativeButton.getVisibility()); - -        mBiometricView.mCancelButton.performClick(); -        waitForIdleSync(); - -        verify(mCallback).onAction(AuthBiometricView.Callback.ACTION_USER_CANCELED); -    } - -    @Test -    public void testTryAgainButton_sendsActionTryAgain() { -        initDialog(false /* allowDeviceCredential */, mCallback); - -        mBiometricView.mTryAgainButton.performClick(); -        waitForIdleSync(); - -        verify(mCallback).onAction(AuthBiometricView.Callback.ACTION_BUTTON_TRY_AGAIN); -        assertEquals(AuthBiometricView.STATE_AUTHENTICATING, mBiometricView.mState); -    } - -    @Test -    @Ignore("flaky, b/189031816") -    public void testError_sendsActionError() { -        initDialog(false /* allowDeviceCredential */, mCallback); -        final String testError = "testError"; -        mBiometricView.onError(TYPE_FACE, testError); -        waitForIdleSync(); - -        verify(mCallback).onAction(eq(AuthBiometricView.Callback.ACTION_ERROR)); -        assertEquals(AuthBiometricView.STATE_IDLE, mBiometricView.mState); -    } - -    @Test -    public void testBackgroundClicked_sendsActionUserCanceled() { -        initDialog(false /* allowDeviceCredential */, mCallback); - -        View view = new View(mContext); -        mBiometricView.setBackgroundView(view); -        view.performClick(); -        verify(mCallback).onAction(eq(AuthBiometricView.Callback.ACTION_USER_CANCELED)); -    } - -    @Test -    public void testBackgroundClicked_afterAuthenticated_neverSendsUserCanceled() { -        initDialog(false /* allowDeviceCredential */, mCallback); - -        View view = new View(mContext); -        mBiometricView.setBackgroundView(view); -        mBiometricView.onAuthenticationSucceeded(TYPE_FINGERPRINT); -        view.performClick(); -        verify(mCallback, never()).onAction(eq(AuthBiometricView.Callback.ACTION_USER_CANCELED)); -    } - -    @Test -    public void testBackgroundClicked_whenSmallDialog_neverSendsUserCanceled() { -        initDialog(false /* allowDeviceCredential */, mCallback); -        mBiometricView.mLayoutParams = new AuthDialog.LayoutParams(0, 0); -        mBiometricView.updateSize(AuthDialog.SIZE_SMALL); - -        View view = new View(mContext); -        mBiometricView.setBackgroundView(view); -        view.performClick(); -        verify(mCallback, never()).onAction(eq(AuthBiometricView.Callback.ACTION_USER_CANCELED)); -    } - -    @Test -    public void testIgnoresUselessHelp() { -        initDialog(false /* allowDeviceCredential */, mCallback); - -        mBiometricView.onDialogAnimatedIn(); -        waitForIdleSync(); - -        assertEquals(AuthBiometricView.STATE_AUTHENTICATING, mBiometricView.mState); - -        mBiometricView.onHelp(TYPE_FINGERPRINT, ""); -        waitForIdleSync(); - -        assertEquals("", mBiometricView.mIndicatorView.getText()); -        verify(mCallback, never()).onAction(eq(AuthBiometricView.Callback.ACTION_ERROR)); -        assertEquals(AuthBiometricView.STATE_AUTHENTICATING, mBiometricView.mState); -    } - -    @Test -    public void testRestoresState() { -        final boolean requireConfirmation = true; - -        initDialog(false /* allowDeviceCredential */, mCallback, null, 10000); - -        final String failureMessage = "testFailureMessage"; -        mBiometricView.setRequireConfirmation(requireConfirmation); -        mBiometricView.onAuthenticationFailed(TYPE_FACE, failureMessage); -        waitForIdleSync(); - -        Bundle state = new Bundle(); -        mBiometricView.onSaveState(state); - -        assertEquals(View.GONE, mBiometricView.mTryAgainButton.getVisibility()); -        assertEquals(View.GONE, state.getInt(AuthDialog.KEY_BIOMETRIC_TRY_AGAIN_VISIBILITY)); - -        assertEquals(AuthBiometricView.STATE_ERROR, mBiometricView.mState); -        assertEquals(AuthBiometricView.STATE_ERROR, state.getInt(AuthDialog.KEY_BIOMETRIC_STATE)); - -        assertEquals(View.VISIBLE, mBiometricView.mIndicatorView.getVisibility()); -        assertTrue(state.getBoolean(AuthDialog.KEY_BIOMETRIC_INDICATOR_ERROR_SHOWING)); - -        assertEquals(failureMessage, mBiometricView.mIndicatorView.getText()); -        assertEquals(failureMessage, state.getString(AuthDialog.KEY_BIOMETRIC_INDICATOR_STRING)); - -        // TODO: Test dialog size. Should move requireConfirmation to buildBiometricPromptBundle - -        // Create new dialog and restore the previous state into it -        destroyDialog(); -        initDialog(false /* allowDeviceCredential */, mCallback, state, 10000); -        mBiometricView.mAnimationDurationHideDialog = 10000; -        mBiometricView.setRequireConfirmation(requireConfirmation); -        waitForIdleSync(); - -        assertEquals(View.GONE, mBiometricView.mTryAgainButton.getVisibility()); -        assertEquals(AuthBiometricView.STATE_ERROR, mBiometricView.mState); -        assertEquals(View.VISIBLE, mBiometricView.mIndicatorView.getVisibility()); - -        // TODO: Test restored text. Currently cannot test this, since it gets restored only after -        // dialog size is known. -    } - -    @Test -    public void testCredentialButton_whenDeviceCredentialAllowed() throws InterruptedException { -        initDialog(true /* allowDeviceCredential */, mCallback); - -        assertEquals(View.VISIBLE, mBiometricView.mUseCredentialButton.getVisibility()); -        assertEquals(View.GONE, mBiometricView.mNegativeButton.getVisibility()); -        mBiometricView.mUseCredentialButton.performClick(); -        waitForIdleSync(); - -        verify(mCallback).onAction(AuthBiometricView.Callback.ACTION_USE_DEVICE_CREDENTIAL); -    } - -    private PromptInfo buildPromptInfo(boolean allowDeviceCredential) { -        PromptInfo promptInfo = new PromptInfo(); -        promptInfo.setTitle("Title"); -        int authenticators = Authenticators.BIOMETRIC_WEAK; -        if (allowDeviceCredential) { -            authenticators |= Authenticators.DEVICE_CREDENTIAL; -        } else { -            promptInfo.setNegativeButtonText("Negative"); -        } -        promptInfo.setAuthenticators(authenticators); -        return promptInfo; -    } - -    private void initDialog(boolean allowDeviceCredential, AuthBiometricView.Callback callback) { -        initDialog(allowDeviceCredential, callback, -                null /* savedState */, 0 /* hideDelay */); -    } - -    private void initDialog(boolean allowDeviceCredential, -            AuthBiometricView.Callback callback, Bundle savedState, int hideDelay) { -        final LayoutInflater inflater = LayoutInflater.from(mContext); -        mBiometricView = (AuthBiometricView) inflater.inflate( -                R.layout.auth_biometric_view, null, false); -        mBiometricView.mAnimationDurationLong = 0; -        mBiometricView.mAnimationDurationShort = 0; -        mBiometricView.mAnimationDurationHideDialog = hideDelay; -        mBiometricView.setPromptInfo(buildPromptInfo(allowDeviceCredential)); -        mBiometricView.setCallback(callback); -        mBiometricView.restoreState(savedState); -        ViewUtils.attachView(mBiometricView); -        mBiometricView.setPanelController(mPanelController); -        waitForIdleSync(); -    } - -    private void destroyDialog() { -        if (mBiometricView != null && mBiometricView.isAttachedToWindow()) { -            ViewUtils.detachView(mBiometricView); -        } -    } - -    @Override -    protected void waitForIdleSync() { -        TestableLooper.get(this).processAllMessages(); -        super.waitForIdleSync(); -    } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt index 52b5857a2106..bc5a4d3d274e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt @@ -16,13 +16,11 @@  package com.android.systemui.biometrics  import android.app.admin.DevicePolicyManager +import android.hardware.biometrics.BiometricAuthenticator  import android.hardware.biometrics.BiometricConstants  import android.hardware.biometrics.BiometricManager -import android.hardware.biometrics.ComponentInfoInternal  import android.hardware.biometrics.PromptInfo -import android.hardware.biometrics.SensorProperties  import android.hardware.face.FaceSensorPropertiesInternal -import android.hardware.fingerprint.FingerprintSensorProperties  import android.hardware.fingerprint.FingerprintSensorPropertiesInternal  import android.os.Handler  import android.os.IBinder @@ -36,11 +34,11 @@ import android.view.WindowInsets  import android.view.WindowManager  import android.widget.ScrollView  import androidx.test.filters.SmallTest +import com.android.internal.jank.InteractionJankMonitor  import com.android.internal.widget.LockPatternUtils  import com.android.systemui.R  import com.android.systemui.SysuiTestCase  import com.android.systemui.keyguard.WakefulnessLifecycle -import com.android.systemui.util.concurrency.DelayableExecutor  import com.android.systemui.util.concurrency.FakeExecutor  import com.android.systemui.util.time.FakeSystemClock  import com.google.common.truth.Truth.assertThat @@ -57,12 +55,12 @@ import org.mockito.junit.MockitoJUnit  import org.mockito.Mockito.`when` as whenever  @RunWith(AndroidTestingRunner::class) -@RunWithLooper +@RunWithLooper(setAsMainLooper = true)  @SmallTest  class AuthContainerViewTest : SysuiTestCase() {      @JvmField @Rule -    var rule = MockitoJUnit.rule() +    var mockitoRule = MockitoJUnit.rule()      @Mock      lateinit var callback: AuthDialogCallback @@ -74,6 +72,8 @@ class AuthContainerViewTest : SysuiTestCase() {      lateinit var wakefulnessLifecycle: WakefulnessLifecycle      @Mock      lateinit var windowToken: IBinder +    @Mock +    lateinit var interactionJankMonitor: InteractionJankMonitor      private var authContainer: TestAuthContainerView? = null @@ -86,13 +86,13 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testNotifiesAnimatedIn() { -        initializeContainer() +        initializeFingerprintContainer()          verify(callback).onDialogAnimatedIn()      }      @Test      fun testIgnoresAnimatedInWhenDismissed() { -        val container = initializeContainer(addToView = false) +        val container = initializeFingerprintContainer(addToView = false)          container.dismissFromSystemServer()          waitForIdleSync() @@ -107,7 +107,7 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testDismissesOnFocusLoss() { -        val container = initializeContainer() +        val container = initializeFingerprintContainer()          waitForIdleSync()          verify(callback).onDialogAnimatedIn() @@ -124,7 +124,7 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testActionAuthenticated_sendsDismissedAuthenticated() { -        val container = initializeContainer() +        val container = initializeFingerprintContainer()          container.mBiometricCallback.onAction(              AuthBiometricView.Callback.ACTION_AUTHENTICATED          ) @@ -139,7 +139,7 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testActionUserCanceled_sendsDismissedUserCanceled() { -        val container = initializeContainer() +        val container = initializeFingerprintContainer()          container.mBiometricCallback.onAction(              AuthBiometricView.Callback.ACTION_USER_CANCELED          ) @@ -157,7 +157,7 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testActionButtonNegative_sendsDismissedButtonNegative() { -        val container = initializeContainer() +        val container = initializeFingerprintContainer()          container.mBiometricCallback.onAction(              AuthBiometricView.Callback.ACTION_BUTTON_NEGATIVE          ) @@ -172,7 +172,9 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testActionTryAgain_sendsTryAgain() { -        val container = initializeContainer(BiometricManager.Authenticators.BIOMETRIC_WEAK) +        val container = initializeFingerprintContainer( +            authenticators = BiometricManager.Authenticators.BIOMETRIC_WEAK +        )          container.mBiometricCallback.onAction(              AuthBiometricView.Callback.ACTION_BUTTON_TRY_AGAIN          ) @@ -183,8 +185,8 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testActionError_sendsDismissedError() { -        val container = initializeContainer() -        authContainer!!.mBiometricCallback.onAction( +        val container = initializeFingerprintContainer() +        container.mBiometricCallback.onAction(              AuthBiometricView.Callback.ACTION_ERROR          )          waitForIdleSync() @@ -198,8 +200,8 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testActionUseDeviceCredential_sendsOnDeviceCredentialPressed() { -        val container = initializeContainer( -            BiometricManager.Authenticators.BIOMETRIC_WEAK or +        val container = initializeFingerprintContainer( +            authenticators = BiometricManager.Authenticators.BIOMETRIC_WEAK or                      BiometricManager.Authenticators.DEVICE_CREDENTIAL          )          container.mBiometricCallback.onAction( @@ -213,8 +215,8 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testAnimateToCredentialUI_invokesStartTransitionToCredentialUI() { -        val container = initializeContainer( -            BiometricManager.Authenticators.BIOMETRIC_WEAK or +        val container = initializeFingerprintContainer( +            authenticators = BiometricManager.Authenticators.BIOMETRIC_WEAK or                      BiometricManager.Authenticators.DEVICE_CREDENTIAL          )          container.animateToCredentialUI() @@ -225,7 +227,7 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testShowBiometricUI() { -        val container = initializeContainer() +        val container = initializeFingerprintContainer()          waitForIdleSync() @@ -235,7 +237,9 @@ class AuthContainerViewTest : SysuiTestCase() {      @Test      fun testShowCredentialUI() { -        val container = initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) +        val container = initializeFingerprintContainer( +            authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL +        )          waitForIdleSync()          assertThat(container.hasCredentialView()).isTrue() @@ -249,7 +253,9 @@ class AuthContainerViewTest : SysuiTestCase() {              DevicePolicyManager.PASSWORD_QUALITY_SOMETHING          ) -        val container = initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) +        val container = initializeFingerprintContainer( +            authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL +        )          waitForIdleSync()          assertThat(container.hasCredentialPatternView()).isTrue() @@ -266,7 +272,9 @@ class AuthContainerViewTest : SysuiTestCase() {          // In the credential view, clicking on the background (to cancel authentication) is not          // valid. Thus, the listener should be null, and it should not be in the accessibility          // hierarchy. -        val container = initializeContainer(BiometricManager.Authenticators.DEVICE_CREDENTIAL) +        val container = initializeFingerprintContainer( +            authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL +        )          waitForIdleSync()          assertThat(container.hasCredentialPasswordView()).isTrue() @@ -294,49 +302,52 @@ class AuthContainerViewTest : SysuiTestCase() {          assertThat((layoutParams.fitInsetsTypes and WindowInsets.Type.ime()) == 0).isTrue()      } -    private fun initializeContainer( +    @Test +    fun coexFaceRestartsOnTouch() { +        val container = initializeCoexContainer() + +        container.onPointerDown() +        waitForIdleSync() + +        container.onAuthenticationFailed(BiometricAuthenticator.TYPE_FACE, "failed") +        waitForIdleSync() + +        verify(callback, never()).onTryAgainPressed() + +        container.onPointerDown() +        waitForIdleSync() + +        verify(callback).onTryAgainPressed() +    } + +    private fun initializeFingerprintContainer( +        authenticators: Int = BiometricManager.Authenticators.BIOMETRIC_WEAK, +        addToView: Boolean = true +    ) = initializeContainer( +        TestAuthContainerView( +            authenticators = authenticators, +            fingerprintProps = fingerprintSensorPropertiesInternal() +        ), +        addToView +    ) + +    private fun initializeCoexContainer(          authenticators: Int = BiometricManager.Authenticators.BIOMETRIC_WEAK,          addToView: Boolean = true +    ) = initializeContainer( +        TestAuthContainerView( +            authenticators = authenticators, +            fingerprintProps = fingerprintSensorPropertiesInternal(), +            faceProps = faceSensorPropertiesInternal() +        ), +        addToView +    ) + +    private fun initializeContainer( +        view: TestAuthContainerView, +        addToView: Boolean      ): TestAuthContainerView { -        val config = AuthContainerView.Config() -        config.mContext = mContext -        config.mCallback = callback -        config.mSensorIds = intArrayOf(0) -        config.mSkipAnimation = true -        config.mPromptInfo = PromptInfo() -        config.mPromptInfo.authenticators = authenticators -        val componentInfo = listOf( -            ComponentInfoInternal( -                "faceSensor" /* componentId */, -                "vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */, -                "00000001" /* serialNumber */, "" /* softwareVersion */ -            ), -            ComponentInfoInternal( -                "matchingAlgorithm" /* componentId */, -                "" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */, -                "vendor/version/revision" /* softwareVersion */ -            ) -        ) -        val fpProps = listOf( -            FingerprintSensorPropertiesInternal( -                0, -                SensorProperties.STRENGTH_STRONG, -                5 /* maxEnrollmentsPerUser */, -                componentInfo, -                FingerprintSensorProperties.TYPE_REAR, -                false /* resetLockoutRequiresHardwareAuthToken */ -            ) -        ) -        authContainer = TestAuthContainerView( -            config, -            fpProps, -            listOf(), -            wakefulnessLifecycle, -            userManager, -            lockPatternUtils, -            Handler(TestableLooper.get(this).looper), -            FakeExecutor(FakeSystemClock()) -        ) +        authContainer = view          if (addToView) {              authContainer!!.addToView() @@ -346,27 +357,35 @@ class AuthContainerViewTest : SysuiTestCase() {      }      private inner class TestAuthContainerView( -        config: Config, -        fpProps: List<FingerprintSensorPropertiesInternal>, -        faceProps: List<FaceSensorPropertiesInternal>, -        wakefulnessLifecycle: WakefulnessLifecycle, -        userManager: UserManager, -        lockPatternUtils: LockPatternUtils, -        mainHandler: Handler, -        bgExecutor: DelayableExecutor +        authenticators: Int = BiometricManager.Authenticators.BIOMETRIC_WEAK, +        fingerprintProps: List<FingerprintSensorPropertiesInternal> = listOf(), +        faceProps: List<FaceSensorPropertiesInternal> = listOf()      ) : AuthContainerView( -        config, fpProps, faceProps, -        wakefulnessLifecycle, userManager, lockPatternUtils, mainHandler, bgExecutor +        Config().apply { +            mContext = this@AuthContainerViewTest.context +            mCallback = callback +            mSensorIds = (fingerprintProps.map { it.sensorId } + +                faceProps.map { it.sensorId }).toIntArray() +            mSkipAnimation = true +            mPromptInfo = PromptInfo().apply { +                this.authenticators = authenticators +            } +        }, +        fingerprintProps, +        faceProps, +        wakefulnessLifecycle, +        userManager, +        lockPatternUtils, +        interactionJankMonitor, +        Handler(TestableLooper.get(this).looper), +        FakeExecutor(FakeSystemClock())      ) {          override fun postOnAnimation(runnable: Runnable) {              runnable.run()          }      } -    override fun waitForIdleSync() { -        TestableLooper.get(this).processAllMessages() -        super.waitForIdleSync() -    } +    override fun waitForIdleSync() = TestableLooper.get(this).processAllMessages()      private fun AuthContainerView.addToView() {          ViewUtils.attachView(this) diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java index eefc412e3ffa..d948a99f8ad8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java @@ -77,6 +77,7 @@ import android.view.WindowManager;  import androidx.test.filters.SmallTest;  import com.android.internal.R; +import com.android.internal.jank.InteractionJankMonitor;  import com.android.internal.widget.LockPatternUtils;  import com.android.systemui.SysuiTestCase;  import com.android.systemui.keyguard.WakefulnessLifecycle; @@ -150,6 +151,8 @@ public class AuthControllerTest extends SysuiTestCase {      private LockPatternUtils mLockPatternUtils;      @Mock      private StatusBarStateController mStatusBarStateController; +    @Mock +    private InteractionJankMonitor mInteractionJankMonitor;      @Captor      ArgumentCaptor<IFingerprintAuthenticatorsRegisteredCallback> mAuthenticatorsRegisteredCaptor;      @Captor @@ -788,8 +791,8 @@ public class AuthControllerTest extends SysuiTestCase {              super(context, execution, commandQueue, activityTaskManager, windowManager,                      fingerprintManager, faceManager, udfpsControllerFactory,                      sidefpsControllerFactory, mDisplayManager, mWakefulnessLifecycle, -                    mUserManager, mLockPatternUtils, statusBarStateController, mHandler, -                    mBackgroundExecutor); +                    mUserManager, mLockPatternUtils, statusBarStateController, +                    mInteractionJankMonitor, mHandler, mBackgroundExecutor);          }          @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt index 7f8656c1ecbc..d6afd6d192ec 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt @@ -292,7 +292,7 @@ class AuthRippleControllerTest : SysuiTestCase() {      @Test      @RunWithLooper(setAsMainLooper = true) -    fun testAnimatorRunWhenWakeAndUnlock() { +    fun testAnimatorRunWhenWakeAndUnlock_fingerprint() {          val fpsLocation = PointF(5f, 5f)          `when`(authController.fingerprintSensorLocation).thenReturn(fpsLocation)          controller.onViewAttached() @@ -309,6 +309,25 @@ class AuthRippleControllerTest : SysuiTestCase() {      }      @Test +    @RunWithLooper(setAsMainLooper = true) +    fun testAnimatorRunWhenWakeAndUnlock_faceUdfpsFingerDown() { +        val faceLocation = PointF(5f, 5f) +        `when`(authController.faceAuthSensorLocation).thenReturn(faceLocation) +        controller.onViewAttached() +        `when`(keyguardUpdateMonitor.isKeyguardVisible).thenReturn(true) +        `when`(biometricUnlockController.isWakeAndUnlock).thenReturn(true) +        `when`(authController.isUdfpsFingerDown).thenReturn(true) + +        controller.showUnlockRipple(BiometricSourceType.FACE) +        assertTrue("reveal didn't start on keyguardFadingAway", +                controller.startLightRevealScrimOnKeyguardFadingAway) +        `when`(keyguardStateController.isKeyguardFadingAway).thenReturn(true) +        controller.onKeyguardFadingAwayChanged() +        assertFalse("reveal triggers multiple times", +                controller.startLightRevealScrimOnKeyguardFadingAway) +    } + +    @Test      fun testUpdateRippleColor() {          controller.onViewAttached()          val captor = ArgumentCaptor diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt index 92c2a1b9b23a..8820c164cba4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt @@ -16,29 +16,123 @@  package com.android.systemui.biometrics +import android.annotation.IdRes +import android.content.Context +import android.hardware.biometrics.BiometricManager  import android.hardware.biometrics.ComponentInfoInternal -import android.hardware.biometrics.SensorLocationInternal +import android.hardware.biometrics.PromptInfo  import android.hardware.biometrics.SensorProperties +import android.hardware.face.FaceSensorPropertiesInternal +import android.hardware.face.FaceSensorProperties  import android.hardware.fingerprint.FingerprintSensorProperties  import android.hardware.fingerprint.FingerprintSensorPropertiesInternal +import android.os.Bundle -/** Creates properties from the sensor location with test values. */ -fun SensorLocationInternal.asFingerprintSensorProperties( -    sensorId: Int = 22, -    @SensorProperties.Strength sensorStrength: Int = SensorProperties.STRENGTH_WEAK, -    @FingerprintSensorProperties.SensorType sensorType: Int = -        FingerprintSensorProperties.TYPE_UDFPS_OPTICAL, -    maxEnrollmentsPerUser: Int = 1, -    halControlsIllumination: Boolean = true, -    info: List<ComponentInfoInternal> = listOf(ComponentInfoInternal("a", "b", "c", "d", "e")), -    resetLockoutRequiresHardwareAuthToken: Boolean = false -) = FingerprintSensorPropertiesInternal( -    sensorId, -    sensorStrength, -    maxEnrollmentsPerUser, -    info, -    sensorType, -    halControlsIllumination, -    resetLockoutRequiresHardwareAuthToken, -    listOf(this) -) +import android.testing.ViewUtils +import android.view.LayoutInflater + +/** + * Inflate the given BiometricPrompt layout and initialize it with test parameters. + * + * This attaches the view so be sure to call [destroyDialog] at the end of the test. + */ +@IdRes +internal fun <T : AuthBiometricView> Int.asTestAuthBiometricView( +    context: Context, +    callback: AuthBiometricView.Callback, +    panelController: AuthPanelController, +    allowDeviceCredential: Boolean = false, +    savedState: Bundle? = null, +    hideDelay: Int = 0 +): T { +    val view = LayoutInflater.from(context).inflate(this, null, false) as T +    view.mAnimationDurationLong = 0 +    view.mAnimationDurationShort = 0 +    view.mAnimationDurationHideDialog = hideDelay +    view.setPromptInfo(buildPromptInfo(allowDeviceCredential)) +    view.setCallback(callback) +    view.restoreState(savedState) +    view.setPanelController(panelController) + +    ViewUtils.attachView(view) + +    return view +} + +private fun buildPromptInfo(allowDeviceCredential: Boolean): PromptInfo { +    val promptInfo = PromptInfo() +    promptInfo.title = "Title" +    var authenticators = BiometricManager.Authenticators.BIOMETRIC_WEAK +    if (allowDeviceCredential) { +        authenticators = authenticators or BiometricManager.Authenticators.DEVICE_CREDENTIAL +    } else { +        promptInfo.negativeButtonText = "Negative" +    } +    promptInfo.authenticators = authenticators +    return promptInfo +} + +/** Detach the view, if needed. */ +internal fun AuthBiometricView?.destroyDialog() { +    if (this != null && isAttachedToWindow) { +        ViewUtils.detachView(this) +    } +} + +/** Create [FingerprintSensorPropertiesInternal] for a test. */ +internal fun fingerprintSensorPropertiesInternal( +    ids: List<Int> = listOf(0) +): List<FingerprintSensorPropertiesInternal> { +    val componentInfo = listOf( +            ComponentInfoInternal( +                    "fingerprintSensor" /* componentId */, +                    "vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */, +                    "00000001" /* serialNumber */, "" /* softwareVersion */ +            ), +            ComponentInfoInternal( +                    "matchingAlgorithm" /* componentId */, +                    "" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */, +                    "vendor/version/revision" /* softwareVersion */ +            ) +    ) +    return ids.map { id -> +        FingerprintSensorPropertiesInternal( +                id, +                SensorProperties.STRENGTH_STRONG, +                5 /* maxEnrollmentsPerUser */, +                componentInfo, +                FingerprintSensorProperties.TYPE_REAR, +                false /* resetLockoutRequiresHardwareAuthToken */ +        ) +    } +} + +/** Create [FaceSensorPropertiesInternal] for a test. */ +internal fun faceSensorPropertiesInternal( +    ids: List<Int> = listOf(1) +): List<FaceSensorPropertiesInternal> { +    val componentInfo = listOf( +            ComponentInfoInternal( +                    "faceSensor" /* componentId */, +                    "vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */, +                    "00000001" /* serialNumber */, "" /* softwareVersion */ +            ), +            ComponentInfoInternal( +                    "matchingAlgorithm" /* componentId */, +                    "" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */, +                    "vendor/version/revision" /* softwareVersion */ +            ) +    ) +    return ids.map { id -> +        FaceSensorPropertiesInternal( +                id, +                SensorProperties.STRENGTH_STRONG, +                2 /* maxEnrollmentsPerUser */, +                componentInfo, +                FaceSensorProperties.TYPE_RGB, +                true /* supportsFaceDetection */, +                true /* supportsSelfIllumination */, +                false /* resetLockoutRequiresHardwareAuthToken */ +        ) +    } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index 946c52e8ee5b..09dc8e4fdb8e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -586,6 +586,7 @@ public class UdfpsControllerTest extends SysuiTestCase {          // Configure UdfpsView to accept the ACTION_DOWN event          when(mUdfpsView.isIlluminationRequested()).thenReturn(false);          when(mUdfpsView.isWithinSensorArea(anyFloat(), anyFloat())).thenReturn(true); +        when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);          // GIVEN that the overlay is showing          mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, TEST_UDFPS_SENSOR_ID, @@ -603,6 +604,7 @@ public class UdfpsControllerTest extends SysuiTestCase {          mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);          mBiometricsExecutor.runAllReady();          moveEvent.recycle(); +        mFgExecutor.runAllReady();          // THEN FingerprintManager is notified about onPointerDown          verify(mAlternateTouchProvider).onPointerDown(eq(TEST_REQUEST_ID), eq(0), eq(0), eq(0f),                  eq(0f)); @@ -612,6 +614,7 @@ public class UdfpsControllerTest extends SysuiTestCase {          // AND illumination begins          verify(mUdfpsView).startIllumination(mOnIlluminatedRunnableCaptor.capture());          verify(mLatencyTracker, never()).onActionEnd(eq(LatencyTracker.ACTION_UDFPS_ILLUMINATE)); +        verify(mKeyguardUpdateMonitor).onUdfpsPointerDown(eq((int) TEST_REQUEST_ID));          // AND onIlluminatedRunnable notifies FingerprintManager about onUiReady          mOnIlluminatedRunnableCaptor.getValue().run();          mBiometricsExecutor.runAllReady(); @@ -630,6 +633,7 @@ public class UdfpsControllerTest extends SysuiTestCase {          when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);          // WHEN fingerprint is requested because of AOD interrupt          mUdfpsController.onAodInterrupt(0, 0, 2f, 3f); +        mFgExecutor.runAllReady();          // THEN illumination begins          // AND onIlluminatedRunnable that notifies FingerprintManager is set          verify(mUdfpsView).startIllumination(mOnIlluminatedRunnableCaptor.capture()); @@ -639,6 +643,7 @@ public class UdfpsControllerTest extends SysuiTestCase {                  eq(0), eq(0), eq(3f) /* minor */, eq(2f) /* major */);          verify(mFingerprintManager, never()).onPointerDown(anyLong(), anyInt(), anyInt(), anyInt(),                  anyFloat(), anyFloat()); +        verify(mKeyguardUpdateMonitor).onUdfpsPointerDown(eq((int) TEST_REQUEST_ID));      }      @Test @@ -666,6 +671,7 @@ public class UdfpsControllerTest extends SysuiTestCase {          mFgExecutor.runAllReady();          when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);          mUdfpsController.onAodInterrupt(0, 0, 0f, 0f); +        mFgExecutor.runAllReady();          when(mUdfpsView.isIlluminationRequested()).thenReturn(true);          // WHEN it times out          mFgExecutor.advanceClockToNext(); @@ -734,12 +740,12 @@ public class UdfpsControllerTest extends SysuiTestCase {                  anyString(),                  any(),                  eq("udfps-onStart-click"), -                eq(UdfpsController.VIBRATION_ATTRIBUTES)); +                eq(UdfpsController.UDFPS_VIBRATION_ATTRIBUTES));          // THEN make sure vibration attributes has so that it always will play the haptic,          // even in battery saver mode          assertEquals(VibrationAttributes.USAGE_COMMUNICATION_REQUEST, -                UdfpsController.VIBRATION_ATTRIBUTES.getUsage()); +                UdfpsController.UDFPS_VIBRATION_ATTRIBUTES.getUsage());      }      @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java index cd646c665d03..78fb5b00a21e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java @@ -70,7 +70,7 @@ public class UdfpsDialogMeasureAdapterTest extends SysuiTestCase {          assertEquals(970,                  UdfpsDialogMeasureAdapter.calculateBottomSpacerHeightForPortrait(                          props, displayHeightPx, textIndicatorHeightPx, buttonBarHeightPx, -                        dialogBottomMarginPx, navbarHeightPx +                        dialogBottomMarginPx, navbarHeightPx, 1.0f /* resolutionScale */                  ));      } @@ -135,6 +135,7 @@ public class UdfpsDialogMeasureAdapterTest extends SysuiTestCase {          assertEquals(1205,                  UdfpsDialogMeasureAdapter.calculateHorizontalSpacerWidthForLandscape( -                        props, displayWidthPx, dialogMarginPx, navbarHorizontalInsetPx)); +                        props, displayWidthPx, dialogMarginPx, navbarHorizontalInsetPx, +                        1.0f /* resolutionScale */));      }  } 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 0a1e45c2b28f..9ffc5a57cef6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -461,7 +461,8 @@ public class DozeSensorsTest extends SysuiTestCase {                      /* reportsTouchCoordinate*/ false,                      /* requiresTouchscreen */ false,                      /* ignoresSetting */ false, -                    requiresTouchScreen); +                    requiresTouchScreen, +                    /* immediatelyReRegister */ true);          }          public TriggerSensor createDozeSensor( @@ -477,7 +478,8 @@ public class DozeSensorsTest extends SysuiTestCase {                      /* reportsTouchCoordinate*/ false,                      /* requiresTouchscreen */ false,                      /* ignoresSetting */ false, -                    /* requiresTouchScreen */false); +                    /* requiresTouchScreen */ false, +                    /* immediatelyReRegister*/ true);          }          /** @@ -492,7 +494,8 @@ public class DozeSensorsTest extends SysuiTestCase {                      /* reportsTouchCoordinate*/ false,                      /* requiresTouchscreen */ false,                      /* ignoresSetting */ true, -                    /* requiresProx */false, +                    /* requiresProx */ false, +                    /* immediatelyReRegister */ true,                      posture);          } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index a80aed7a6d18..8a36a68d189a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -186,6 +186,31 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {      }      @Test +    @TestableLooper.RunWithLooper(setAsMainLooper = true) +    public void restoreBouncerWhenSimLockedAndKeyguardIsGoingAway_initiallyNotShowing() { +        // When showing and provisioned +        mViewMediator.onSystemReady(); +        when(mUpdateMonitor.isDeviceProvisioned()).thenReturn(true); +        mViewMediator.setShowingLocked(false); + +        // and a SIM becomes locked and requires a PIN +        mViewMediator.mUpdateCallback.onSimStateChanged( +                1 /* subId */, +                0 /* slotId */, +                TelephonyManager.SIM_STATE_PIN_REQUIRED); + +        // and the keyguard goes away +        mViewMediator.setShowingLocked(false); +        when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false); +        mViewMediator.mUpdateCallback.onKeyguardVisibilityChanged(false); + +        TestableLooper.get(this).processAllMessages(); + +        // then make sure it comes back +        verify(mStatusBarKeyguardViewManager, atLeast(1)).show(null); +    } + +    @Test      public void testBouncerPrompt_deviceLockedByAdmin() {          // GIVEN no trust agents enabled and biometrics aren't enrolled          when(mUpdateMonitor.isTrustUsuallyManaged(anyInt())).thenReturn(false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt index 347ea3b2982d..52266f983fdd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt @@ -1,22 +1,18 @@  package com.android.systemui.media -import android.app.IUriGrantsManager  import android.app.Notification  import android.app.Notification.MediaStyle  import android.app.PendingIntent -import android.app.UriGrantsManager  import android.app.smartspace.SmartspaceAction  import android.app.smartspace.SmartspaceTarget  import android.content.Intent  import android.graphics.Bitmap -import android.graphics.ImageDecoder  import android.graphics.drawable.Icon  import android.media.MediaDescription  import android.media.MediaMetadata  import android.media.session.MediaController  import android.media.session.MediaSession  import android.media.session.PlaybackState -import android.net.Uri  import android.os.Bundle  import android.provider.Settings  import android.service.notification.StatusBarNotification @@ -24,7 +20,6 @@ import android.testing.AndroidTestingRunner  import android.testing.TestableLooper.RunWithLooper  import androidx.media.utils.MediaConstants  import androidx.test.filters.SmallTest -import com.android.dx.mockito.inline.extended.ExtendedMockito  import com.android.internal.logging.InstanceId  import com.android.systemui.InstanceIdSequenceFake  import com.android.systemui.R @@ -58,10 +53,8 @@ import org.mockito.Mockito.reset  import org.mockito.Mockito.times  import org.mockito.Mockito.verify  import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.MockitoSession  import org.mockito.junit.MockitoJUnit  import org.mockito.Mockito.`when` as whenever -import org.mockito.quality.Strictness  private const val KEY = "KEY"  private const val KEY_2 = "KEY_2" @@ -118,25 +111,14 @@ class MediaDataManagerTest : SysuiTestCase() {      private val clock = FakeSystemClock()      @Mock private lateinit var tunerService: TunerService      @Captor lateinit var tunableCaptor: ArgumentCaptor<TunerService.Tunable> -    @Mock private lateinit var ugm: IUriGrantsManager -    @Mock private lateinit var imageSource: ImageDecoder.Source      private val instanceIdSequence = InstanceIdSequenceFake(1 shl 20)      private val originalSmartspaceSetting = Settings.Secure.getInt(context.contentResolver,              Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 1) -    private lateinit var staticMockSession: MockitoSession -      @Before      fun setup() { -        staticMockSession = -            ExtendedMockito.mockitoSession() -                .mockStatic<UriGrantsManager>(UriGrantsManager::class.java) -                .mockStatic<ImageDecoder>(ImageDecoder::class.java) -                .strictness(Strictness.LENIENT) -                .startMocking() -        whenever(UriGrantsManager.getService()).thenReturn(ugm)          foregroundExecutor = FakeExecutor(clock)          backgroundExecutor = FakeExecutor(clock)          smartspaceMediaDataProvider = SmartspaceMediaDataProvider() @@ -213,7 +195,6 @@ class MediaDataManagerTest : SysuiTestCase() {      @After      fun tearDown() { -        staticMockSession.finishMocking()          session.release()          mediaDataManager.destroy()          Settings.Secure.putInt(context.contentResolver, @@ -1112,66 +1093,6 @@ class MediaDataManagerTest : SysuiTestCase() {              anyBoolean())      } -    @Test -    fun testResumeMediaLoaded_hasArtPermission_artLoaded() { -        // When resume media is loaded and user/app has permission to access the art URI, -        whenever( -                ugm.checkGrantUriPermission_ignoreNonSystem( -                    anyInt(), -                    any(), -                    any(), -                    anyInt(), -                    anyInt() -                ) -            ) -            .thenReturn(1) -        val artwork = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) -        val uri = Uri.parse("content://example") -        whenever(ImageDecoder.createSource(any(), eq(uri))).thenReturn(imageSource) -        whenever(ImageDecoder.decodeBitmap(any(), any())).thenReturn(artwork) - -        val desc = -            MediaDescription.Builder().run { -                setTitle(SESSION_TITLE) -                setIconUri(uri) -                build() -            } -        addResumeControlAndLoad(desc) - -        // Then the artwork is loaded -        assertThat(mediaDataCaptor.value.artwork).isNotNull() -    } - -    @Test -    fun testResumeMediaLoaded_noArtPermission_noArtLoaded() { -        // When resume media is loaded and user/app does not have permission to access the art URI -        whenever( -                ugm.checkGrantUriPermission_ignoreNonSystem( -                    anyInt(), -                    any(), -                    any(), -                    anyInt(), -                    anyInt() -                ) -            ) -            .thenThrow(SecurityException("Test no permission")) -        val artwork = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) -        val uri = Uri.parse("content://example") -        whenever(ImageDecoder.createSource(any(), eq(uri))).thenReturn(imageSource) -        whenever(ImageDecoder.decodeBitmap(any(), any())).thenReturn(artwork) - -        val desc = -            MediaDescription.Builder().run { -                setTitle(SESSION_TITLE) -                setIconUri(uri) -                build() -            } -        addResumeControlAndLoad(desc) - -        // Then the artwork is not loaded -        assertThat(mediaDataCaptor.value.artwork).isNull() -    } -      /**       * Helper function to add a media notification and capture the resulting MediaData       */ @@ -1182,32 +1103,4 @@ class MediaDataManagerTest : SysuiTestCase() {          verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor), eq(true),              eq(0), eq(false))      } - -    /** Helper function to add a resumption control and capture the resulting MediaData */ -    private fun addResumeControlAndLoad( -        desc: MediaDescription, -        packageName: String = PACKAGE_NAME -    ) { -        mediaDataManager.addResumptionControls( -            USER_ID, -            desc, -            Runnable {}, -            session.sessionToken, -            APP_NAME, -            pendingIntent, -            packageName -        ) -        assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) -        assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) - -        verify(listener) -            .onMediaDataLoaded( -                eq(packageName), -                eq(null), -                capture(mediaDataCaptor), -                eq(true), -                eq(0), -                eq(false) -            ) -    }  } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt index 9a01464fc869..a8c72ddfd5d7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt @@ -25,9 +25,9 @@ import android.os.PowerManager  import android.testing.AndroidTestingRunner  import android.testing.TestableLooper  import android.view.View +import android.view.ViewGroup  import android.view.WindowManager  import android.widget.ImageView -import android.widget.LinearLayout  import android.widget.TextView  import androidx.test.filters.SmallTest  import com.android.internal.logging.testing.UiEventLoggerFake @@ -620,22 +620,22 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {          verify(windowManager).removeView(any())      } -    private fun LinearLayout.getAppIconView() = this.requireViewById<ImageView>(R.id.app_icon) +    private fun ViewGroup.getAppIconView() = this.requireViewById<ImageView>(R.id.app_icon) -    private fun LinearLayout.getChipText(): String = +    private fun ViewGroup.getChipText(): String =          (this.requireViewById<TextView>(R.id.text)).text as String -    private fun LinearLayout.getLoadingIconVisibility(): Int = +    private fun ViewGroup.getLoadingIconVisibility(): Int =          this.requireViewById<View>(R.id.loading).visibility -    private fun LinearLayout.getUndoButton(): View = this.requireViewById(R.id.undo) +    private fun ViewGroup.getUndoButton(): View = this.requireViewById(R.id.undo) -    private fun LinearLayout.getFailureIcon(): View = this.requireViewById(R.id.failure_icon) +    private fun ViewGroup.getFailureIcon(): View = this.requireViewById(R.id.failure_icon) -    private fun getChipView(): LinearLayout { +    private fun getChipView(): ViewGroup {          val viewCaptor = ArgumentCaptor.forClass(View::class.java)          verify(windowManager).addView(viewCaptor.capture(), any()) -        return viewCaptor.value as LinearLayout +        return viewCaptor.value as ViewGroup      }      /** Helper method providing default parameters to not clutter up the tests. */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/SaveImageInBackgroundTaskTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/SaveImageInBackgroundTaskTest.kt deleted file mode 100644 index 03f8c9394218..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/SaveImageInBackgroundTaskTest.kt +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.screenshot - -import android.app.Notification -import android.app.PendingIntent -import android.content.ComponentName -import android.content.Intent -import android.graphics.Bitmap -import android.graphics.drawable.Icon -import android.net.Uri -import android.os.UserHandle -import android.testing.AndroidTestingRunner -import androidx.test.filters.SmallTest - -import com.android.systemui.SysuiTestCase -import com.android.systemui.screenshot.ScreenshotController.SaveImageInBackgroundData -import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider.ScreenshotSmartActionType -import com.android.systemui.util.mockito.any -import com.android.systemui.util.mockito.eq -import com.android.systemui.util.mockito.mock -import java.util.concurrent.CompletableFuture -import java.util.function.Supplier -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNull -import org.junit.Before -import org.junit.runner.RunWith -import org.junit.Test -import org.mockito.Mockito - -@SmallTest -@RunWith(AndroidTestingRunner::class) -class SaveImageInBackgroundTaskTest : SysuiTestCase() { -    private val imageExporter = mock<ImageExporter>() -    private val smartActions = mock<ScreenshotSmartActions>() -    private val saveImageData = SaveImageInBackgroundData() -    private val sharedTransitionSupplier = -        mock<Supplier<ScreenshotController.SavedImageData.ActionTransition>>() -    private val testScreenshotId: String = "testScreenshotId" -    private val testBitmap = mock<Bitmap>() -    private val testUser = UserHandle.getUserHandleForUid(0) -    private val testIcon = mock<Icon>() -    private val testImageTime = 1234.toLong() - -    private val smartActionsUriFuture = mock<CompletableFuture<List<Notification.Action>>>() -    private val smartActionsFuture = mock<CompletableFuture<List<Notification.Action>>>() - -    private val testUri: Uri = Uri.parse("testUri") -    private val intent = -        Intent(Intent.ACTION_SEND) -            .setComponent( -                ComponentName.unflattenFromString( -                    "com.google.android.test/com.google.android.test.TestActivity" -                ) -            ) -    private val immutablePendingIntent = -        PendingIntent.getBroadcast( -            mContext, -            0, -            intent, -            PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE -        ) -    private val mutablePendingIntent = -        PendingIntent.getBroadcast( -            mContext, -            0, -            intent, -            PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_MUTABLE -        ) - -    private val saveImageTask = -        SaveImageInBackgroundTask( -            mContext, -            imageExporter, -            smartActions, -            saveImageData, -            sharedTransitionSupplier, -        ) - -    @Before -    fun setup() { -        Mockito.`when`( -                smartActions.getSmartActionsFuture( -                    eq(testScreenshotId), -                    any(Uri::class.java), -                    eq(testBitmap), -                    any(ScreenshotNotificationSmartActionsProvider::class.java), -                    any(ScreenshotSmartActionType::class.java), -                    any(Boolean::class.java), -                    eq(testUser) -                ) -            ) -            .thenReturn(smartActionsUriFuture) -        Mockito.`when`( -                smartActions.getSmartActionsFuture( -                    eq(testScreenshotId), -                    eq(null), -                    eq(testBitmap), -                    any(ScreenshotNotificationSmartActionsProvider::class.java), -                    any(ScreenshotSmartActionType::class.java), -                    any(Boolean::class.java), -                    eq(testUser) -                ) -            ) -            .thenReturn(smartActionsFuture) -    } - -    @Test -    fun testQueryQuickShare_noAction() { -        Mockito.`when`( -                smartActions.getSmartActions( -                    eq(testScreenshotId), -                    eq(smartActionsFuture), -                    any(Int::class.java), -                    any(ScreenshotNotificationSmartActionsProvider::class.java), -                    eq(ScreenshotSmartActionType.QUICK_SHARE_ACTION) -                ) -            ) -            .thenReturn(ArrayList<Notification.Action>()) - -        val quickShareAction = -            saveImageTask.queryQuickShareAction(testScreenshotId, testBitmap, testUser, testUri) - -        assertNull(quickShareAction) -    } - -    @Test -    fun testQueryQuickShare_withActions() { -        val actions = ArrayList<Notification.Action>() -        actions.add(constructAction("Action One", mutablePendingIntent)) -        actions.add(constructAction("Action Two", mutablePendingIntent)) -        Mockito.`when`( -                smartActions.getSmartActions( -                    eq(testScreenshotId), -                    eq(smartActionsUriFuture), -                    any(Int::class.java), -                    any(ScreenshotNotificationSmartActionsProvider::class.java), -                    eq(ScreenshotSmartActionType.QUICK_SHARE_ACTION) -                ) -            ) -            .thenReturn(actions) - -        val quickShareAction = -            saveImageTask.queryQuickShareAction(testScreenshotId, testBitmap, testUser, testUri)!! - -        assertEquals("Action One", quickShareAction.title) -        assertEquals(mutablePendingIntent, quickShareAction.actionIntent) -    } - -    @Test -    fun testCreateQuickShareAction_originalWasNull_returnsNull() { -        val quickShareAction = -            saveImageTask.createQuickShareAction( -                null, -                testScreenshotId, -                testUri, -                testImageTime, -                testBitmap, -                testUser -            ) - -        assertNull(quickShareAction) -    } - -    @Test -    fun testCreateQuickShareAction_immutableIntentDifferentAction_returnsNull() { -        val actions = ArrayList<Notification.Action>() -        actions.add(constructAction("New Test Action", immutablePendingIntent)) -        Mockito.`when`( -                smartActions.getSmartActions( -                    eq(testScreenshotId), -                    eq(smartActionsUriFuture), -                    any(Int::class.java), -                    any(ScreenshotNotificationSmartActionsProvider::class.java), -                    eq(ScreenshotSmartActionType.QUICK_SHARE_ACTION) -                ) -            ) -            .thenReturn(actions) -        val origAction = constructAction("Old Test Action", immutablePendingIntent) - -        val quickShareAction = -            saveImageTask.createQuickShareAction( -                origAction, -                testScreenshotId, -                testUri, -                testImageTime, -                testBitmap, -                testUser, -            ) - -        assertNull(quickShareAction) -    } - -    @Test -    fun testCreateQuickShareAction_mutableIntent_returnsSafeIntent() { -        val actions = ArrayList<Notification.Action>() -        val action = constructAction("Action One", mutablePendingIntent) -        actions.add(action) -        Mockito.`when`( -                smartActions.getSmartActions( -                    eq(testScreenshotId), -                    eq(smartActionsUriFuture), -                    any(Int::class.java), -                    any(ScreenshotNotificationSmartActionsProvider::class.java), -                    eq(ScreenshotSmartActionType.QUICK_SHARE_ACTION) -                ) -            ) -            .thenReturn(actions) - -        val quickShareAction = -            saveImageTask.createQuickShareAction( -                constructAction("Test Action", mutablePendingIntent), -                testScreenshotId, -                testUri, -                testImageTime, -                testBitmap, -                testUser -            ) -        val quickSharePendingIntent = -            quickShareAction.actionIntent.intent.extras!!.getParcelable( -                ScreenshotController.EXTRA_ACTION_INTENT, -                PendingIntent::class.java -            ) - -        assertEquals("Test Action", quickShareAction.title) -        assertEquals(mutablePendingIntent, quickSharePendingIntent) -    } - -    @Test -    fun testCreateQuickShareAction_immutableIntent_returnsSafeIntent() { -        val actions = ArrayList<Notification.Action>() -        val action = constructAction("Test Action", immutablePendingIntent) -        actions.add(action) -        Mockito.`when`( -                smartActions.getSmartActions( -                    eq(testScreenshotId), -                    eq(smartActionsUriFuture), -                    any(Int::class.java), -                    any(ScreenshotNotificationSmartActionsProvider::class.java), -                    eq(ScreenshotSmartActionType.QUICK_SHARE_ACTION) -                ) -            ) -            .thenReturn(actions) - -        val quickShareAction = -            saveImageTask.createQuickShareAction( -                constructAction("Test Action", immutablePendingIntent), -                testScreenshotId, -                testUri, -                testImageTime, -                testBitmap, -                testUser, -            )!! - -        assertEquals("Test Action", quickShareAction.title) -        assertEquals( -            immutablePendingIntent, -            quickShareAction.actionIntent.intent.extras!!.getParcelable( -                ScreenshotController.EXTRA_ACTION_INTENT, -                PendingIntent::class.java -            ) -        ) -    } - -    private fun constructAction(title: String, intent: PendingIntent): Notification.Action { -        return Notification.Action.Builder(testIcon, title, intent).build() -    } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java index d394d7dcebbe..d67e26f138f2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -45,6 +45,7 @@ import static org.mockito.Mockito.clearInvocations;  import static org.mockito.Mockito.mock;  import static org.mockito.Mockito.never;  import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times;  import static org.mockito.Mockito.verify;  import static org.mockito.Mockito.when; @@ -59,6 +60,7 @@ import android.content.Context;  import android.content.Intent;  import android.content.pm.UserInfo;  import android.graphics.Color; +import android.hardware.biometrics.BiometricFaceConstants;  import android.hardware.biometrics.BiometricSourceType;  import android.hardware.face.FaceManager;  import android.hardware.fingerprint.FingerprintManager; @@ -69,6 +71,7 @@ import android.os.UserManager;  import android.testing.AndroidTestingRunner;  import android.testing.TestableLooper;  import android.view.ViewGroup; +import android.view.accessibility.AccessibilityManager;  import androidx.test.InstrumentationRegistry;  import androidx.test.filters.SmallTest; @@ -106,6 +109,9 @@ import org.mockito.MockitoAnnotations;  import java.text.NumberFormat;  import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set;  @SmallTest  @RunWith(AndroidTestingRunner.class) @@ -119,7 +125,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {      private static final int TEST_STRING_RES = R.string.keyguard_indication_trust_unlocked; -    private String mKeyguardTryFingerprintMsg;      private String mDisclosureWithOrganization;      private String mDisclosureGeneric;      private String mFinancedDisclosureWithOrganization; @@ -159,6 +164,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {      @Mock      private KeyguardBypassController mKeyguardBypassController;      @Mock +    private AccessibilityManager mAccessibilityManager; +    @Mock      private ScreenLifecycle mScreenLifecycle;      @Captor      private ArgumentCaptor<DockManager.AlignmentStateListener> mAlignmentListener; @@ -198,7 +205,6 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {          mContext.addMockSystemService(UserManager.class, mUserManager);          mContext.addMockSystemService(Context.TRUST_SERVICE, mock(TrustManager.class));          mContext.addMockSystemService(Context.FINGERPRINT_SERVICE, mock(FingerprintManager.class)); -        mKeyguardTryFingerprintMsg = mContext.getString(R.string.keyguard_try_fingerprint);          mDisclosureWithOrganization = mContext.getString(R.string.do_disclosure_with_name,                  ORGANIZATION_NAME);          mDisclosureGeneric = mContext.getString(R.string.do_disclosure_generic); @@ -249,7 +255,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {                  mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor,                  mDockManager, mBroadcastDispatcher, mDevicePolicyManager, mIBatteryStats,                  mUserManager, mExecutor, mExecutor,  mFalsingManager, mLockPatternUtils, -                mScreenLifecycle, mIActivityManager, mKeyguardBypassController); +                mScreenLifecycle, mIActivityManager, mKeyguardBypassController, +                mAccessibilityManager);          mController.init();          mController.setIndicationArea(mIndicationArea);          verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture()); @@ -578,6 +585,106 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {      }      @Test +    public void faceErrorTimeout_whenFingerprintEnrolled_doesNotShowMessage() { +        createController(); +        when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( +                0)).thenReturn(true); +        String message = "A message"; + +        mController.setVisible(true); +        mController.getKeyguardCallback().onBiometricError( +                FaceManager.FACE_ERROR_TIMEOUT, message, BiometricSourceType.FACE); +        verifyNoMessage(INDICATION_TYPE_BIOMETRIC_MESSAGE); +    } + +    @Test +    public void sendFaceHelpMessages_fingerprintEnrolled() { +        createController(); + +        // GIVEN fingerprint enrolled +        when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( +                0)).thenReturn(true); + +        // WHEN help messages received that are allowed to show +        final String helpString = "helpString"; +        final int[] msgIds = new int[]{ +                BiometricFaceConstants.FACE_ACQUIRED_MOUTH_COVERING_DETECTED, +                BiometricFaceConstants.FACE_ACQUIRED_DARK_GLASSES_DETECTED +        }; +        Set<CharSequence> messages = new HashSet<>(); +        for (int msgId : msgIds) { +            final String message = helpString + msgId; +            messages.add(message); +            mKeyguardUpdateMonitorCallback.onBiometricHelp( +                    msgId, message, BiometricSourceType.FACE); +        } + +        // THEN FACE_ACQUIRED_MOUTH_COVERING_DETECTED and DARK_GLASSES help messages shown +        verifyIndicationMessages(INDICATION_TYPE_BIOMETRIC_MESSAGE, +                messages); +    } + +    @Test +    public void doNotSendMostFaceHelpMessages_fingerprintEnrolled() { +        createController(); + +        // GIVEN fingerprint enrolled +        when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( +                0)).thenReturn(true); + +        // WHEN help messages received that aren't supposed to show +        final String helpString = "helpString"; +        final int[] msgIds = new int[]{ +                BiometricFaceConstants.FACE_ACQUIRED_FACE_OBSCURED, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_RIGHT, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_LEFT, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_HIGH, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_LOW, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_BRIGHT, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_DARK +        }; +        for (int msgId : msgIds) { +            mKeyguardUpdateMonitorCallback.onBiometricHelp( +                    msgId,  helpString + msgId, BiometricSourceType.FACE); +        } + +        // THEN no messages shown +        verifyNoMessage(INDICATION_TYPE_BIOMETRIC_MESSAGE); +    } + +    @Test +    public void sendAllFaceHelpMessages_fingerprintNotEnrolled() { +        createController(); + +        // GIVEN fingerprint NOT enrolled +        when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( +                0)).thenReturn(false); + +        // WHEN help messages received +        final Set<CharSequence> helpStrings = new HashSet<>(); +        final String helpString = "helpString"; +        final int[] msgIds = new int[]{ +                BiometricFaceConstants.FACE_ACQUIRED_FACE_OBSCURED, +                BiometricFaceConstants.FACE_ACQUIRED_DARK_GLASSES_DETECTED, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_RIGHT, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_LEFT, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_HIGH, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_LOW, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_BRIGHT, +                BiometricFaceConstants.FACE_ACQUIRED_TOO_DARK +        }; +        for (int msgId : msgIds) { +            final String numberedHelpString = helpString + msgId; +            mKeyguardUpdateMonitorCallback.onBiometricHelp( +                    msgId,  numberedHelpString, BiometricSourceType.FACE); +            helpStrings.add(numberedHelpString); +        } + +        // THEN message shown for each call +        verifyIndicationMessages(INDICATION_TYPE_BIOMETRIC_MESSAGE, helpStrings); +    } + +    @Test      public void updateMonitor_listenerUpdatesIndication() {          createController();          String restingIndication = "Resting indication"; @@ -846,10 +953,84 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {                  trustGrantedMsg);      } +    @Test +    public void nonBypassFaceSuccess_touchExplorationEnabled_showsSwipeToOpen() { +        // GIVEN non bypass face auth and touch exploration is enabled +        when(mKeyguardBypassController.canBypass()).thenReturn(false); +        when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(true); +        when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); +        createController(); +        String swipeToOpen = mContext.getString(R.string.keyguard_unlock); +        mController.setVisible(true); + +        // WHEN face authenticated +        mController.getKeyguardCallback().onBiometricAuthenticated(0, +                BiometricSourceType.FACE, false); + +        // THEN show 'swipe up to open' message +        verifyIndicationMessage(INDICATION_TYPE_BIOMETRIC_MESSAGE, swipeToOpen); +    } + +    @Test +    public void nonBypassFaceSuccess_a11yEnabled_showsSwipeToOpen() { +        // GIVEN non bypass face auth and a11y is enabled +        when(mKeyguardBypassController.canBypass()).thenReturn(false); +        when(mAccessibilityManager.isEnabled()).thenReturn(true); +        when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); +        createController(); +        String swipeToOpen = mContext.getString(R.string.keyguard_unlock); +        mController.setVisible(true); + +        // WHEN face auth is successful +        mController.getKeyguardCallback().onBiometricAuthenticated(0, +                BiometricSourceType.FACE, false); + +        // THEN show 'swipe up to open' message +        verifyIndicationMessage(INDICATION_TYPE_BIOMETRIC_MESSAGE, swipeToOpen); +    } + +    @Test +    public void coEx_nonBypassFaceSuccess_showsPressLockIcon() { +        // GIVEN udfps is supported, non-bypass face auth, and no a11y enabled +        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(true); +        when(mKeyguardBypassController.canBypass()).thenReturn(false); +        when(mKeyguardUpdateMonitor.getIsFaceAuthenticated()).thenReturn(true); +        when(mAccessibilityManager.isEnabled()).thenReturn(false); +        when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(false); +        when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); +        when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser())) +                .thenReturn(true); +        createController(); +        mController.setVisible(true); + +        // WHEN face auth succeeds +        mController.getKeyguardCallback().onBiometricAuthenticated(0, +                BiometricSourceType.FACE, false); + +        // THEN press unlock icon to open message shows +        String pressLockIcon = mContext.getString(R.string.keyguard_face_successful_unlock_press); +        verifyIndicationMessage(INDICATION_TYPE_BIOMETRIC_MESSAGE, pressLockIcon); + +        assertThat(mTextView.getText()).isNotEqualTo(pressLockIcon); +    } +      private void sendUpdateDisclosureBroadcast() {          mBroadcastReceiver.onReceive(mContext, new Intent());      } +    private void verifyIndicationMessages(int type, Set<CharSequence> messages) { +        verify(mRotateTextViewController, times(messages.size())).updateIndication(eq(type), +                mKeyguardIndicationCaptor.capture(), anyBoolean()); +        List<KeyguardIndication> kis = mKeyguardIndicationCaptor.getAllValues(); + +        for (KeyguardIndication ki : kis) { +            final CharSequence msg = ki.getMessage(); +            assertTrue(messages.contains(msg)); // check message is shown +            messages.remove(msg); +        } +        assertThat(messages.size()).isEqualTo(0); // check that all messages accounted for (removed) +    } +      private void verifyIndicationMessage(int type, String message) {          verify(mRotateTextViewController).updateIndication(eq(type),                  mKeyguardIndicationCaptor.capture(), anyBoolean()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt new file mode 100644 index 000000000000..5f5769572008 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationViewTest.kt @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.systemui.statusbar.notification.row + +import android.annotation.ColorInt +import android.graphics.Color +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper.RunWithLooper +import android.view.View +import androidx.test.filters.SmallTest +import com.android.settingslib.Utils +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.statusbar.notification.FakeShadowView +import com.android.systemui.statusbar.notification.NotificationUtils +import com.android.systemui.util.mockito.mock +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@RunWithLooper +class ActivatableNotificationViewTest : SysuiTestCase() { +    private val mContentView: View = mock() +    private lateinit var mView: ActivatableNotificationView + +    @ColorInt +    private var mNormalColor = 0 + +    @Before +    fun setUp() { +        mView = object : ActivatableNotificationView(mContext, null) { + +            init { +                onFinishInflate() +            } + +            override fun getContentView(): View { +                return mContentView +            } + +            override fun <T : View> findViewTraversal(id: Int): T? = when (id) { +                R.id.backgroundNormal -> mock<NotificationBackgroundView>() +                R.id.fake_shadow -> mock<FakeShadowView>() +                else -> null +            } as T? +        } +        mNormalColor = +            Utils.getColorAttrDefaultColor(mContext, com.android.internal.R.attr.colorSurface) +    } + +    @Test +    fun testBackgroundBehaviors() { +        // Color starts with the normal color +        mView.updateBackgroundColors() +        assertThat(mView.currentBackgroundTint).isEqualTo(mNormalColor) + +        // Setting a tint changes the background to that color specifically +        mView.setTintColor(Color.BLUE) +        assertThat(mView.currentBackgroundTint).isEqualTo(Color.BLUE) + +        // Setting an override tint blends with the previous tint +        mView.setOverrideTintColor(Color.RED, 0.5f) +        assertThat(mView.currentBackgroundTint) +            .isEqualTo(NotificationUtils.interpolateColors(Color.BLUE, Color.RED, 0.5f)) + +        // Updating the background colors resets tints, as those won't match the latest theme +        mView.updateBackgroundColors() +        assertThat(mView.currentBackgroundTint).isEqualTo(mNormalColor) +    } +}
\ No newline at end of file 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 6864c65c9af4..e5b6286fcd7c 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 @@ -51,6 +51,7 @@ import com.android.systemui.log.SessionTracker;  import com.android.systemui.plugins.statusbar.StatusBarStateController;  import com.android.systemui.statusbar.NotificationMediaManager;  import com.android.systemui.statusbar.NotificationShadeWindowController; +import com.android.systemui.statusbar.VibratorHelper;  import com.android.systemui.statusbar.policy.KeyguardStateController;  import org.junit.Before; @@ -115,6 +116,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {      private LatencyTracker mLatencyTracker;      @Mock      private ScreenOffAnimationController mScreenOffAnimationController; +    @Mock +    private VibratorHelper mVibratorHelper;      private BiometricUnlockController mBiometricUnlockController;      @Before @@ -128,7 +131,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {          when(mKeyguardBypassController.onBiometricAuthenticated(any(), anyBoolean()))                  .thenReturn(true);          when(mAuthController.isUdfpsFingerDown()).thenReturn(false); -        when(mKeyguardBypassController.canPlaySubtleWindowAnimations()).thenReturn(true);          mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager);          mBiometricUnlockController = new BiometricUnlockController(mDozeScrimController,                  mKeyguardViewMediator, mScrimController, mShadeController, @@ -137,7 +139,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {                  mMetricsLogger, mDumpManager, mPowerManager,                  mNotificationMediaManager, mWakefulnessLifecycle, mScreenLifecycle,                  mAuthController, mStatusBarStateController, mKeyguardUnlockAnimationController, -                mSessionTracker, mLatencyTracker, mScreenOffAnimationController); +                mSessionTracker, mLatencyTracker, mScreenOffAnimationController, mVibratorHelper);          mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager);          mBiometricUnlockController.setBiometricModeListener(mBiometricModeListener);      } @@ -258,11 +260,9 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {          mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,                  BiometricSourceType.FACE, true /* isStrongBiometric */); -        verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(), -                anyBoolean(), anyFloat());          verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false));          assertThat(mBiometricUnlockController.getMode()) -                .isEqualTo(BiometricUnlockController.MODE_UNLOCK_FADING); +                .isEqualTo(BiometricUnlockController.MODE_UNLOCK_COLLAPSING);      }      @Test @@ -277,11 +277,9 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {          mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,                  BiometricSourceType.FACE, true /* isStrongBiometric */); -        verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(), -                anyBoolean(), anyFloat());          verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false));          assertThat(mBiometricUnlockController.getMode()) -            .isEqualTo(BiometricUnlockController.MODE_UNLOCK_FADING); +            .isEqualTo(BiometricUnlockController.MODE_UNLOCK_COLLAPSING);      }      @Test @@ -378,21 +376,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {      }      @Test -    public void onBiometricAuthenticated_whenBypassOnBouncer_respectsCanPlaySubtleAnim() { -        when(mUpdateMonitor.isUnlockingWithBiometricAllowed(anyBoolean())).thenReturn(true); -        when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); -        when(mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing()).thenReturn(true); -        // the value of isStrongBiometric doesn't matter here since we only care about the returned -        // value of isUnlockingWithBiometricAllowed() -        mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, -                BiometricSourceType.FACE, true /* isStrongBiometric */); - -        verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false)); -        assertThat(mBiometricUnlockController.getMode()) -                .isEqualTo(BiometricUnlockController.MODE_UNLOCK_FADING); -    } - -    @Test      public void onBiometricAuthenticated_whenFaceAndPulsing_dontDismissKeyguard() {          reset(mUpdateMonitor);          reset(mStatusBarKeyguardViewManager); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index 2faff0ced70a..ef681a52f797 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -129,7 +129,6 @@ import com.android.systemui.statusbar.notification.collection.NotifPipeline;  import com.android.systemui.statusbar.notification.collection.NotificationEntry;  import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;  import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager; -import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;  import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;  import com.android.systemui.statusbar.notification.init.NotificationsController;  import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider; @@ -159,7 +158,6 @@ import com.android.systemui.util.concurrency.FakeExecutor;  import com.android.systemui.util.concurrency.MessageRouterImpl;  import com.android.systemui.util.time.FakeSystemClock;  import com.android.systemui.volume.VolumeComponent; -import com.android.systemui.wmshell.BubblesManager;  import com.android.wm.shell.bubbles.Bubbles;  import com.android.wm.shell.startingsurface.StartingSurface; @@ -223,7 +221,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase {      @Mock private NotificationShadeWindowView mNotificationShadeWindowView;      @Mock private BroadcastDispatcher mBroadcastDispatcher;      @Mock private AssistManager mAssistManager; -    @Mock private NotifShadeEventSource mNotifShadeEventSource;      @Mock private NotificationEntryManager mNotificationEntryManager;      @Mock private NotificationGutsManager mNotificationGutsManager;      @Mock private NotificationMediaManager mNotificationMediaManager; @@ -240,15 +237,12 @@ public class CentralSurfacesImplTest extends SysuiTestCase {      @Mock private StatusBarWindowStateController mStatusBarWindowStateController;      @Mock private NotificationViewHierarchyManager mNotificationViewHierarchyManager;      @Mock private UserSwitcherController mUserSwitcherController; -    @Mock private NetworkController mNetworkController; -    @Mock private BubblesManager mBubblesManager;      @Mock private Bubbles mBubbles;      @Mock private NotificationShadeWindowController mNotificationShadeWindowController;      @Mock private NotificationIconAreaController mNotificationIconAreaController;      @Mock private NotificationShadeWindowViewController mNotificationShadeWindowViewController;      @Mock private DozeParameters mDozeParameters;      @Mock private Lazy<LockscreenWallpaper> mLockscreenWallpaperLazy; -    @Mock private LockscreenGestureLogger mLockscreenGestureLogger;      @Mock private LockscreenWallpaper mLockscreenWallpaper;      @Mock private DozeServiceHost mDozeServiceHost;      @Mock private ViewMediatorCallback mKeyguardVieMediatorCallback; @@ -403,7 +397,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase {                  new FalsingManagerFake(),                  new FalsingCollectorFake(),                  mBroadcastDispatcher, -                mNotifShadeEventSource,                  mNotificationEntryManager,                  mNotificationGutsManager,                  notificationLogger, @@ -418,13 +411,11 @@ public class CentralSurfacesImplTest extends SysuiTestCase {                  mLockscreenUserManager,                  mRemoteInputManager,                  mUserSwitcherController, -                mNetworkController,                  mBatteryController,                  mColorExtractor,                  new ScreenLifecycle(mDumpManager),                  wakefulnessLifecycle,                  mStatusBarStateController, -                Optional.of(mBubblesManager),                  Optional.of(mBubbles),                  mVisualStabilityManager,                  mDeviceProvisionedController, @@ -436,7 +427,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase {                  mDozeParameters,                  mScrimController,                  mLockscreenWallpaperLazy, -                mLockscreenGestureLogger,                  mBiometricUnlockControllerLazy,                  mDozeServiceHost,                  mPowerManager, mScreenPinningRequest, @@ -468,7 +458,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase {                  mLockscreenTransitionController,                  mFeatureFlags,                  mKeyguardUnlockAnimationController, -                new Handler(TestableLooper.get(this).getLooper()),                  mMainExecutor,                  new MessageRouterImpl(mMainExecutor),                  mWallpaperManager, 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 9c02216722e2..39021d8732d3 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 @@ -399,9 +399,8 @@ public class KeyguardBouncerTest extends SysuiTestCase {          mBouncer.hide(false /* destroyView */);          verify(mHandler).removeCallbacks(eq(showRunnable.getValue()));      } -      @Test -    public void testShow_delaysIfFaceAuthIsRunning_unlessBypass() { +    public void testShow_delaysIfFaceAuthIsRunning_unlessBypassEnabled() {          when(mKeyguardStateController.isFaceAuthEnabled()).thenReturn(true);          when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true);          mBouncer.show(true /* reset */); @@ -410,6 +409,16 @@ public class KeyguardBouncerTest extends SysuiTestCase {      }      @Test +    public void testShow_delaysIfFaceAuthIsRunning_unlessFingerprintEnrolled() { +        when(mKeyguardStateController.isFaceAuthEnabled()).thenReturn(true); +        when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible(0)) +                .thenReturn(true); +        mBouncer.show(true /* reset */); + +        verify(mHandler, never()).postDelayed(any(), anyLong()); +    } + +    @Test      public void testRegisterUpdateMonitorCallback() {          verify(mKeyguardUpdateMonitor).registerCallback(any());      } 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 09009c6ee260..32df2d790bd1 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 @@ -833,7 +833,7 @@ public class ScrimControllerTest extends SysuiTestCase {      }      @Test -    public void scrimBlanksWhenUnlockingFromPulse() { +    public void scrimBlankCallbackWhenUnlockingFromPulse() {          boolean[] blanked = {false};          // Simulate unlock with fingerprint          mScrimController.transitionTo(ScrimState.PULSING); @@ -846,7 +846,50 @@ public class ScrimControllerTest extends SysuiTestCase {                      }                  });          finishAnimationsImmediately(); -        Assert.assertTrue("Scrim should blank when unlocking from pulse.", blanked[0]); +        Assert.assertTrue("Scrim should send display blanked callback when unlocking " +                + "from pulse.", blanked[0]); +    } + +    @Test +    public void blankingNotRequired_leavingAoD() { +        // GIVEN display does NOT need blanking +        when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false); + +        mScrimController = new ScrimController(mLightBarController, +                mDozeParameters, mAlarmManager, mKeyguardStateController, mDelayedWakeLockBuilder, +                new FakeHandler(mLooper.getLooper()), mKeyguardUpdateMonitor, +                mDockManager, mConfigurationController, new FakeExecutor(new FakeSystemClock()), +                mScreenOffAnimationController, +                mPanelExpansionStateManager, +                mKeyguardUnlockAnimationController, +                mStatusBarKeyguardViewManager); +        mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible); +        mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront); +        mScrimController.setAnimatorListener(mAnimatorListener); +        mScrimController.setHasBackdrop(false); +        mScrimController.setWallpaperSupportsAmbientMode(false); +        mScrimController.transitionTo(ScrimState.KEYGUARD); +        finishAnimationsImmediately(); + +        // WHEN Simulate unlock with fingerprint +        mScrimController.transitionTo(ScrimState.AOD); +        finishAnimationsImmediately(); + +        // WHEN transitioning to UNLOCKED, onDisplayCallbackBlanked callback called to continue +        // the transition but the scrim was not actually blanked +        mScrimController.transitionTo(ScrimState.UNLOCKED, +                new ScrimController.Callback() { +                    @Override +                    public void onDisplayBlanked() { +                        // Front scrim should not be black nor opaque +                        Assert.assertTrue("Scrim should NOT be visible during transition." +                                + " Alpha: " + mScrimInFront.getViewAlpha(), +                                mScrimInFront.getViewAlpha() == 0f); +                        Assert.assertSame("Scrim should not be visible during transition.", +                                mScrimVisibility, TRANSPARENT); +                    } +                }); +        finishAnimationsImmediately();      }      @Test 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 4f2abf263a9b..2dcb2f4f1203 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 @@ -192,12 +192,12 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {      }      @Test -    public void onPanelExpansionChanged_propagatesToBouncer_evenAfterHidden() { +    public void onPanelExpansionChanged_hideBouncer_afterKeyguardHidden() {          mStatusBarKeyguardViewManager.hide(0, 0);          when(mBouncer.inTransit()).thenReturn(true);          mStatusBarKeyguardViewManager.onPanelExpansionChanged(EXPANSION_EVENT); -        verify(mBouncer).setExpansion(eq(EXPANSION_EVENT.getFraction())); +        verify(mBouncer).setExpansion(eq(KeyguardBouncer.EXPANSION_HIDDEN));      }      @Test @@ -239,6 +239,23 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {      }      @Test +    public void onPanelExpansionChanged_neverTranslatesBouncerWhenDismissBouncer() { +        // Since KeyguardBouncer.EXPANSION_VISIBLE = 0 panel expansion, if the unlock is dismissing +        // the bouncer, there may be an onPanelExpansionChanged(0) call to collapse the panel +        // which would mistakenly cause the bouncer to show briefly before its visibility +        // is set to hide. Therefore, we don't want to propagate panelExpansionChanged to the +        // bouncer if the bouncer is dismissing as a result of a biometric unlock. +        when(mBiometricUnlockController.getMode()) +                .thenReturn(BiometricUnlockController.MODE_DISMISS_BOUNCER); +        mStatusBarKeyguardViewManager.onPanelExpansionChanged( +                expansionEvent( +                        /* fraction= */ KeyguardBouncer.EXPANSION_VISIBLE, +                        /* expanded= */ true, +                        /* tracking= */ false)); +        verify(mBouncer, never()).setExpansion(anyFloat()); +    } + +    @Test      public void onPanelExpansionChanged_neverTranslatesBouncerWhenLaunchingApp() {          when(mCentralSurfaces.isInLaunchTransition()).thenReturn(true);          mStatusBarKeyguardViewManager.onPanelExpansionChanged( @@ -381,6 +398,16 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {      }      @Test +    public void testBouncerIsOrWillBeShowing_whenBouncerIsInTransit() { +        when(mBouncer.isShowing()).thenReturn(false); +        when(mBouncer.inTransit()).thenReturn(true); + +        assertTrue( +                "Is or will be showing should be true when bouncer is in transit", +                mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing()); +    } + +    @Test      public void testShowAltAuth_unlockingWithBiometricNotAllowed() {          // GIVEN alt auth exists, unlocking with biometric isn't allowed          mStatusBarKeyguardViewManager.setAlternateAuthInterceptor(mAlternateAuthInterceptor); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java index 6abc687f0ebb..034e06d7e8c4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java @@ -16,6 +16,11 @@ package com.android.systemui.statusbar.phone.fragment;  import static android.view.Display.DEFAULT_DISPLAY; +import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_IN; +import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_OUT; +import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.IDLE; +import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.RUNNING_CHIP_ANIM; +  import static org.junit.Assert.assertEquals;  import static org.junit.Assert.assertFalse;  import static org.junit.Assert.assertTrue; @@ -25,6 +30,7 @@ import static org.mockito.Mockito.atLeast;  import static org.mockito.Mockito.mock;  import static org.mockito.Mockito.when; +import android.animation.Animator;  import android.app.Fragment;  import android.app.StatusBarManager;  import android.content.Context; @@ -127,7 +133,8 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {      }      @Test -    public void testDisableSystemInfo() { +    public void testDisableSystemInfo_systemAnimationIdle_doesHide() { +        when(mAnimationScheduler.getAnimationState()).thenReturn(IDLE);          CollapsedStatusBarFragment fragment = resumeAndGetFragment();          fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_SYSTEM_INFO, 0, false); @@ -140,6 +147,98 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {      }      @Test +    public void testSystemStatusAnimation_startedDisabled_finishedWithAnimator_showsSystemInfo() { +        // GIVEN the status bar hides the system info via disable flags, while there is no event +        CollapsedStatusBarFragment fragment = resumeAndGetFragment(); +        when(mAnimationScheduler.getAnimationState()).thenReturn(IDLE); +        fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_SYSTEM_INFO, 0, false); +        assertEquals(View.INVISIBLE, getSystemIconAreaView().getVisibility()); + +        // WHEN the disable flags are cleared during a system event animation +        when(mAnimationScheduler.getAnimationState()).thenReturn(RUNNING_CHIP_ANIM); +        fragment.disable(DEFAULT_DISPLAY, 0, 0, false); + +        // THEN the view is made visible again, but still low alpha +        assertEquals(View.VISIBLE, getSystemIconAreaView().getVisibility()); +        assertEquals(0, getSystemIconAreaView().getAlpha(), 0.01); + +        // WHEN the system event animation finishes +        when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_OUT); +        Animator anim = fragment.onSystemEventAnimationFinish(false); +        anim.start(); +        processAllMessages(); +        anim.end(); + +        // THEN the system info is full alpha +        assertEquals(1, getSystemIconAreaView().getAlpha(), 0.01); +    } + +    @Test +    public void testSystemStatusAnimation_systemInfoDisabled_staysInvisible() { +        // GIVEN the status bar hides the system info via disable flags, while there is no event +        CollapsedStatusBarFragment fragment = resumeAndGetFragment(); +        when(mAnimationScheduler.getAnimationState()).thenReturn(IDLE); +        fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_SYSTEM_INFO, 0, false); +        assertEquals(View.INVISIBLE, getSystemIconAreaView().getVisibility()); + +        // WHEN the system event animation finishes +        when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_OUT); +        Animator anim = fragment.onSystemEventAnimationFinish(false); +        anim.start(); +        processAllMessages(); +        anim.end(); + +        // THEN the system info is at full alpha, but still INVISIBLE (since the disable flag is +        // still set) +        assertEquals(1, getSystemIconAreaView().getAlpha(), 0.01); +        assertEquals(View.INVISIBLE, getSystemIconAreaView().getVisibility()); +    } + + +    @Test +    public void testSystemStatusAnimation_notDisabled_animatesAlphaZero() { +        // GIVEN the status bar is not disabled +        CollapsedStatusBarFragment fragment = resumeAndGetFragment(); +        when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_IN); +        // WHEN the system event animation begins +        Animator anim = fragment.onSystemEventAnimationBegin(); +        anim.start(); +        processAllMessages(); +        anim.end(); + +        // THEN the system info is visible but alpha 0 +        assertEquals(View.VISIBLE, getSystemIconAreaView().getVisibility()); +        assertEquals(0, getSystemIconAreaView().getAlpha(), 0.01); +    } + +    @Test +    public void testSystemStatusAnimation_notDisabled_animatesBackToAlphaOne() { +        // GIVEN the status bar is not disabled +        CollapsedStatusBarFragment fragment = resumeAndGetFragment(); +        when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_IN); +        // WHEN the system event animation begins +        Animator anim = fragment.onSystemEventAnimationBegin(); +        anim.start(); +        processAllMessages(); +        anim.end(); + +        // THEN the system info is visible but alpha 0 +        assertEquals(View.VISIBLE, getSystemIconAreaView().getVisibility()); +        assertEquals(0, getSystemIconAreaView().getAlpha(), 0.01); + +        // WHEN the system event animation finishes +        when(mAnimationScheduler.getAnimationState()).thenReturn(ANIMATING_OUT); +        anim = fragment.onSystemEventAnimationFinish(false); +        anim.start(); +        processAllMessages(); +        anim.end(); + +        // THEN the syste info is full alpha and VISIBLE +        assertEquals(View.VISIBLE, getSystemIconAreaView().getVisibility()); +        assertEquals(1, getSystemIconAreaView().getAlpha(), 0.01); +    } + +    @Test      public void testDisableNotifications() {          CollapsedStatusBarFragment fragment = resumeAndGetFragment(); diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index abe68c47b050..fe85db286fa8 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -32,10 +32,8 @@ import android.annotation.NonNull;  import android.annotation.Nullable;  import android.app.ActivityManagerInternal;  import android.content.ComponentName; -import android.content.Intent;  import android.content.pm.PackageManager;  import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.ResolveInfo;  import android.content.pm.ServiceInfo;  import android.graphics.Rect;  import android.metrics.LogMaker; @@ -241,31 +239,6 @@ final class AutofillManagerServiceImpl      @Override // from PerUserSystemService      protected ServiceInfo newServiceInfoLocked(@NonNull ComponentName serviceComponent)              throws NameNotFoundException { -        final List<ResolveInfo> resolveInfos = -                getContext().getPackageManager().queryIntentServicesAsUser( -                    new Intent(AutofillService.SERVICE_INTERFACE), -                    // The MATCH_INSTANT flag is added because curret autofill CTS module is -                    // defined in one apk, which makes the test autofill service installed in a -                    // instant app when the CTS tests are running in instant app mode. -                    // TODO: Remove MATCH_INSTANT flag after completing refactoring the CTS module -                    //       to make the test autofill service a separate apk. -                    PackageManager.GET_META_DATA | PackageManager.MATCH_INSTANT, -                    mUserId); -        boolean serviceHasAutofillIntentFilter = false; -        for (ResolveInfo resolveInfo : resolveInfos) { -            final ServiceInfo serviceInfo = resolveInfo.serviceInfo; -            if (serviceInfo.getComponentName().equals(serviceComponent)) { -                serviceHasAutofillIntentFilter = true; -                break; -            } -        } -        if (!serviceHasAutofillIntentFilter) { -            Slog.w(TAG, -                    "Autofill service from '" + serviceComponent.getPackageName() + "' does" -                            + "not have intent filter " + AutofillService.SERVICE_INTERFACE); -            throw new SecurityException("Service does not declare intent filter " -                            + AutofillService.SERVICE_INTERFACE); -        }          mInfo = new AutofillServiceInfo(getContext(), serviceComponent, mUserId);          return mInfo.getServiceInfo();      } diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java index 5f36496a2284..bc5d6457c945 100644 --- a/services/autofill/java/com/android/server/autofill/Helper.java +++ b/services/autofill/java/com/android/server/autofill/Helper.java @@ -18,15 +18,10 @@ package com.android.server.autofill;  import android.annotation.NonNull;  import android.annotation.Nullable; -import android.annotation.UserIdInt; -import android.app.ActivityManager;  import android.app.assist.AssistStructure;  import android.app.assist.AssistStructure.ViewNode;  import android.app.assist.AssistStructure.WindowNode; -import android.app.slice.Slice; -import android.app.slice.SliceItem;  import android.content.ComponentName; -import android.graphics.drawable.Icon;  import android.metrics.LogMaker;  import android.service.autofill.Dataset;  import android.service.autofill.InternalSanitizer; @@ -39,7 +34,6 @@ import android.view.View;  import android.view.WindowManager;  import android.view.autofill.AutofillId;  import android.view.autofill.AutofillValue; -import android.widget.RemoteViews;  import com.android.internal.logging.nano.MetricsProto.MetricsEvent;  import com.android.internal.util.ArrayUtils; @@ -48,7 +42,6 @@ import java.io.PrintWriter;  import java.util.ArrayDeque;  import java.util.ArrayList;  import java.util.Arrays; -import java.util.concurrent.atomic.AtomicBoolean;  public final class Helper { @@ -82,86 +75,6 @@ public final class Helper {          throw new UnsupportedOperationException("contains static members only");      } -    private static boolean checkRemoteViewUriPermissions( -            @UserIdInt int userId, @NonNull RemoteViews rView) { -        final AtomicBoolean permissionsOk = new AtomicBoolean(true); - -        rView.visitUris(uri -> { -            int uriOwnerId = android.content.ContentProvider.getUserIdFromUri(uri, userId); -            boolean allowed = uriOwnerId == userId; -            permissionsOk.set(allowed && permissionsOk.get()); -        }); - -        return permissionsOk.get(); -    } - -    /** -     * Checks the URI permissions of the remote view, -     * to see if the current userId is able to access it. -     * -     * Returns the RemoteView that is passed if user is able, null otherwise. -     * -     * TODO: instead of returning a null remoteview when -     * the current userId cannot access an URI, -     * return a new RemoteView with the URI removed. -     */ -    public static @Nullable RemoteViews sanitizeRemoteView(RemoteViews rView) { -        if (rView == null) return null; - -        int userId = ActivityManager.getCurrentUser(); - -        boolean ok = checkRemoteViewUriPermissions(userId, rView); -        if (!ok) { -            Slog.w(TAG, -                    "sanitizeRemoteView() user: " + userId -                    + " tried accessing resource that does not belong to them"); -        } -        return (ok ? rView : null); -    } - -    /** -     * Checks the URI permissions of the icon in the slice, to see if the current userId is able to -     * access it. -     * -     * <p>Returns null if slice contains user inaccessible icons -     * -     * <p>TODO: instead of returning a null Slice when the current userId cannot access an icon, -     * return a reconstructed Slice without the icons. This is currently non-trivial since there are -     * no public methods to generically add SliceItems to Slices -     */ -    public static @Nullable Slice sanitizeSlice(Slice slice) { -        if (slice == null) { -            return null; -        } - -        int userId = ActivityManager.getCurrentUser(); - -        // Recontruct the Slice, filtering out bad icons -        for (SliceItem sliceItem : slice.getItems()) { -            if (!sliceItem.getFormat().equals(SliceItem.FORMAT_IMAGE)) { -                // Not an image slice -                continue; -            } - -            Icon icon = sliceItem.getIcon(); -            if (icon.getType() !=  Icon.TYPE_URI -                    && icon.getType() != Icon.TYPE_URI_ADAPTIVE_BITMAP) { -                // No URIs to sanitize -                continue; -            } - -            int iconUriId = android.content.ContentProvider.getUserIdFromUri(icon.getUri(), userId); - -            if (iconUriId != userId) { -                Slog.w(TAG, "sanitizeSlice() user: " + userId + " cannot access icons in Slice"); -                return null; -            } -        } - -        return slice; -    } - -      @Nullable      static AutofillId[] toArray(@Nullable ArraySet<AutofillId> set) {          if (set == null) return null; diff --git a/services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java b/services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java index 59184e9ed288..c2c630e01bee 100644 --- a/services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java @@ -52,7 +52,6 @@ import android.widget.TextView;  import com.android.internal.R;  import com.android.server.autofill.AutofillManagerService; -import com.android.server.autofill.Helper;  import java.io.PrintWriter;  import java.util.ArrayList; @@ -198,8 +197,7 @@ final class DialogFillUi {      }      private void setHeader(View decor, FillResponse response) { -        final RemoteViews presentation = -                Helper.sanitizeRemoteView(response.getDialogHeader()); +        final RemoteViews presentation = response.getDialogHeader();          if (presentation == null) {              return;          } @@ -234,10 +232,9 @@ final class DialogFillUi {      }      private void initialAuthenticationLayout(View decor, FillResponse response) { -        RemoteViews presentation = Helper.sanitizeRemoteView( -                response.getDialogPresentation()); +        RemoteViews presentation = response.getDialogPresentation();          if (presentation == null) { -            presentation = Helper.sanitizeRemoteView(response.getPresentation()); +            presentation = response.getPresentation();          }          if (presentation == null) {              throw new RuntimeException("No presentation for fill dialog authentication"); @@ -281,8 +278,7 @@ final class DialogFillUi {              final Dataset dataset = response.getDatasets().get(i);              final int index = dataset.getFieldIds().indexOf(focusedViewId);              if (index >= 0) { -                RemoteViews presentation = Helper.sanitizeRemoteView( -                        dataset.getFieldDialogPresentation(index)); +                RemoteViews presentation = dataset.getFieldDialogPresentation(index);                  if (presentation == null) {                      if (sDebug) {                          Slog.w(TAG, "not displaying UI on field " + focusedViewId + " because " diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java index 76fa258734cc..8fbdd81cc4cc 100644 --- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java @@ -144,9 +144,8 @@ final class FillUi {          final LayoutInflater inflater = LayoutInflater.from(mContext); -        final RemoteViews headerPresentation = Helper.sanitizeRemoteView(response.getHeader()); -        final RemoteViews footerPresentation = Helper.sanitizeRemoteView(response.getFooter()); - +        final RemoteViews headerPresentation = response.getHeader(); +        final RemoteViews footerPresentation = response.getFooter();          final ViewGroup decor;          if (mFullScreen) {              decor = (ViewGroup) inflater.inflate(R.layout.autofill_dataset_picker_fullscreen, null); @@ -224,9 +223,6 @@ final class FillUi {              ViewGroup container = decor.findViewById(R.id.autofill_dataset_picker);              final View content;              try { -                if (Helper.sanitizeRemoteView(response.getPresentation()) == null) { -                    throw new RuntimeException("Permission error accessing RemoteView"); -                }                  content = response.getPresentation().applyWithTheme(                          mContext, decor, interceptionHandler, mThemeId);                  container.addView(content); @@ -306,8 +302,7 @@ final class FillUi {                  final Dataset dataset = response.getDatasets().get(i);                  final int index = dataset.getFieldIds().indexOf(focusedViewId);                  if (index >= 0) { -                    final RemoteViews presentation = Helper.sanitizeRemoteView( -                            dataset.getFieldPresentation(index)); +                    final RemoteViews presentation = dataset.getFieldPresentation(index);                      if (presentation == null) {                          Slog.w(TAG, "not displaying UI on field " + focusedViewId + " because "                                  + "service didn't provide a presentation for it on " + dataset); diff --git a/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionViewConnector.java b/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionViewConnector.java index 83caf743a39a..46d435d8811d 100644 --- a/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionViewConnector.java +++ b/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionViewConnector.java @@ -27,7 +27,6 @@ import android.service.autofill.InlinePresentation;  import android.util.Slog;  import com.android.server.LocalServices; -import com.android.server.autofill.Helper;  import com.android.server.autofill.RemoteInlineSuggestionRenderService;  import com.android.server.inputmethod.InputMethodManagerInternal; @@ -40,9 +39,12 @@ import java.util.function.Consumer;  final class RemoteInlineSuggestionViewConnector {      private static final String TAG = RemoteInlineSuggestionViewConnector.class.getSimpleName(); -    @Nullable private final RemoteInlineSuggestionRenderService mRemoteRenderService; -    @NonNull private final InlinePresentation mInlinePresentation; -    @Nullable private final IBinder mHostInputToken; +    @Nullable +    private final RemoteInlineSuggestionRenderService mRemoteRenderService; +    @NonNull +    private final InlinePresentation mInlinePresentation; +    @Nullable +    private final IBinder mHostInputToken;      private final int mDisplayId;      private final int mUserId;      private final int mSessionId; @@ -76,12 +78,8 @@ final class RemoteInlineSuggestionViewConnector {       *       * @return true if the call is made to the remote renderer service, false otherwise.       */ -    public boolean renderSuggestion( -            int width, int height, @NonNull IInlineSuggestionUiCallback callback) { -        if (Helper.sanitizeSlice(mInlinePresentation.getSlice()) == null) { -            if (sDebug) Slog.d(TAG, "Skipped rendering inline suggestion."); -            return false; -        } +    public boolean renderSuggestion(int width, int height, +            @NonNull IInlineSuggestionUiCallback callback) {          if (mRemoteRenderService != null) {              if (sDebug) Slog.d(TAG, "Request to recreate the UI");              mRemoteRenderService.renderSuggestion(callback, mInlinePresentation, width, height, diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java index 47ac0ce704a7..677871f6c85f 100644 --- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java @@ -368,7 +368,8 @@ final class SaveUi {              return false;          }          writeLog(MetricsEvent.AUTOFILL_SAVE_CUSTOM_DESCRIPTION); -        final RemoteViews template = Helper.sanitizeRemoteView(customDescription.getPresentation()); + +        final RemoteViews template = customDescription.getPresentation();          if (template == null) {              Slog.w(TAG, "No remote view on custom description");              return false; @@ -427,8 +428,7 @@ final class SaveUi {                      }                      final BatchUpdates batchUpdates = pair.second;                      // First apply the updates... -                    final RemoteViews templateUpdates = -                            Helper.sanitizeRemoteView(batchUpdates.getUpdates()); +                    final RemoteViews templateUpdates = batchUpdates.getUpdates();                      if (templateUpdates != null) {                          if (sDebug) Slog.d(TAG, "Applying template updates for batch update #" + i);                          templateUpdates.reapply(context, customSubtitleView); diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java index e78c8d1ddcac..76df8b9f84e8 100644 --- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java +++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java @@ -24,10 +24,8 @@ import static com.android.server.backup.UserBackupManagerService.BACKUP_METADATA  import static com.android.server.backup.UserBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;  import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT; -import android.annotation.NonNull;  import android.app.ApplicationThreadConstants;  import android.app.IBackupAgent; -import android.app.backup.BackupAgent;  import android.app.backup.BackupManager;  import android.app.backup.FullBackup;  import android.app.backup.IBackupManagerMonitor; @@ -40,12 +38,10 @@ import android.content.pm.Signature;  import android.os.ParcelFileDescriptor;  import android.os.RemoteException;  import android.provider.Settings; -import android.system.OsConstants;  import android.text.TextUtils;  import android.util.Slog;  import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.VisibleForTesting;  import com.android.server.LocalServices;  import com.android.server.backup.BackupAgentTimeoutParameters;  import com.android.server.backup.BackupRestoreTask; @@ -61,7 +57,6 @@ import com.android.server.backup.utils.FullBackupRestoreObserverUtils;  import com.android.server.backup.utils.RestoreUtils;  import com.android.server.backup.utils.TarBackupReader; -import java.io.File;  import java.io.FileOutputStream;  import java.io.IOException;  import java.io.InputStream; @@ -140,8 +135,6 @@ public class FullRestoreEngine extends RestoreEngine {      private boolean mPipesClosed;      private final BackupEligibilityRules mBackupEligibilityRules; -    private FileMetadata mReadOnlyParent = null; -      public FullRestoreEngine(              UserBackupManagerService backupManagerService, OperationStorage operationStorage,              BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer, @@ -165,22 +158,6 @@ public class FullRestoreEngine extends RestoreEngine {          mBackupEligibilityRules = backupEligibilityRules;      } -    @VisibleForTesting -    FullRestoreEngine() { -        mIsAdbRestore = false; -        mAllowApks = false; -        mEphemeralOpToken = 0; -        mUserId = 0; -        mBackupEligibilityRules = null; -        mAgentTimeoutParameters = null; -        mBuffer = null; -        mBackupManagerService = null; -        mOperationStorage = null; -        mMonitor = null; -        mMonitorTask = null; -        mOnlyPackage = null; -    } -      public IBackupAgent getAgent() {          return mAgent;      } @@ -420,11 +397,6 @@ public class FullRestoreEngine extends RestoreEngine {                          okay = false;                      } -                    if (shouldSkipReadOnlyDir(info)) { -                        // b/194894879: We don't support restore of read-only dirs. -                        okay = false; -                    } -                      // At this point we have an agent ready to handle the full                      // restore data as well as a pipe for sending data to                      // that agent.  Tell the agent to start reading from the @@ -601,45 +573,6 @@ public class FullRestoreEngine extends RestoreEngine {          return (info != null);      } -    boolean shouldSkipReadOnlyDir(FileMetadata info) { -        if (isValidParent(mReadOnlyParent, info)) { -            // This file has a read-only parent directory, we shouldn't -            // restore it. -            return true; -        } else { -            // We're now in a different branch of the file tree, update the parent -            // value. -            if (isReadOnlyDir(info)) { -                // Current directory is read-only. Remember it so that we can skip all -                // of its contents. -                mReadOnlyParent = info; -                Slog.w(TAG, "Skipping restore of " + info.path + " and its contents as " -                        + "read-only dirs are currently not supported."); -                return true; -            } else { -                mReadOnlyParent = null; -            } -        } - -        return false; -    } - -    private static boolean isValidParent(FileMetadata parentDir, @NonNull FileMetadata childDir) { -        return parentDir != null -                && childDir.packageName.equals(parentDir.packageName) -                && childDir.domain.equals(parentDir.domain) -                && childDir.path.startsWith(getPathWithTrailingSeparator(parentDir.path)); -    } - -    private static String getPathWithTrailingSeparator(String path) { -        return path.endsWith(File.separator) ? path : path + File.separator; -    } - -    private static boolean isReadOnlyDir(FileMetadata file) { -        // Check if owner has 'write' bit in the file's mode value (see 'man -7 inode' for details). -        return file.type == BackupAgent.TYPE_DIRECTORY && (file.mode & OsConstants.S_IWUSR) == 0; -    } -      private void setUpPipes() throws IOException {          synchronized (mPipesLock) {              mPipes = ParcelFileDescriptor.createPipe(); diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index c678a67e5bd3..1fab28efb1ac 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -160,6 +160,8 @@ public class Watchdog implements Dumpable {      public static final String[] AIDL_INTERFACE_PREFIXES_OF_INTEREST = new String[] {              "android.hardware.biometrics.face.IFace/",              "android.hardware.biometrics.fingerprint.IFingerprint/", +            "android.hardware.graphics.composer3.IComposer/", +            "android.hardware.input.processor.IInputProcessor/",              "android.hardware.light.ILights/",              "android.hardware.power.IPower/",              "android.hardware.power.stats.IPowerStats/", diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 2c2579f9e504..2ec744fd4bb8 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -183,7 +183,7 @@ final class ActivityManagerShellCommand extends ShellCommand {      private boolean mAsync;      private BroadcastOptions mBroadcastOptions;      private boolean mShowSplashScreen; -    private boolean mDismissKeyguardIfInsecure; +    private boolean mDismissKeyguard;      final boolean mDumping; @@ -442,8 +442,8 @@ final class ActivityManagerShellCommand extends ShellCommand {                      mAsync = true;                  } else if (opt.equals("--splashscreen-show-icon")) {                      mShowSplashScreen = true; -                } else if (opt.equals("--dismiss-keyguard-if-insecure")) { -                    mDismissKeyguardIfInsecure = true; +                } else if (opt.equals("--dismiss-keyguard")) { +                    mDismissKeyguard = true;                  } else {                      return false;                  } @@ -588,11 +588,11 @@ final class ActivityManagerShellCommand extends ShellCommand {                  }                  options.setSplashScreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON);              } -            if (mDismissKeyguardIfInsecure) { +            if (mDismissKeyguard) {                  if (options == null) {                      options = ActivityOptions.makeBasic();                  } -                options.setDismissKeyguardIfInsecure(); +                options.setDismissKeyguard();              }              if (mWaitOption) {                  result = mInternal.startActivityAndWait(null, SHELL_PACKAGE_NAME, null, intent, diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index f7fbbe4ebead..e9658dbc7b1a 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1556,14 +1556,22 @@ public class OomAdjuster {          boolean foregroundActivities = false;          boolean hasVisibleActivities = false; -        if (PROCESS_STATE_CUR_TOP == PROCESS_STATE_TOP && app == topApp) { +        if (app == topApp && (PROCESS_STATE_CUR_TOP == PROCESS_STATE_TOP +                || PROCESS_STATE_CUR_TOP == PROCESS_STATE_IMPORTANT_FOREGROUND)) {              // The last app on the list is the foreground app.              adj = ProcessList.FOREGROUND_APP_ADJ; -            schedGroup = ProcessList.SCHED_GROUP_TOP_APP; -            state.setAdjType("top-activity"); +            if (PROCESS_STATE_CUR_TOP == PROCESS_STATE_TOP) { +                schedGroup = ProcessList.SCHED_GROUP_TOP_APP; +                state.setAdjType("top-activity"); +            } else { +                // Demote the scheduling group to avoid CPU contention if there is another more +                // important process which also uses top-app, such as if SystemUI is animating. +                schedGroup = ProcessList.SCHED_GROUP_DEFAULT; +                state.setAdjType("intermediate-top-activity"); +            }              foregroundActivities = true;              hasVisibleActivities = true; -            procState = PROCESS_STATE_CUR_TOP; +            procState = PROCESS_STATE_TOP;              if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {                  reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top: " + app);              } diff --git a/services/core/java/com/android/server/audio/AdiDeviceState.java b/services/core/java/com/android/server/audio/AdiDeviceState.java new file mode 100644 index 000000000000..eab1eca90f6c --- /dev/null +++ b/services/core/java/com/android/server/audio/AdiDeviceState.java @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.audio; + +import static android.media.AudioSystem.DEVICE_NONE; +import static android.media.AudioSystem.isBluetoothDevice; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.media.AudioDeviceAttributes; +import android.media.AudioDeviceInfo; +import android.text.TextUtils; +import android.util.Log; +import android.util.Pair; + +import java.util.Objects; + +/** + * Class representing all devices that were previously or are currently connected. Data is + * persisted in {@link android.provider.Settings.Secure} + */ +/*package*/ final class AdiDeviceState { +    private static final String TAG = "AS.AdiDeviceState"; + +    private static final String SETTING_FIELD_SEPARATOR = ","; + +    @AudioDeviceInfo.AudioDeviceType +    private final int mDeviceType; + +    private final int mInternalDeviceType; +    @NonNull +    private final String mDeviceAddress; +    /** Unique device id from internal device type and address. */ +    private final Pair<Integer, String> mDeviceId; +    private boolean mSAEnabled; +    private boolean mHasHeadTracker = false; +    private boolean mHeadTrackerEnabled; + +    /** +     * Constructor +     * +     * @param deviceType external audio device type +     * @param internalDeviceType if not set pass {@link DEVICE_NONE}, in this case the +     *                           default conversion of the external type will be used +     * @param address must be non-null for wireless devices +     * @throws NullPointerException if a null address is passed for a wireless device +     */ +    AdiDeviceState(@AudioDeviceInfo.AudioDeviceType int deviceType, +                        int internalDeviceType, +                        @Nullable String address) { +        mDeviceType = deviceType; +        if (internalDeviceType != DEVICE_NONE) { +            mInternalDeviceType = internalDeviceType; +        } else { +            mInternalDeviceType = AudioDeviceInfo.convertDeviceTypeToInternalDevice(deviceType); + +        } +        mDeviceAddress = isBluetoothDevice(mInternalDeviceType) ? Objects.requireNonNull( +                address) : ""; +        mDeviceId = new Pair<>(mInternalDeviceType, mDeviceAddress); +    } + +    public Pair<Integer, String> getDeviceId() { +        return mDeviceId; +    } + + + +    @AudioDeviceInfo.AudioDeviceType +    public int getDeviceType() { +        return mDeviceType; +    } + +    public int getInternalDeviceType() { +        return mInternalDeviceType; +    } + +    @NonNull +    public String getDeviceAddress() { +        return mDeviceAddress; +    } + +    public void setSAEnabled(boolean sAEnabled) { +        mSAEnabled = sAEnabled; +    } + +    public boolean isSAEnabled() { +        return mSAEnabled; +    } + +    public void setHeadTrackerEnabled(boolean headTrackerEnabled) { +        mHeadTrackerEnabled = headTrackerEnabled; +    } + +    public boolean isHeadTrackerEnabled() { +        return mHeadTrackerEnabled; +    } + +    public void setHasHeadTracker(boolean hasHeadTracker) { +        mHasHeadTracker = hasHeadTracker; +    } + + +    public boolean hasHeadTracker() { +        return mHasHeadTracker; +    } + +    @Override +    public boolean equals(Object obj) { +        if (this == obj) { +            return true; +        } +        if (obj == null) { +            return false; +        } +        // type check and cast +        if (getClass() != obj.getClass()) { +            return false; +        } +        final AdiDeviceState sads = (AdiDeviceState) obj; +        return mDeviceType == sads.mDeviceType +                && mInternalDeviceType == sads.mInternalDeviceType +                && mDeviceAddress.equals(sads.mDeviceAddress)  // NonNull +                && mSAEnabled == sads.mSAEnabled +                && mHasHeadTracker == sads.mHasHeadTracker +                && mHeadTrackerEnabled == sads.mHeadTrackerEnabled; +    } + +    @Override +    public int hashCode() { +        return Objects.hash(mDeviceType, mInternalDeviceType, mDeviceAddress, mSAEnabled, +                mHasHeadTracker, mHeadTrackerEnabled); +    } + +    @Override +    public String toString() { +        return "type: " + mDeviceType +                + " internal type: 0x" + Integer.toHexString(mInternalDeviceType) +                + " addr: " + mDeviceAddress + " enabled: " + mSAEnabled +                + " HT: " + mHasHeadTracker + " HTenabled: " + mHeadTrackerEnabled; +    } + +    public String toPersistableString() { +        return (new StringBuilder().append(mDeviceType) +                .append(SETTING_FIELD_SEPARATOR).append(mDeviceAddress) +                .append(SETTING_FIELD_SEPARATOR).append(mSAEnabled ? "1" : "0") +                .append(SETTING_FIELD_SEPARATOR).append(mHasHeadTracker ? "1" : "0") +                .append(SETTING_FIELD_SEPARATOR).append(mHeadTrackerEnabled ? "1" : "0") +                .append(SETTING_FIELD_SEPARATOR).append(mInternalDeviceType) +                .toString()); +    } + +    /** +     * Gets the max size (including separators) when persisting the elements with +     * {@link AdiDeviceState#toPersistableString()}. +     */ +    public static int getPeristedMaxSize() { +        return 36;  /* (mDeviceType)2 + (mDeviceAddresss)17 + (mInternalDeviceType)9 + (mSAEnabled)1 +                           + (mHasHeadTracker)1 + (mHasHeadTrackerEnabled)1 +                           + (SETTINGS_FIELD_SEPARATOR)5 */ +    } + +    @Nullable +    public static AdiDeviceState fromPersistedString(@Nullable String persistedString) { +        if (persistedString == null) { +            return null; +        } +        if (persistedString.isEmpty()) { +            return null; +        } +        String[] fields = TextUtils.split(persistedString, SETTING_FIELD_SEPARATOR); +        // we may have 5 fields for the legacy AdiDeviceState and 6 containing the internal +        // device type +        if (fields.length != 5 && fields.length != 6) { +            // expecting all fields, fewer may mean corruption, ignore those settings +            return null; +        } +        try { +            final int deviceType = Integer.parseInt(fields[0]); +            int internalDeviceType = -1; +            if (fields.length == 6) { +                internalDeviceType = Integer.parseInt(fields[5]); +            } +            final AdiDeviceState deviceState = new AdiDeviceState(deviceType, +                    internalDeviceType, fields[1]); +            deviceState.setHasHeadTracker(Integer.parseInt(fields[2]) == 1); +            deviceState.setHasHeadTracker(Integer.parseInt(fields[3]) == 1); +            deviceState.setHeadTrackerEnabled(Integer.parseInt(fields[4]) == 1); +            return deviceState; +        } catch (NumberFormatException e) { +            Log.e(TAG, "unable to parse setting for AdiDeviceState: " + persistedString, e); +            return null; +        } +    } + +    public AudioDeviceAttributes getAudioDeviceAttributes() { +        return new AudioDeviceAttributes(AudioDeviceAttributes.ROLE_OUTPUT, +                mDeviceType, mDeviceAddress); +    } + +} diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 03dcc8d711d3..6ccdd827b45a 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -46,6 +46,7 @@ import android.os.RemoteCallbackList;  import android.os.RemoteException;  import android.os.SystemClock;  import android.os.UserHandle; +import android.provider.Settings;  import android.text.TextUtils;  import android.util.Log;  import android.util.PrintWriterPrinter; @@ -63,8 +64,11 @@ import java.util.UUID;  import java.util.concurrent.atomic.AtomicBoolean; -/** @hide */ -/*package*/ final class AudioDeviceBroker { +/** + * @hide + * (non final for mocking/spying) + */ +public class AudioDeviceBroker {      private static final String TAG = "AS.AudioDeviceBroker"; @@ -829,8 +833,8 @@ import java.util.concurrent.atomic.AtomicBoolean;      }      /*package*/ void registerStrategyPreferredDevicesDispatcher( -            @NonNull IStrategyPreferredDevicesDispatcher dispatcher) { -        mDeviceInventory.registerStrategyPreferredDevicesDispatcher(dispatcher); +            @NonNull IStrategyPreferredDevicesDispatcher dispatcher, boolean isPrivileged) { +        mDeviceInventory.registerStrategyPreferredDevicesDispatcher(dispatcher, isPrivileged);      }      /*package*/ void unregisterStrategyPreferredDevicesDispatcher( @@ -848,8 +852,8 @@ import java.util.concurrent.atomic.AtomicBoolean;      }      /*package*/ void registerCapturePresetDevicesRoleDispatcher( -            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) { -        mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher); +            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher, boolean isPrivileged) { +        mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher, isPrivileged);      }      /*package*/ void unregisterCapturePresetDevicesRoleDispatcher( @@ -857,6 +861,11 @@ import java.util.concurrent.atomic.AtomicBoolean;          mDeviceInventory.unregisterCapturePresetDevicesRoleDispatcher(dispatcher);      } +    /* package */ List<AudioDeviceAttributes> anonymizeAudioDeviceAttributesListUnchecked( +            List<AudioDeviceAttributes> devices) { +        return mAudioService.anonymizeAudioDeviceAttributesListUnchecked(devices); +    } +      /*package*/ void registerCommunicationDeviceDispatcher(              @NonNull ICommunicationDeviceDispatcher dispatcher) {          mCommDevDispatchers.register(dispatcher); @@ -1462,6 +1471,9 @@ import java.util.concurrent.atomic.AtomicBoolean;                      final int capturePreset = msg.arg1;                      mDeviceInventory.onSaveClearPreferredDevicesForCapturePreset(capturePreset);                  } break; +                case MSG_PERSIST_AUDIO_DEVICE_SETTINGS: +                    onPersistAudioDeviceSettings(); +                    break;                  default:                      Log.wtf(TAG, "Invalid message " + msg.what);              } @@ -1534,6 +1546,8 @@ import java.util.concurrent.atomic.AtomicBoolean;      // process set volume for Le Audio, obj is BleVolumeInfo      private static final int MSG_II_SET_LE_AUDIO_OUT_VOLUME = 46; +    private static final int MSG_PERSIST_AUDIO_DEVICE_SETTINGS = 54; +      private static boolean isMessageHandledUnderWakelock(int msgId) {          switch(msgId) {              case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: @@ -1919,4 +1933,95 @@ import java.util.concurrent.atomic.AtomicBoolean;              return mDeviceInventory.getDeviceSensorUuid(device);          }      } + +    /** +     * post a message to persist the audio device settings. +     * Message is delayed by 1s on purpose in case of successive changes in quick succession (at +     * init time for instance) +     * Note this method is made public to work around a Mockito bug where it needs to be public +     * in order to be mocked by a test a the same package +     * (see https://code.google.com/archive/p/mockito/issues/127) +     */ +    public void persistAudioDeviceSettings() { +        sendMsg(MSG_PERSIST_AUDIO_DEVICE_SETTINGS, SENDMSG_REPLACE, /*delay*/ 1000); +    } + +    void onPersistAudioDeviceSettings() { +        final String deviceSettings = mDeviceInventory.getDeviceSettings(); +        Log.v(TAG, "saving audio device settings: " + deviceSettings); +        final SettingsAdapter settings = mAudioService.getSettings(); +        boolean res = settings.putSecureStringForUser(mAudioService.getContentResolver(), +                Settings.Secure.AUDIO_DEVICE_INVENTORY, +                deviceSettings, UserHandle.USER_CURRENT); +        if (!res) { +            Log.e(TAG, "error saving audio device settings: " + deviceSettings); +        } +    } + +    void onReadAudioDeviceSettings() { +        final SettingsAdapter settingsAdapter = mAudioService.getSettings(); +        final ContentResolver contentResolver = mAudioService.getContentResolver(); +        String settings = settingsAdapter.getSecureStringForUser(contentResolver, +                Settings.Secure.AUDIO_DEVICE_INVENTORY, UserHandle.USER_CURRENT); +        if (settings == null) { +            Log.i(TAG, "reading spatial audio device settings from legacy key" +                    + Settings.Secure.SPATIAL_AUDIO_ENABLED); +            // legacy string format for key SPATIAL_AUDIO_ENABLED has the same order of fields like +            // the strings for key AUDIO_DEVICE_INVENTORY. This will ensure to construct valid +            // device settings when calling {@link #setDeviceSettings()} +            settings = settingsAdapter.getSecureStringForUser(contentResolver, +                    Settings.Secure.SPATIAL_AUDIO_ENABLED, UserHandle.USER_CURRENT); +            if (settings == null) { +                Log.i(TAG, "no spatial audio device settings stored with legacy key"); +            } else if (!settings.equals("")) { +                // Delete old key value and update the new key +                if (!settingsAdapter.putSecureStringForUser(contentResolver, +                        Settings.Secure.SPATIAL_AUDIO_ENABLED, +                        /*value=*/"", +                        UserHandle.USER_CURRENT)) { +                    Log.w(TAG, "cannot erase the legacy audio device settings with key " +                            + Settings.Secure.SPATIAL_AUDIO_ENABLED); +                } +                if (!settingsAdapter.putSecureStringForUser(contentResolver, +                        Settings.Secure.AUDIO_DEVICE_INVENTORY, +                        settings, +                        UserHandle.USER_CURRENT)) { +                    Log.e(TAG, "error updating the new audio device settings with key " +                            + Settings.Secure.AUDIO_DEVICE_INVENTORY); +                } +            } +        } + +        if (settings != null && !settings.equals("")) { +            setDeviceSettings(settings); +        } +    } + +    void setDeviceSettings(String settings) { +        mDeviceInventory.setDeviceSettings(settings); +    } + +    /** Test only method. */ +    String getDeviceSettings() { +        return mDeviceInventory.getDeviceSettings(); +    } + +    List<AdiDeviceState> getImmutableDeviceInventory() { +        return mDeviceInventory.getImmutableDeviceInventory(); +    } + +    void addDeviceStateToInventory(AdiDeviceState deviceState) { +        mDeviceInventory.addDeviceStateToInventory(deviceState); +    } + +    AdiDeviceState findDeviceStateForAudioDeviceAttributes(AudioDeviceAttributes ada, +            int canonicalType) { +        return mDeviceInventory.findDeviceStateForAudioDeviceAttributes(ada, canonicalType); +    } + +    //------------------------------------------------ +    // for testing purposes only +    void clearDeviceInventory() { +        mDeviceInventory.clearDeviceInventory(); +    }  } diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index dbe4fb8c8795..9524c54acc36 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -15,6 +15,8 @@   */  package com.android.server.audio; +import static android.media.AudioSystem.isBluetoothDevice; +  import android.annotation.NonNull;  import android.bluetooth.BluetoothAdapter;  import android.bluetooth.BluetoothDevice; @@ -38,6 +40,7 @@ import android.text.TextUtils;  import android.util.ArrayMap;  import android.util.ArraySet;  import android.util.Log; +import android.util.Pair;  import android.util.Slog;  import com.android.internal.annotations.GuardedBy; @@ -45,7 +48,9 @@ import com.android.internal.annotations.VisibleForTesting;  import java.io.PrintWriter;  import java.util.ArrayList; +import java.util.HashMap;  import java.util.HashSet; +import java.util.Iterator;  import java.util.LinkedHashMap;  import java.util.List;  import java.util.Objects; @@ -61,12 +66,81 @@ public class AudioDeviceInventory {      private static final String TAG = "AS.AudioDeviceInventory"; +    private static final String SETTING_DEVICE_SEPARATOR_CHAR = "|"; +    private static final String SETTING_DEVICE_SEPARATOR = "\\|"; +      // lock to synchronize all access to mConnectedDevices and mApmConnectedDevices      private final Object mDevicesLock = new Object();      //Audio Analytics ids.      private static final String mMetricsId = "audio.device."; +    private final Object mDeviceInventoryLock = new Object(); +    @GuardedBy("mDeviceInventoryLock") +    private final HashMap<Pair<Integer, String>, AdiDeviceState> mDeviceInventory = new HashMap<>(); + +    List<AdiDeviceState> getImmutableDeviceInventory() { +        synchronized (mDeviceInventoryLock) { +            return new ArrayList<AdiDeviceState>(mDeviceInventory.values()); +        } +    } + +    void addDeviceStateToInventory(AdiDeviceState deviceState) { +        synchronized (mDeviceInventoryLock) { +            mDeviceInventory.put(deviceState.getDeviceId(), deviceState); +        } +    } + +    /** +     * Adds a new entry in mDeviceInventory if the AudioDeviceAttributes passed is an sink +     * Bluetooth device and no corresponding entry already exists. +     * @param ada the device to add if needed +     */ +    void addAudioDeviceInInventoryIfNeeded(AudioDeviceAttributes ada) { +        if (!AudioSystem.isBluetoothOutDevice(ada.getInternalType())) { +            return; +        } +        synchronized (mDeviceInventoryLock) { +            if (findDeviceStateForAudioDeviceAttributes(ada, ada.getType()) != null) { +                return; +            } +            AdiDeviceState ads = new AdiDeviceState( +                    ada.getType(), ada.getInternalType(), ada.getAddress()); +            mDeviceInventory.put(ads.getDeviceId(), ads); +        } +        mDeviceBroker.persistAudioDeviceSettings(); +    } + +    /** +     * Finds the device state that matches the passed {@link AudioDeviceAttributes} and device +     * type. Note: currently this method only returns a valid device for A2DP and BLE devices. +     * +     * @param ada attributes of device to match +     * @param canonicalDeviceType external device type to match +     * @return the found {@link AdiDeviceState} matching a cached A2DP or BLE device or +     *         {@code null} otherwise. +     */ +    AdiDeviceState findDeviceStateForAudioDeviceAttributes(AudioDeviceAttributes ada, +            int canonicalDeviceType) { +        final boolean isWireless = isBluetoothDevice(ada.getInternalType()); +        synchronized (mDeviceInventoryLock) { +            for (AdiDeviceState deviceState : mDeviceInventory.values()) { +                if (deviceState.getDeviceType() == canonicalDeviceType +                        && (!isWireless || ada.getAddress().equals( +                        deviceState.getDeviceAddress()))) { +                    return deviceState; +                } +            } +        } +        return null; +    } + +    void clearDeviceInventory() { +        synchronized (mDeviceInventoryLock) { +            mDeviceInventory.clear(); +        } +    } +      // List of connected devices      // Key for map created from DeviceInfo.makeDeviceListKey()      @GuardedBy("mDevicesLock") @@ -262,6 +336,12 @@ public class AudioDeviceInventory {          mPreferredDevicesForCapturePreset.forEach((capturePreset, devices) -> {              pw.println("  " + prefix + "capturePreset:" + capturePreset                      + " devices:" + devices); }); +        pw.println("\ndevices:\n"); +        synchronized (mDeviceInventoryLock) { +            for (AdiDeviceState device : mDeviceInventory.values()) { +                pw.println("\t" + device + "\n"); +            } +        }      }      //------------------------------------------------------------ @@ -645,8 +725,8 @@ public class AudioDeviceInventory {      }      /*package*/ void registerStrategyPreferredDevicesDispatcher( -            @NonNull IStrategyPreferredDevicesDispatcher dispatcher) { -        mPrefDevDispatchers.register(dispatcher); +            @NonNull IStrategyPreferredDevicesDispatcher dispatcher, boolean isPrivileged) { +        mPrefDevDispatchers.register(dispatcher, isPrivileged);      }      /*package*/ void unregisterStrategyPreferredDevicesDispatcher( @@ -680,8 +760,8 @@ public class AudioDeviceInventory {      }      /*package*/ void registerCapturePresetDevicesRoleDispatcher( -            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) { -        mDevRoleCapturePresetDispatchers.register(dispatcher); +            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher, boolean isPrivileged) { +        mDevRoleCapturePresetDispatchers.register(dispatcher, isPrivileged);      }      /*package*/ void unregisterCapturePresetDevicesRoleDispatcher( @@ -759,6 +839,9 @@ public class AudioDeviceInventory {                  mConnectedDevices.put(deviceKey, new DeviceInfo(                          device, deviceName, address, AudioSystem.AUDIO_FORMAT_DEFAULT));                  mDeviceBroker.postAccessoryPlugMediaUnmute(device); +                if (AudioSystem.isBluetoothScoDevice(device)) { +                    addAudioDeviceInInventoryIfNeeded(attributes); +                }                  mmi.set(MediaMetrics.Property.STATE, MediaMetrics.Value.CONNECTED).record();                  return true;              } else if (!connect && isConnected) { @@ -988,8 +1071,9 @@ public class AudioDeviceInventory {          mDeviceBroker.setBluetoothA2dpOnInt(true, true /*fromA2dp*/, eventSource);          // at this point there could be another A2DP device already connected in APM, but it          // doesn't matter as this new one will overwrite the previous one -        final int res = mAudioSystem.setDeviceConnectionState(new AudioDeviceAttributes( -                AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address, name), +        AudioDeviceAttributes ada = new AudioDeviceAttributes( +                AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address, name); +        final int res = mAudioSystem.setDeviceConnectionState(ada,                  AudioSystem.DEVICE_STATE_AVAILABLE, a2dpCodec);          // TODO: log in MediaMetrics once distinction between connection failure and @@ -1011,8 +1095,7 @@ public class AudioDeviceInventory {          // The convention for head tracking sensors associated with A2DP devices is to          // use a UUID derived from the MAC address as follows:          //   time_low = 0, time_mid = 0, time_hi = 0, clock_seq = 0, node = MAC Address -        UUID sensorUuid = UuidUtils.uuidFromAudioDeviceAttributes( -                new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address)); +        UUID sensorUuid = UuidUtils.uuidFromAudioDeviceAttributes(ada);          final DeviceInfo di = new DeviceInfo(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, name,                  address, a2dpCodec, sensorUuid);          final String diKey = di.getKey(); @@ -1023,8 +1106,10 @@ public class AudioDeviceInventory {          mDeviceBroker.postAccessoryPlugMediaUnmute(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);          setCurrentAudioRouteNameIfPossible(name, true /*fromA2dp*/); +        addAudioDeviceInInventoryIfNeeded(ada);      } +      @GuardedBy("mDevicesLock")      private void makeA2dpDeviceUnavailableNow(String address, int a2dpCodec) {          MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "a2dp." + address) @@ -1118,9 +1203,9 @@ public class AudioDeviceInventory {          final int hearingAidVolIndex = mDeviceBroker.getVssVolumeForDevice(streamType,                  AudioSystem.DEVICE_OUT_HEARING_AID);          mDeviceBroker.postSetHearingAidVolumeIndex(hearingAidVolIndex, streamType); - -        mAudioSystem.setDeviceConnectionState(new AudioDeviceAttributes( -                AudioSystem.DEVICE_OUT_HEARING_AID, address, name), +        AudioDeviceAttributes ada = new AudioDeviceAttributes( +                AudioSystem.DEVICE_OUT_HEARING_AID, address, name); +        mAudioSystem.setDeviceConnectionState(ada,                  AudioSystem.DEVICE_STATE_AVAILABLE,                  AudioSystem.AUDIO_FORMAT_DEFAULT);          mConnectedDevices.put( @@ -1131,6 +1216,7 @@ public class AudioDeviceInventory {          mDeviceBroker.postApplyVolumeOnDevice(streamType,                  AudioSystem.DEVICE_OUT_HEARING_AID, "makeHearingAidDeviceAvailable");          setCurrentAudioRouteNameIfPossible(name, false /*fromA2dp*/); +        addAudioDeviceInInventoryIfNeeded(ada);          new MediaMetrics.Item(mMetricsId + "makeHearingAidDeviceAvailable")                  .set(MediaMetrics.Property.ADDRESS, address != null ? address : "")                  .set(MediaMetrics.Property.DEVICE, @@ -1167,13 +1253,15 @@ public class AudioDeviceInventory {               */              mDeviceBroker.setBluetoothA2dpOnInt(true, false /*fromA2dp*/, eventSource); -            AudioSystem.setDeviceConnectionState(new AudioDeviceAttributes(device, address, name), +            AudioDeviceAttributes ada = new AudioDeviceAttributes(device, address, name); +            AudioSystem.setDeviceConnectionState(ada,                      AudioSystem.DEVICE_STATE_AVAILABLE,                      AudioSystem.AUDIO_FORMAT_DEFAULT);              mConnectedDevices.put(DeviceInfo.makeDeviceListKey(device, address),                      new DeviceInfo(device, name, address, AudioSystem.AUDIO_FORMAT_DEFAULT));              mDeviceBroker.postAccessoryPlugMediaUnmute(device);              setCurrentAudioRouteNameIfPossible(name, /*fromA2dp=*/false); +            addAudioDeviceInInventoryIfNeeded(ada);          }          if (streamType == AudioSystem.STREAM_DEFAULT) { @@ -1474,6 +1562,9 @@ public class AudioDeviceInventory {          final int nbDispatchers = mPrefDevDispatchers.beginBroadcast();          for (int i = 0; i < nbDispatchers; i++) {              try { +                if (!((Boolean) mPrefDevDispatchers.getBroadcastCookie(i))) { +                    devices = mDeviceBroker.anonymizeAudioDeviceAttributesListUnchecked(devices); +                }                  mPrefDevDispatchers.getBroadcastItem(i).dispatchPrefDevicesChanged(                          strategy, devices);              } catch (RemoteException e) { @@ -1487,6 +1578,9 @@ public class AudioDeviceInventory {          final int nbDispatchers = mDevRoleCapturePresetDispatchers.beginBroadcast();          for (int i = 0; i < nbDispatchers; ++i) {              try { +                if (!((Boolean) mDevRoleCapturePresetDispatchers.getBroadcastCookie(i))) { +                    devices = mDeviceBroker.anonymizeAudioDeviceAttributesListUnchecked(devices); +                }                  mDevRoleCapturePresetDispatchers.getBroadcastItem(i).dispatchDevicesRoleChanged(                          capturePreset, role, devices);              } catch (RemoteException e) { @@ -1506,6 +1600,42 @@ public class AudioDeviceInventory {              return di.mSensorUuid;          }      } + +    /*package*/ String getDeviceSettings() { +        int deviceCatalogSize = 0; +        synchronized (mDeviceInventoryLock) { +            deviceCatalogSize = mDeviceInventory.size(); + +            final StringBuilder settingsBuilder = new StringBuilder( +                deviceCatalogSize * AdiDeviceState.getPeristedMaxSize()); + +            Iterator<AdiDeviceState> iterator = mDeviceInventory.values().iterator(); +            if (iterator.hasNext()) { +                settingsBuilder.append(iterator.next().toPersistableString()); +            } +            while (iterator.hasNext()) { +                settingsBuilder.append(SETTING_DEVICE_SEPARATOR_CHAR); +                settingsBuilder.append(iterator.next().toPersistableString()); +            } +            return settingsBuilder.toString(); +        } +    } + +    /*package*/ void setDeviceSettings(String settings) { +        clearDeviceInventory(); +        String[] devSettings = TextUtils.split(Objects.requireNonNull(settings), +                SETTING_DEVICE_SEPARATOR); +        // small list, not worth overhead of Arrays.stream(devSettings) +        for (String setting : devSettings) { +            AdiDeviceState devState = AdiDeviceState.fromPersistedString(setting); +            // Note if the device is not compatible with spatialization mode or the device +            // type is not canonical, it will be ignored in {@link SpatializerHelper}. +            if (devState != null) { +                addDeviceStateToInventory(devState); +            } +        } +    } +      //----------------------------------------------------------      // For tests only diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 02648c4da76f..e90f08347c44 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -341,11 +341,12 @@ public class AudioService extends IAudioService.Stub      private static final int MSG_DISPATCH_AUDIO_MODE = 40;      private static final int MSG_ROUTING_UPDATED = 41;      private static final int MSG_INIT_HEADTRACKING_SENSORS = 42; -    private static final int MSG_PERSIST_SPATIAL_AUDIO_DEVICE_SETTINGS = 43;      private static final int MSG_ADD_ASSISTANT_SERVICE_UID = 44;      private static final int MSG_REMOVE_ASSISTANT_SERVICE_UID = 45;      private static final int MSG_UPDATE_ACTIVE_ASSISTANT_SERVICE_UID = 46;      private static final int MSG_DISPATCH_DEVICE_VOLUME_BEHAVIOR = 47; +    private static final int MSG_ROTATION_UPDATE = 48; +    private static final int MSG_FOLD_UPDATE = 49;      // start of messages handled under wakelock      //   these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(), @@ -953,6 +954,8 @@ public class AudioService extends IAudioService.Stub          mPlatformType = AudioSystem.getPlatformType(context); +        mDeviceBroker = new AudioDeviceBroker(mContext, this); +          mIsSingleVolume = AudioSystem.isSingleVolume(context);          mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); @@ -965,7 +968,7 @@ public class AudioService extends IAudioService.Stub          mSfxHelper = new SoundEffectsHelper(mContext); -        mSpatializerHelper = new SpatializerHelper(this, mAudioSystem); +        mSpatializerHelper = new SpatializerHelper(this, mAudioSystem, mDeviceBroker);          mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);          mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator(); @@ -1101,8 +1104,6 @@ public class AudioService extends IAudioService.Stub          mUseFixedVolume = mContext.getResources().getBoolean(                  com.android.internal.R.bool.config_useFixedVolume); -        mDeviceBroker = new AudioDeviceBroker(mContext, this); -          mRecordMonitor = new RecordingActivityMonitor(mContext);          mRecordMonitor.registerRecordingCallback(mVoiceRecordingActivityMonitor, true); @@ -1214,7 +1215,9 @@ public class AudioService extends IAudioService.Stub          intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);          if (mMonitorRotation) { -            RotationHelper.init(mContext, mAudioHandler); +            RotationHelper.init(mContext, mAudioHandler, +                    rotationParam -> onRotationUpdate(rotationParam), +                    foldParam -> onFoldUpdate(foldParam));          }          intentFilter.addAction(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION); @@ -1361,6 +1364,20 @@ public class AudioService extends IAudioService.Stub      }      //----------------------------------------------------------------- +    // rotation/fold updates coming from RotationHelper +    void onRotationUpdate(String rotationParameter) { +        // use REPLACE as only the last rotation matters +        sendMsg(mAudioHandler, MSG_ROTATION_UPDATE, SENDMSG_REPLACE, /*arg1*/ 0, /*arg2*/ 0, +                /*obj*/ rotationParameter, /*delay*/ 0); +    } + +    void onFoldUpdate(String foldParameter) { +        // use REPLACE as only the last fold state matters +        sendMsg(mAudioHandler, MSG_FOLD_UPDATE, SENDMSG_REPLACE, /*arg1*/ 0, /*arg2*/ 0, +                /*obj*/ foldParameter, /*delay*/ 0); +    } + +    //-----------------------------------------------------------------      // monitoring requests for volume range initialization      @Override // AudioSystemAdapter.OnVolRangeInitRequestListener      public void onVolumeRangeInitRequestFromNative() { @@ -2639,8 +2656,11 @@ public class AudioService extends IAudioService.Stub              return AudioSystem.ERROR;          }          enforceModifyAudioRoutingPermission(); + +        devices = retrieveBluetoothAddresses(devices); +          final String logString = String.format( -                "setPreferredDeviceForStrategy u/pid:%d/%d strat:%d dev:%s", +                "setPreferredDevicesForStrategy u/pid:%d/%d strat:%d dev:%s",                  Binder.getCallingUid(), Binder.getCallingPid(), strategy,                  devices.stream().map(e -> e.toString()).collect(Collectors.joining(",")));          sDeviceLogger.log(new AudioEventLogger.StringEvent(logString).printLog(TAG)); @@ -2688,7 +2708,7 @@ public class AudioService extends IAudioService.Stub                      status, strategy));              return new ArrayList<AudioDeviceAttributes>();          } else { -            return devices; +            return anonymizeAudioDeviceAttributesList(devices);          }      } @@ -2701,7 +2721,8 @@ public class AudioService extends IAudioService.Stub              return;          }          enforceModifyAudioRoutingPermission(); -        mDeviceBroker.registerStrategyPreferredDevicesDispatcher(dispatcher); +        mDeviceBroker.registerStrategyPreferredDevicesDispatcher( +                dispatcher, isBluetoothPrividged());      }      /** @see AudioManager#removeOnPreferredDevicesForStrategyChangedListener( @@ -2717,7 +2738,7 @@ public class AudioService extends IAudioService.Stub      }      /** -     * @see AudioManager#setPreferredDeviceForCapturePreset(int, AudioDeviceAttributes) +     * @see AudioManager#setPreferredDevicesForCapturePreset(int, AudioDeviceAttributes)       */      public int setPreferredDevicesForCapturePreset(              int capturePreset, List<AudioDeviceAttributes> devices) { @@ -2736,6 +2757,8 @@ public class AudioService extends IAudioService.Stub              return AudioSystem.ERROR;          } +        devices = retrieveBluetoothAddresses(devices); +          final int status = mDeviceBroker.setPreferredDevicesForCapturePresetSync(                  capturePreset, devices);          if (status != AudioSystem.SUCCESS) { @@ -2774,7 +2797,7 @@ public class AudioService extends IAudioService.Stub                      status, capturePreset));              return new ArrayList<AudioDeviceAttributes>();          } else { -            return devices; +            return anonymizeAudioDeviceAttributesList(devices);          }      } @@ -2788,7 +2811,8 @@ public class AudioService extends IAudioService.Stub              return;          }          enforceModifyAudioRoutingPermission(); -        mDeviceBroker.registerCapturePresetDevicesRoleDispatcher(dispatcher); +        mDeviceBroker.registerCapturePresetDevicesRoleDispatcher( +                dispatcher, isBluetoothPrividged());      }      /** @@ -2808,7 +2832,9 @@ public class AudioService extends IAudioService.Stub      public @NonNull ArrayList<AudioDeviceAttributes> getDevicesForAttributes(              @NonNull AudioAttributes attributes) {          enforceQueryStateOrModifyRoutingPermission(); -        return getDevicesForAttributesInt(attributes, false /* forVolume */); + +        return new ArrayList<AudioDeviceAttributes>(anonymizeAudioDeviceAttributesList( +                getDevicesForAttributesInt(attributes, false /* forVolume */)));      }      /** @see AudioManager#getAudioDevicesForAttributes(AudioAttributes) @@ -2818,7 +2844,8 @@ public class AudioService extends IAudioService.Stub       */      public @NonNull ArrayList<AudioDeviceAttributes> getDevicesForAttributesUnprotected(              @NonNull AudioAttributes attributes) { -        return getDevicesForAttributesInt(attributes, false /* forVolume */); +        return new ArrayList<AudioDeviceAttributes>(anonymizeAudioDeviceAttributesList( +                getDevicesForAttributesInt(attributes, false /* forVolume */)));      }      /** @@ -5925,6 +5952,10 @@ public class AudioService extends IAudioService.Stub          }      } +    /*package*/ SettingsAdapter getSettings() { +        return mSettings; +    } +      ///////////////////////////////////////////////////////////////////////////      // Internal methods      /////////////////////////////////////////////////////////////////////////// @@ -6636,6 +6667,9 @@ public class AudioService extends IAudioService.Stub          // verify arguments          Objects.requireNonNull(device);          AudioManager.enforceValidVolumeBehavior(deviceVolumeBehavior); + +        device = retrieveBluetoothAddress(device); +          sVolumeLogger.log(new AudioEventLogger.StringEvent("setDeviceVolumeBehavior: dev:"                  + AudioSystem.getOutputDeviceName(device.getInternalType()) + " addr:"                  + device.getAddress() + " behavior:" @@ -6712,6 +6746,8 @@ public class AudioService extends IAudioService.Stub          // verify permissions          enforceQueryStateOrModifyRoutingPermission(); +        device = retrieveBluetoothAddress(device); +          return getDeviceVolumeBehaviorInt(device);      } @@ -6788,6 +6824,9 @@ public class AudioService extends IAudioService.Stub      public void setWiredDeviceConnectionState(AudioDeviceAttributes attributes,              @ConnectionState int state, String caller) {          enforceModifyAudioRoutingPermission(); + +        attributes = retrieveBluetoothAddress(attributes); +          if (state != CONNECTION_STATE_CONNECTED                  && state != CONNECTION_STATE_DISCONNECTED) {              throw new IllegalArgumentException("Invalid state " + state); @@ -6809,6 +6848,9 @@ public class AudioService extends IAudioService.Stub              boolean connected) {          Objects.requireNonNull(device);          enforceModifyAudioRoutingPermission(); + +        device = retrieveBluetoothAddress(device); +          mDeviceBroker.setTestDeviceConnectionState(device,                  connected ? CONNECTION_STATE_CONNECTED : CONNECTION_STATE_DISCONNECTED);          // simulate a routing update from native @@ -8129,10 +8171,6 @@ public class AudioService extends IAudioService.Stub                      mSpatializerHelper.onInitSensors();                      break; -                case MSG_PERSIST_SPATIAL_AUDIO_DEVICE_SETTINGS: -                    onPersistSpatialAudioDeviceSettings(); -                    break; -                  case MSG_CHECK_MUSIC_ACTIVE:                      onCheckMusicActive((String) msg.obj);                      break; @@ -8142,6 +8180,7 @@ public class AudioService extends IAudioService.Stub                      onConfigureSafeVolume((msg.what == MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED),                              (String) msg.obj);                      break; +                  case MSG_PERSIST_SAFE_VOLUME_STATE:                      onPersistSafeVolumeState(msg.arg1);                      break; @@ -8280,6 +8319,16 @@ public class AudioService extends IAudioService.Stub                  case MSG_DISPATCH_DEVICE_VOLUME_BEHAVIOR:                      dispatchDeviceVolumeBehavior((AudioDeviceAttributes) msg.obj, msg.arg1);                      break; + +                case MSG_ROTATION_UPDATE: +                    // rotation parameter format: "rotation=x" where x is one of 0, 90, 180, 270 +                    mAudioSystem.setParameters((String) msg.obj); +                    break; + +                case MSG_FOLD_UPDATE: +                    // fold parameter format: "device_folded=x" where x is one of on, off +                    mAudioSystem.setParameters((String) msg.obj); +                    break;              }          }      } @@ -9102,42 +9151,103 @@ public class AudioService extends IAudioService.Stub      }      void onInitSpatializer() { -        final String settings = mSettings.getSecureStringForUser(mContentResolver, -                Settings.Secure.SPATIAL_AUDIO_ENABLED, UserHandle.USER_CURRENT); -        if (settings == null) { -            Log.e(TAG, "error reading spatial audio device settings"); -        } else { -            Log.v(TAG, "restoring spatial audio device settings: " + settings); -            mSpatializerHelper.setSADeviceSettings(settings); -        } +        mDeviceBroker.onReadAudioDeviceSettings();          mSpatializerHelper.init(/*effectExpected*/ mHasSpatializerEffect);          mSpatializerHelper.setFeatureEnabled(mHasSpatializerEffect);      } +    private boolean isBluetoothPrividged() { +        return PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission( +                android.Manifest.permission.BLUETOOTH_CONNECT) +                || Binder.getCallingUid() == Process.SYSTEM_UID; +    } + +    List<AudioDeviceAttributes> retrieveBluetoothAddresses(List<AudioDeviceAttributes> devices) { +        if (isBluetoothPrividged()) { +            return devices; +        } + +        List<AudioDeviceAttributes> checkedDevices = new ArrayList<AudioDeviceAttributes>(); +        for (AudioDeviceAttributes ada : devices) { +            if (ada == null) { +                continue; +            } +            checkedDevices.add(retrieveBluetoothAddressUncheked(ada)); +        } +        return checkedDevices; +    } + +    AudioDeviceAttributes retrieveBluetoothAddress(@NonNull AudioDeviceAttributes ada) { +        if (isBluetoothPrividged()) { +            return ada; +        } +        return retrieveBluetoothAddressUncheked(ada); +    } + +    AudioDeviceAttributes retrieveBluetoothAddressUncheked(@NonNull AudioDeviceAttributes ada) { +        Objects.requireNonNull(ada); +        if (AudioSystem.isBluetoothDevice(ada.getInternalType())) { +            String anonymizedAddress = anonymizeBluetoothAddress(ada.getAddress()); +            for (AdiDeviceState ads : mDeviceBroker.getImmutableDeviceInventory()) { +                if (!(AudioSystem.isBluetoothDevice(ads.getInternalDeviceType()) +                        && (ada.getInternalType() == ads.getInternalDeviceType()) +                        && anonymizedAddress.equals(anonymizeBluetoothAddress( +                                ads.getDeviceAddress())))) { +                    continue; +                } +                ada.setAddress(ads.getDeviceAddress()); +                break; +            } +        } +        return ada; +    } +      /** -     * post a message to persist the spatial audio device settings. -     * Message is delayed by 1s on purpose in case of successive changes in quick succession (at -     * init time for instance) -     * Note this method is made public to work around a Mockito bug where it needs to be public -     * in order to be mocked by a test a the same package -     * (see https://code.google.com/archive/p/mockito/issues/127) +     * Convert a Bluetooth MAC address to an anonymized one when exposed to a non privileged app +     * Must match the implementation of BluetoothUtils.toAnonymizedAddress() +     * @param address Mac address to be anonymized +     * @return anonymized mac address       */ -    public void persistSpatialAudioDeviceSettings() { -        sendMsg(mAudioHandler, -                MSG_PERSIST_SPATIAL_AUDIO_DEVICE_SETTINGS, -                SENDMSG_REPLACE, /*arg1*/ 0, /*arg2*/ 0, TAG, -                /*delay*/ 1000); +    static String anonymizeBluetoothAddress(String address) { +        if (address == null || address.length() != "AA:BB:CC:DD:EE:FF".length()) { +            return null; +        } +        return "XX:XX:XX:XX" + address.substring("XX:XX:XX:XX".length()); +    } + +    private List<AudioDeviceAttributes> anonymizeAudioDeviceAttributesList( +                List<AudioDeviceAttributes> devices) { +        if (isBluetoothPrividged()) { +            return devices; +        } +        return anonymizeAudioDeviceAttributesListUnchecked(devices);      } -    void onPersistSpatialAudioDeviceSettings() { -        final String settings = mSpatializerHelper.getSADeviceSettings(); -        Log.v(TAG, "saving spatial audio device settings: " + settings); -        boolean res = mSettings.putSecureStringForUser(mContentResolver, -                Settings.Secure.SPATIAL_AUDIO_ENABLED, -                settings, UserHandle.USER_CURRENT); -        if (!res) { -            Log.e(TAG, "error saving spatial audio device settings: " + settings); +    /* package */ List<AudioDeviceAttributes> anonymizeAudioDeviceAttributesListUnchecked( +            List<AudioDeviceAttributes> devices) { +        List<AudioDeviceAttributes> anonymizedDevices = new ArrayList<AudioDeviceAttributes>(); +        for (AudioDeviceAttributes ada : devices) { +            anonymizedDevices.add(anonymizeAudioDeviceAttributesUnchecked(ada));          } +        return anonymizedDevices; +    } + +    private AudioDeviceAttributes anonymizeAudioDeviceAttributesUnchecked( +            AudioDeviceAttributes ada) { +        if (!AudioSystem.isBluetoothDevice(ada.getInternalType())) { +            return ada; +        } +        AudioDeviceAttributes res = new AudioDeviceAttributes(ada); +        res.setAddress(anonymizeBluetoothAddress(ada.getAddress())); +        return res; +    } + +    private AudioDeviceAttributes anonymizeAudioDeviceAttributes(AudioDeviceAttributes ada) { +        if (isBluetoothPrividged()) { +            return ada; +        } + +        return anonymizeAudioDeviceAttributesUnchecked(ada);      }      //========================================================================================== @@ -9167,13 +9277,16 @@ public class AudioService extends IAudioService.Stub          Objects.requireNonNull(usages);          Objects.requireNonNull(device);          enforceModifyAudioRoutingPermission(); + +        final AudioDeviceAttributes ada = retrieveBluetoothAddress(device); +          if (timeOutMs <= 0 || usages.length == 0) {              throw new IllegalArgumentException("Invalid timeOutMs/usagesToMute");          }          Log.i(TAG, "muteAwaitConnection dev:" + device + " timeOutMs:" + timeOutMs                  + " usages:" + Arrays.toString(usages)); -        if (mDeviceBroker.isDeviceConnected(device)) { +        if (mDeviceBroker.isDeviceConnected(ada)) {              // not throwing an exception as there could be a race between a connection (server-side,              // notification of connection in flight) and a mute operation (client-side)              Log.i(TAG, "muteAwaitConnection ignored, device (" + device + ") already connected"); @@ -9185,19 +9298,26 @@ public class AudioService extends IAudioService.Stub                          + mMutingExpectedDevice);                  throw new IllegalStateException("muteAwaitConnection already in progress");              } -            mMutingExpectedDevice = device; +            mMutingExpectedDevice = ada;              mMutedUsagesAwaitingConnection = usages; -            mPlaybackMonitor.muteAwaitConnection(usages, device, timeOutMs); +            mPlaybackMonitor.muteAwaitConnection(usages, ada, timeOutMs);          } -        dispatchMuteAwaitConnection(cb -> { try { -            cb.dispatchOnMutedUntilConnection(device, usages); } catch (RemoteException e) { } }); +        dispatchMuteAwaitConnection((cb, isPrivileged) -> { +            try { +                AudioDeviceAttributes dev = ada; +                if (!isPrivileged) { +                    dev = anonymizeAudioDeviceAttributesUnchecked(ada); +                } +                cb.dispatchOnMutedUntilConnection(dev, usages); +            } catch (RemoteException e) { } +        });      }      /** @see AudioManager#getMutingExpectedDevice */      public @Nullable AudioDeviceAttributes getMutingExpectedDevice() {          enforceModifyAudioRoutingPermission();          synchronized (mMuteAwaitConnectionLock) { -            return mMutingExpectedDevice; +            return anonymizeAudioDeviceAttributes(mMutingExpectedDevice);          }      } @@ -9206,6 +9326,9 @@ public class AudioService extends IAudioService.Stub      public void cancelMuteAwaitConnection(@NonNull AudioDeviceAttributes device) {          Objects.requireNonNull(device);          enforceModifyAudioRoutingPermission(); + +        final AudioDeviceAttributes ada = retrieveBluetoothAddress(device); +          Log.i(TAG, "cancelMuteAwaitConnection for device:" + device);          final int[] mutedUsages;          synchronized (mMuteAwaitConnectionLock) { @@ -9215,7 +9338,7 @@ public class AudioService extends IAudioService.Stub                  Log.i(TAG, "cancelMuteAwaitConnection ignored, no expected device");                  return;              } -            if (!device.equalTypeAddress(mMutingExpectedDevice)) { +            if (!ada.equalTypeAddress(mMutingExpectedDevice)) {                  Log.e(TAG, "cancelMuteAwaitConnection ignored, got " + device                          + "] but expected device is" + mMutingExpectedDevice);                  throw new IllegalStateException("cancelMuteAwaitConnection for wrong device"); @@ -9225,8 +9348,14 @@ public class AudioService extends IAudioService.Stub              mMutedUsagesAwaitingConnection = null;              mPlaybackMonitor.cancelMuteAwaitConnection("cancelMuteAwaitConnection dev:" + device);          } -        dispatchMuteAwaitConnection(cb -> { try { cb.dispatchOnUnmutedEvent( -                    AudioManager.MuteAwaitConnectionCallback.EVENT_CANCEL, device, mutedUsages); +        dispatchMuteAwaitConnection((cb, isPrivileged) -> { +            try { +                AudioDeviceAttributes dev = ada; +                if (!isPrivileged) { +                    dev = anonymizeAudioDeviceAttributesUnchecked(ada); +                } +                cb.dispatchOnUnmutedEvent( +                        AudioManager.MuteAwaitConnectionCallback.EVENT_CANCEL, dev, mutedUsages);              } catch (RemoteException e) { } });      } @@ -9238,7 +9367,7 @@ public class AudioService extends IAudioService.Stub              boolean register) {          enforceModifyAudioRoutingPermission();          if (register) { -            mMuteAwaitConnectionDispatchers.register(cb); +            mMuteAwaitConnectionDispatchers.register(cb, isBluetoothPrividged());          } else {              mMuteAwaitConnectionDispatchers.unregister(cb);          } @@ -9262,8 +9391,14 @@ public class AudioService extends IAudioService.Stub              mPlaybackMonitor.cancelMuteAwaitConnection(                      "checkMuteAwaitConnection device " + device + " connected, unmuting");          } -        dispatchMuteAwaitConnection(cb -> { try { cb.dispatchOnUnmutedEvent( -                AudioManager.MuteAwaitConnectionCallback.EVENT_CONNECTION, device, mutedUsages); +        dispatchMuteAwaitConnection((cb, isPrivileged) -> { +            try { +                AudioDeviceAttributes ada = device; +                if (!isPrivileged) { +                    ada = anonymizeAudioDeviceAttributesUnchecked(device); +                } +                cb.dispatchOnUnmutedEvent(AudioManager.MuteAwaitConnectionCallback.EVENT_CONNECTION, +                        ada, mutedUsages);              } catch (RemoteException e) { } });      } @@ -9283,7 +9418,8 @@ public class AudioService extends IAudioService.Stub              mMutingExpectedDevice = null;              mMutedUsagesAwaitingConnection = null;          } -        dispatchMuteAwaitConnection(cb -> { try { +        dispatchMuteAwaitConnection((cb, isPrivileged) -> { +            try {                  cb.dispatchOnUnmutedEvent(                          AudioManager.MuteAwaitConnectionCallback.EVENT_TIMEOUT,                          timedOutDevice, mutedUsages); @@ -9291,13 +9427,14 @@ public class AudioService extends IAudioService.Stub      }      private void dispatchMuteAwaitConnection( -            java.util.function.Consumer<IMuteAwaitConnectionCallback> callback) { +            java.util.function.BiConsumer<IMuteAwaitConnectionCallback, Boolean> callback) {          final int nbDispatchers = mMuteAwaitConnectionDispatchers.beginBroadcast();          // lazy initialization as errors unlikely          ArrayList<IMuteAwaitConnectionCallback> errorList = null;          for (int i = 0; i < nbDispatchers; i++) {              try { -                callback.accept(mMuteAwaitConnectionDispatchers.getBroadcastItem(i)); +                callback.accept(mMuteAwaitConnectionDispatchers.getBroadcastItem(i), +                        (Boolean) mMuteAwaitConnectionDispatchers.getBroadcastCookie(i));              } catch (Exception e) {                  if (errorList == null) {                      errorList = new ArrayList<>(1); @@ -11550,6 +11687,9 @@ public class AudioService extends IAudioService.Stub              @NonNull AudioDeviceAttributes device, @IntRange(from = 0) long delayMillis) {          Objects.requireNonNull(device, "device must not be null");          enforceModifyAudioRoutingPermission(); + +        device = retrieveBluetoothAddress(device); +          final String getterKey = "additional_output_device_delay="                  + device.getInternalType() + "," + device.getAddress(); // "getter" key as an id.          final String setterKey = getterKey + "," + delayMillis;     // append the delay for setter @@ -11570,6 +11710,9 @@ public class AudioService extends IAudioService.Stub      @IntRange(from = 0)      public long getAdditionalOutputDeviceDelay(@NonNull AudioDeviceAttributes device) {          Objects.requireNonNull(device, "device must not be null"); + +        device = retrieveBluetoothAddress(device); +          final String key = "additional_output_device_delay";          final String reply = AudioSystem.getParameters(                  key + "=" + device.getInternalType() + "," + device.getAddress()); @@ -11597,6 +11740,9 @@ public class AudioService extends IAudioService.Stub      @IntRange(from = 0)      public long getMaxAdditionalOutputDeviceDelay(@NonNull AudioDeviceAttributes device) {          Objects.requireNonNull(device, "device must not be null"); + +        device = retrieveBluetoothAddress(device); +          final String key = "max_additional_output_device_delay";          final String reply = AudioSystem.getParameters(                  key + "=" + device.getInternalType() + "," + device.getAddress()); diff --git a/services/core/java/com/android/server/audio/RotationHelper.java b/services/core/java/com/android/server/audio/RotationHelper.java index eb8387fe85e5..5cdf58bdd62f 100644 --- a/services/core/java/com/android/server/audio/RotationHelper.java +++ b/services/core/java/com/android/server/audio/RotationHelper.java @@ -21,13 +21,14 @@ import android.hardware.devicestate.DeviceStateManager;  import android.hardware.devicestate.DeviceStateManager.FoldStateListener;  import android.hardware.display.DisplayManager;  import android.hardware.display.DisplayManagerGlobal; -import android.media.AudioSystem;  import android.os.Handler;  import android.os.HandlerExecutor;  import android.util.Log;  import android.view.Display;  import android.view.Surface; +import java.util.function.Consumer; +  /**   * Class to handle device rotation events for AudioService, and forward device rotation   * and folded state to the audio HALs through AudioSystem. @@ -53,6 +54,10 @@ class RotationHelper {      private static AudioDisplayListener sDisplayListener;      private static FoldStateListener sFoldStateListener; +    /** callback to send rotation updates to AudioSystem */ +    private static Consumer<String> sRotationUpdateCb; +    /** callback to send folded state updates to AudioSystem */ +    private static Consumer<String> sFoldUpdateCb;      private static final Object sRotationLock = new Object();      private static final Object sFoldStateLock = new Object(); @@ -67,13 +72,16 @@ class RotationHelper {       * - sDisplayListener != null       * - sContext != null       */ -    static void init(Context context, Handler handler) { +    static void init(Context context, Handler handler, +            Consumer<String> rotationUpdateCb, Consumer<String> foldUpdateCb) {          if (context == null) {              throw new IllegalArgumentException("Invalid null context");          }          sContext = context;          sHandler = handler;          sDisplayListener = new AudioDisplayListener(); +        sRotationUpdateCb = rotationUpdateCb; +        sFoldUpdateCb = foldUpdateCb;          enable();      } @@ -115,21 +123,26 @@ class RotationHelper {          if (DEBUG_ROTATION) {              Log.i(TAG, "publishing device rotation =" + rotation + " (x90deg)");          } +        String rotationParam;          switch (rotation) {              case Surface.ROTATION_0: -                AudioSystem.setParameters("rotation=0"); +                rotationParam = "rotation=0";                  break;              case Surface.ROTATION_90: -                AudioSystem.setParameters("rotation=90"); +                rotationParam = "rotation=90";                  break;              case Surface.ROTATION_180: -                AudioSystem.setParameters("rotation=180"); +                rotationParam = "rotation=180";                  break;              case Surface.ROTATION_270: -                AudioSystem.setParameters("rotation=270"); +                rotationParam = "rotation=270";                  break;              default:                  Log.e(TAG, "Unknown device rotation"); +                rotationParam = null; +        } +        if (rotationParam != null) { +            sRotationUpdateCb.accept(rotationParam);          }      } @@ -140,11 +153,13 @@ class RotationHelper {          synchronized (sFoldStateLock) {              if (sDeviceFold != newFolded) {                  sDeviceFold = newFolded; +                String foldParam;                  if (newFolded) { -                    AudioSystem.setParameters("device_folded=on"); +                    foldParam = "device_folded=on";                  } else { -                    AudioSystem.setParameters("device_folded=off"); +                    foldParam = "device_folded=off";                  } +                sFoldUpdateCb.accept(foldParam);              }          }      } diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java index 5b26672c7de2..6972b1f9b82b 100644 --- a/services/core/java/com/android/server/audio/SpatializerHelper.java +++ b/services/core/java/com/android/server/audio/SpatializerHelper.java @@ -16,6 +16,8 @@  package com.android.server.audio; +import static android.media.AudioSystem.isBluetoothDevice; +  import android.annotation.NonNull;  import android.annotation.Nullable;  import android.content.Context; @@ -50,7 +52,6 @@ import java.io.PrintWriter;  import java.util.ArrayList;  import java.util.List;  import java.util.Locale; -import java.util.Objects;  import java.util.UUID;  /** @@ -70,11 +71,12 @@ public class SpatializerHelper {      private final @NonNull AudioSystemAdapter mASA;      private final @NonNull AudioService mAudioService; +    private final @NonNull AudioDeviceBroker mDeviceBroker;      private @Nullable SensorManager mSensorManager;      //------------------------------------------------------------ -    private static final SparseIntArray SPAT_MODE_FOR_DEVICE_TYPE = new SparseIntArray(15) { +    /*package*/ static final SparseIntArray SPAT_MODE_FOR_DEVICE_TYPE = new SparseIntArray(15) {          {              append(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, SpatializationMode.SPATIALIZER_TRANSAURAL);              append(AudioDeviceInfo.TYPE_WIRED_HEADSET, SpatializationMode.SPATIALIZER_BINAURAL); @@ -96,17 +98,6 @@ public class SpatializerHelper {          }      }; -    private static final int[] WIRELESS_TYPES = { AudioDeviceInfo.TYPE_BLUETOOTH_SCO, -            AudioDeviceInfo.TYPE_BLUETOOTH_A2DP, -            AudioDeviceInfo.TYPE_BLE_HEADSET, -            AudioDeviceInfo.TYPE_BLE_SPEAKER, -            AudioDeviceInfo.TYPE_BLE_BROADCAST -    }; - -    private static final int[] WIRELESS_SPEAKER_TYPES = { -            AudioDeviceInfo.TYPE_BLE_SPEAKER, -    }; -      // Spatializer state machine      private static final int STATE_UNINITIALIZED = 0;      private static final int STATE_NOT_SUPPORTED = 1; @@ -120,6 +111,7 @@ public class SpatializerHelper {      /** current level as reported by native Spatializer in callback */      private int mSpatLevel = Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE;      private int mCapableSpatLevel = Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE; +      private boolean mTransauralSupported = false;      private boolean mBinauralSupported = false;      private boolean mIsHeadTrackingSupported = false; @@ -162,17 +154,13 @@ public class SpatializerHelper {       */      private final ArrayList<Integer> mSACapableDeviceTypes = new ArrayList<>(0); -    /** -     * List of devices where Spatial Audio is possible. Each device can be enabled or disabled -     * (== user choice to use or not) -     */ -    private final ArrayList<SADeviceState> mSADevices = new ArrayList<>(0); -      //------------------------------------------------------      // initialization -    SpatializerHelper(@NonNull AudioService mother, @NonNull AudioSystemAdapter asa) { +    SpatializerHelper(@NonNull AudioService mother, @NonNull AudioSystemAdapter asa, +            @NonNull AudioDeviceBroker deviceBroker) {          mAudioService = mother;          mASA = asa; +        mDeviceBroker = deviceBroker;      }      synchronized void init(boolean effectExpected) { @@ -278,6 +266,14 @@ public class SpatializerHelper {                      mSACapableDeviceTypes.add(SPAT_MODE_FOR_DEVICE_TYPE.keyAt(i));                  }              } + +            // Log the saved device states that are compatible with SA +            for (AdiDeviceState deviceState : mDeviceBroker.getImmutableDeviceInventory()) { +                if (isSADevice(deviceState)) { +                    logDeviceState(deviceState, "setSADeviceSettings"); +                } +            } +              // for both transaural / binaural, we are not forcing enablement as the init() method              // could have been called another time after boot in case of audioserver restart              if (mTransauralSupported) { @@ -321,7 +317,7 @@ public class SpatializerHelper {          mState = STATE_UNINITIALIZED;          mSpatLevel = Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE;          mActualHeadTrackingMode = Spatializer.HEAD_TRACKING_MODE_UNSUPPORTED; -        init(true); +        init(/*effectExpected=*/true);          setSpatializerEnabledInt(featureEnabled);      } @@ -353,7 +349,7 @@ public class SpatializerHelper {                  DEFAULT_ATTRIBUTES, false /* forVolume */).toArray(ROUTING_DEVICES);          // is media routed to a new device? -        if (isWireless(ROUTING_DEVICES[0].getType())) { +        if (isBluetoothDevice(ROUTING_DEVICES[0].getInternalType())) {              addWirelessDeviceIfNew(ROUTING_DEVICES[0]);          } @@ -497,10 +493,9 @@ public class SpatializerHelper {      synchronized @NonNull List<AudioDeviceAttributes> getCompatibleAudioDevices() {          // build unionOf(mCompatibleAudioDevices, mEnabledDevice) - mDisabledAudioDevices          ArrayList<AudioDeviceAttributes> compatList = new ArrayList<>(); -        for (SADeviceState dev : mSADevices) { -            if (dev.mEnabled) { -                compatList.add(new AudioDeviceAttributes(AudioDeviceAttributes.ROLE_OUTPUT, -                        dev.mDeviceType, dev.mDeviceAddress == null ? "" : dev.mDeviceAddress)); +        for (AdiDeviceState deviceState : mDeviceBroker.getImmutableDeviceInventory()) { +            if (deviceState.isSAEnabled() && isSADevice(deviceState)) { +                compatList.add(deviceState.getAudioDeviceAttributes());              }          }          return compatList; @@ -522,34 +517,41 @@ public class SpatializerHelper {      private void addCompatibleAudioDevice(@NonNull AudioDeviceAttributes ada,              boolean forceEnable) {          loglogi("addCompatibleAudioDevice: dev=" + ada); -        final int deviceType = ada.getType(); -        final boolean wireless = isWireless(deviceType); -        boolean isInList = false; -        SADeviceState deviceUpdated = null; // non-null on update. - -        for (SADeviceState deviceState : mSADevices) { -            if (deviceType == deviceState.mDeviceType -                    && (!wireless || ada.getAddress().equals(deviceState.mDeviceAddress))) { -                isInList = true; -                if (forceEnable) { -                    deviceState.mEnabled = true; -                    deviceUpdated = deviceState; -                } -                break; +        final AdiDeviceState deviceState = findDeviceStateForAudioDeviceAttributes(ada); +        initSAState(deviceState); +        AdiDeviceState updatedDevice = null; // non-null on update. +        if (deviceState != null) { +            if (forceEnable && !deviceState.isSAEnabled()) { +                updatedDevice = deviceState; +                updatedDevice.setSAEnabled(true);              } +        } else { +            // When adding, force the device type to be a canonical one. +            final int canonicalDeviceType = getCanonicalDeviceType(ada.getType(), +                    ada.getInternalType()); +            if (canonicalDeviceType == AudioDeviceInfo.TYPE_UNKNOWN) { +                Log.e(TAG, "addCompatibleAudioDevice with incompatible AudioDeviceAttributes " +                        + ada); +                return; +            } +            updatedDevice = new AdiDeviceState(canonicalDeviceType, ada.getInternalType(), +                    ada.getAddress()); +            initSAState(updatedDevice); +            mDeviceBroker.addDeviceStateToInventory(updatedDevice);          } -        if (!isInList) { -            final SADeviceState dev = new SADeviceState(deviceType, -                    wireless ? ada.getAddress() : ""); -            dev.mEnabled = true; -            mSADevices.add(dev); -            deviceUpdated = dev; -        } -        if (deviceUpdated != null) { +        if (updatedDevice != null) {              onRoutingUpdated(); -            mAudioService.persistSpatialAudioDeviceSettings(); -            logDeviceState(deviceUpdated, "addCompatibleAudioDevice"); +            mDeviceBroker.persistAudioDeviceSettings(); +            logDeviceState(updatedDevice, "addCompatibleAudioDevice"); +        } +    } + +    private void initSAState(AdiDeviceState device) { +        if (device == null) { +            return;          } +        device.setSAEnabled(true); +        device.setHeadTrackerEnabled(true);      }      private static final String METRICS_DEVICE_PREFIX = "audio.spatializer.device."; @@ -559,38 +561,57 @@ public class SpatializerHelper {      //      // There may be different devices with the same device type (aliasing).      // We always send the full device state info on each change. -    private void logDeviceState(SADeviceState deviceState, String event) { -        final String deviceName = AudioSystem.getDeviceName(deviceState.mDeviceType); +    static void logDeviceState(AdiDeviceState deviceState, String event) { +        final String deviceName = AudioSystem.getDeviceName(deviceState.getInternalDeviceType());          new MediaMetrics.Item(METRICS_DEVICE_PREFIX + deviceName) -            .set(MediaMetrics.Property.ADDRESS, deviceState.mDeviceAddress) -            .set(MediaMetrics.Property.ENABLED, deviceState.mEnabled ? "true" : "false") -            .set(MediaMetrics.Property.EVENT, TextUtils.emptyIfNull(event)) -            .set(MediaMetrics.Property.HAS_HEAD_TRACKER, -                    deviceState.mHasHeadTracker ? "true" : "false") // this may be updated later. -            .set(MediaMetrics.Property.HEAD_TRACKER_ENABLED, -                    deviceState.mHeadTrackerEnabled ? "true" : "false") -            .record(); +                .set(MediaMetrics.Property.ADDRESS, deviceState.getDeviceAddress()) +                .set(MediaMetrics.Property.ENABLED, deviceState.isSAEnabled() ? "true" : "false") +                .set(MediaMetrics.Property.EVENT, TextUtils.emptyIfNull(event)) +                .set(MediaMetrics.Property.HAS_HEAD_TRACKER, +                        deviceState.hasHeadTracker() ? "true" +                                : "false") // this may be updated later. +                .set(MediaMetrics.Property.HEAD_TRACKER_ENABLED, +                        deviceState.isHeadTrackerEnabled() ? "true" : "false") +                .record();      }      synchronized void removeCompatibleAudioDevice(@NonNull AudioDeviceAttributes ada) {          loglogi("removeCompatibleAudioDevice: dev=" + ada); -        final int deviceType = ada.getType(); -        final boolean wireless = isWireless(deviceType); -        SADeviceState deviceUpdated = null; // non-null on update. - -        for (SADeviceState deviceState : mSADevices) { -            if (deviceType == deviceState.mDeviceType -                    && (!wireless || ada.getAddress().equals(deviceState.mDeviceAddress))) { -                deviceState.mEnabled = false; -                deviceUpdated = deviceState; -                break; -            } -        } -        if (deviceUpdated != null) { + +        final AdiDeviceState deviceState = findDeviceStateForAudioDeviceAttributes(ada); +        if (deviceState != null && deviceState.isSAEnabled()) { +            deviceState.setSAEnabled(false);              onRoutingUpdated(); -            mAudioService.persistSpatialAudioDeviceSettings(); -            logDeviceState(deviceUpdated, "removeCompatibleAudioDevice"); +            mDeviceBroker.persistAudioDeviceSettings(); +            logDeviceState(deviceState, "removeCompatibleAudioDevice"); +        } +    } + +    /** +     * Returns a possibly aliased device type which is used +     * for spatial audio settings (or TYPE_UNKNOWN  if it doesn't exist). +     */ +    @AudioDeviceInfo.AudioDeviceType +    private static int getCanonicalDeviceType(int deviceType, int internalDeviceType) { +        if (isBluetoothDevice(internalDeviceType)) return deviceType; + +        final int spatMode = SPAT_MODE_FOR_DEVICE_TYPE.get(deviceType, Integer.MIN_VALUE); +        if (spatMode == SpatializationMode.SPATIALIZER_TRANSAURAL) { +            return AudioDeviceInfo.TYPE_BUILTIN_SPEAKER; +        } else if (spatMode == SpatializationMode.SPATIALIZER_BINAURAL) { +            return AudioDeviceInfo.TYPE_WIRED_HEADPHONES;          } +        return AudioDeviceInfo.TYPE_UNKNOWN; +    } + +    /** +     * Returns the Spatial Audio device state for an audio device attributes +     * or null if it does not exist. +     */ +    @Nullable +    private AdiDeviceState findDeviceStateForAudioDeviceAttributes(AudioDeviceAttributes ada) { +        return mDeviceBroker.findDeviceStateForAudioDeviceAttributes(ada, +                getCanonicalDeviceType(ada.getType(), ada.getInternalType()));      }      /** @@ -602,7 +623,7 @@ public class SpatializerHelper {          // if not a wireless device, this value will be overwritten to map the type          // to TYPE_BUILTIN_SPEAKER or TYPE_WIRED_HEADPHONES          @AudioDeviceInfo.AudioDeviceType int deviceType = ada.getType(); -        final boolean wireless = isWireless(deviceType); +        final boolean wireless = isBluetoothDevice(ada.getInternalType());          // if not a wireless device: find if media device is in the speaker, wired headphones          if (!wireless) { @@ -625,7 +646,8 @@ public class SpatializerHelper {                  deviceType = AudioDeviceInfo.TYPE_WIRED_HEADPHONES;              }          } else { // wireless device -            if (isWirelessSpeaker(deviceType) && !mTransauralSupported) { +            if (ada.getInternalType() == AudioSystem.DEVICE_OUT_BLE_SPEAKER +                    && !mTransauralSupported) {                  Log.i(TAG, "Device incompatible with Spatial Audio (no transaural) dev:"                          + ada);                  return new Pair<>(false, false); @@ -637,34 +659,35 @@ public class SpatializerHelper {              }          } -        boolean enabled = false; -        boolean available = false; -        for (SADeviceState deviceState : mSADevices) { -            if (deviceType == deviceState.mDeviceType -                    && (wireless && ada.getAddress().equals(deviceState.mDeviceAddress)) -                    || !wireless) { -                available = true; -                enabled = deviceState.mEnabled; -                break; -            } +        final AdiDeviceState deviceState = findDeviceStateForAudioDeviceAttributes(ada); +        if (deviceState == null) { +            // no matching device state? +            Log.i(TAG, "no spatialization device state found for Spatial Audio device:" + ada); +            return new Pair<>(false, false);          } -        return new Pair<>(enabled, available); +        // found the matching device state. +        return new Pair<>(deviceState.isSAEnabled(), true);      }      private synchronized void addWirelessDeviceIfNew(@NonNull AudioDeviceAttributes ada) { -        boolean knownDevice = false; -        for (SADeviceState deviceState : mSADevices) { -            // wireless device so always check address -            if (ada.getType() == deviceState.mDeviceType -                    && ada.getAddress().equals(deviceState.mDeviceAddress)) { -                knownDevice = true; -                break; -            } +        if (!isDeviceCompatibleWithSpatializationModes(ada)) { +            return;          } -        if (!knownDevice) { -            final SADeviceState deviceState = new SADeviceState(ada.getType(), ada.getAddress()); -            mSADevices.add(deviceState); -            mAudioService.persistSpatialAudioDeviceSettings(); +        if (findDeviceStateForAudioDeviceAttributes(ada) == null) { +            // wireless device types should be canonical, but we translate to be sure. +            final int canonicalDeviceType = getCanonicalDeviceType(ada.getType(), +                    ada.getInternalType()); +            if (canonicalDeviceType == AudioDeviceInfo.TYPE_UNKNOWN) { +                Log.e(TAG, "addWirelessDeviceIfNew with incompatible AudioDeviceAttributes " +                        + ada); +                return; +            } +            final AdiDeviceState deviceState = +                    new AdiDeviceState(canonicalDeviceType, ada.getInternalType(), +                            ada.getAddress()); +            initSAState(deviceState); +            mDeviceBroker.addDeviceStateToInventory(deviceState); +            mDeviceBroker.persistAudioDeviceSettings();              logDeviceState(deviceState, "addWirelessDeviceIfNew"); // may be updated later.          }      } @@ -705,16 +728,7 @@ public class SpatializerHelper {              return false;          } -        final int deviceType = ada.getType(); -        final boolean wireless = isWireless(deviceType); -        for (SADeviceState deviceState : mSADevices) { -            if (deviceType == deviceState.mDeviceType -                    && (wireless && ada.getAddress().equals(deviceState.mDeviceAddress)) -                    || !wireless) { -                return true; -            } -        } -        return false; +        return findDeviceStateForAudioDeviceAttributes(ada) != null;      }      private synchronized boolean canBeSpatializedOnDevice(@NonNull AudioAttributes attributes, @@ -729,6 +743,26 @@ public class SpatializerHelper {          return false;      } +    private boolean isSADevice(AdiDeviceState deviceState) { +        return deviceState.getDeviceType() == getCanonicalDeviceType(deviceState.getDeviceType(), +                deviceState.getInternalDeviceType()) && isDeviceCompatibleWithSpatializationModes( +                deviceState.getAudioDeviceAttributes()); +    } + +    private boolean isDeviceCompatibleWithSpatializationModes(@NonNull AudioDeviceAttributes ada) { +        // modeForDevice will be neither transaural or binaural for devices that do not support +        // spatial audio. For instance mono devices like earpiece, speaker safe or sco must +        // not be included. +        final byte modeForDevice = (byte) SPAT_MODE_FOR_DEVICE_TYPE.get(ada.getType(), +            /*default when type not found*/ -1); +        if ((modeForDevice == SpatializationMode.SPATIALIZER_BINAURAL && mBinauralSupported) +                || (modeForDevice == SpatializationMode.SPATIALIZER_TRANSAURAL +                    && mTransauralSupported)) { +            return true; +        } +        return false; +    } +      synchronized void setFeatureEnabled(boolean enabled) {          loglogi("setFeatureEnabled(" + enabled + ") was featureEnabled:" + mFeatureEnabled);          if (mFeatureEnabled == enabled) { @@ -1089,27 +1123,20 @@ public class SpatializerHelper {              Log.v(TAG, "no headtracking support, ignoring setHeadTrackerEnabled to " + enabled                      + " for " + ada);          } -        final int deviceType = ada.getType(); -        final boolean wireless = isWireless(deviceType); - -        for (SADeviceState deviceState : mSADevices) { -            if (deviceType == deviceState.mDeviceType -                    && (wireless && ada.getAddress().equals(deviceState.mDeviceAddress)) -                    || !wireless) { -                if (!deviceState.mHasHeadTracker) { -                    Log.e(TAG, "Called setHeadTrackerEnabled enabled:" + enabled -                            + " device:" + ada + " on a device without headtracker"); -                    return; -                } -                Log.i(TAG, "setHeadTrackerEnabled enabled:" + enabled + " device:" + ada); -                deviceState.mHeadTrackerEnabled = enabled; -                mAudioService.persistSpatialAudioDeviceSettings(); -                logDeviceState(deviceState, "setHeadTrackerEnabled"); -                break; -            } +        final AdiDeviceState deviceState = findDeviceStateForAudioDeviceAttributes(ada); +        if (deviceState == null) return; +        if (!deviceState.hasHeadTracker()) { +            Log.e(TAG, "Called setHeadTrackerEnabled enabled:" + enabled +                    + " device:" + ada + " on a device without headtracker"); +            return;          } +        Log.i(TAG, "setHeadTrackerEnabled enabled:" + enabled + " device:" + ada); +        deviceState.setHeadTrackerEnabled(enabled); +        mDeviceBroker.persistAudioDeviceSettings(); +        logDeviceState(deviceState, "setHeadTrackerEnabled"); +          // check current routing to see if it affects the headtracking mode -        if (ROUTING_DEVICES[0].getType() == deviceType +        if (ROUTING_DEVICES[0].getType() == ada.getType()                  && ROUTING_DEVICES[0].getAddress().equals(ada.getAddress())) {              setDesiredHeadTrackingMode(enabled ? mDesiredHeadTrackingModeWhenEnabled                      : Spatializer.HEAD_TRACKING_MODE_DISABLED); @@ -1121,17 +1148,8 @@ public class SpatializerHelper {              Log.v(TAG, "no headtracking support, hasHeadTracker always false for " + ada);              return false;          } -        final int deviceType = ada.getType(); -        final boolean wireless = isWireless(deviceType); - -        for (SADeviceState deviceState : mSADevices) { -            if (deviceType == deviceState.mDeviceType -                    && (wireless && ada.getAddress().equals(deviceState.mDeviceAddress)) -                    || !wireless) { -                return deviceState.mHasHeadTracker; -            } -        } -        return false; +        final AdiDeviceState deviceState = findDeviceStateForAudioDeviceAttributes(ada); +        return deviceState != null && deviceState.hasHeadTracker();      }      /** @@ -1144,20 +1162,14 @@ public class SpatializerHelper {              Log.v(TAG, "no headtracking support, setHasHeadTracker always false for " + ada);              return false;          } -        final int deviceType = ada.getType(); -        final boolean wireless = isWireless(deviceType); - -        for (SADeviceState deviceState : mSADevices) { -            if (deviceType == deviceState.mDeviceType -                    && (wireless && ada.getAddress().equals(deviceState.mDeviceAddress)) -                    || !wireless) { -                if (!deviceState.mHasHeadTracker) { -                    deviceState.mHasHeadTracker = true; -                    mAudioService.persistSpatialAudioDeviceSettings(); -                    logDeviceState(deviceState, "setHasHeadTracker"); -                } -                return deviceState.mHeadTrackerEnabled; +        final AdiDeviceState deviceState = findDeviceStateForAudioDeviceAttributes(ada); +        if (deviceState != null) { +            if (!deviceState.hasHeadTracker()) { +                deviceState.setHasHeadTracker(true); +                mDeviceBroker.persistAudioDeviceSettings(); +                logDeviceState(deviceState, "setHasHeadTracker");              } +            return deviceState.isHeadTrackerEnabled();          }          Log.e(TAG, "setHasHeadTracker: device not found for:" + ada);          return false; @@ -1168,20 +1180,9 @@ public class SpatializerHelper {              Log.v(TAG, "no headtracking support, isHeadTrackerEnabled always false for " + ada);              return false;          } -        final int deviceType = ada.getType(); -        final boolean wireless = isWireless(deviceType); - -        for (SADeviceState deviceState : mSADevices) { -            if (deviceType == deviceState.mDeviceType -                    && (wireless && ada.getAddress().equals(deviceState.mDeviceAddress)) -                    || !wireless) { -                if (!deviceState.mHasHeadTracker) { -                    return false; -                } -                return deviceState.mHeadTrackerEnabled; -            } -        } -        return false; +        final AdiDeviceState deviceState = findDeviceStateForAudioDeviceAttributes(ada); +        return deviceState != null +                && deviceState.hasHeadTracker() && deviceState.isHeadTrackerEnabled();      }      synchronized boolean isHeadTrackerAvailable() { @@ -1513,117 +1514,6 @@ public class SpatializerHelper {          pw.println("\tsupports binaural:" + mBinauralSupported + " / transaural:"                  + mTransauralSupported);          pw.println("\tmSpatOutput:" + mSpatOutput); -        pw.println("\tdevices:"); -        for (SADeviceState device : mSADevices) { -            pw.println("\t\t" + device); -        } -    } - -    /*package*/ static final class SADeviceState { -        final @AudioDeviceInfo.AudioDeviceType int mDeviceType; -        final @NonNull String mDeviceAddress; -        boolean mEnabled = true;               // by default, SA is enabled on any device -        boolean mHasHeadTracker = false; -        boolean mHeadTrackerEnabled = true;    // by default, if head tracker is present, use it -        static final String SETTING_FIELD_SEPARATOR = ","; -        static final String SETTING_DEVICE_SEPARATOR_CHAR = "|"; -        static final String SETTING_DEVICE_SEPARATOR = "\\|"; - -        SADeviceState(@AudioDeviceInfo.AudioDeviceType int deviceType, @NonNull String address) { -            mDeviceType = deviceType; -            mDeviceAddress = Objects.requireNonNull(address); -        } - -        @Override -        public boolean equals(Object obj) { -            if (this == obj) { -                return true; -            } -            if (obj == null) { -                return false; -            } -            // type check and cast -            if (getClass() != obj.getClass()) { -                return false; -            } -            final SADeviceState sads = (SADeviceState) obj; -            return mDeviceType == sads.mDeviceType -                    && mDeviceAddress.equals(sads.mDeviceAddress) -                    && mEnabled == sads.mEnabled -                    && mHasHeadTracker == sads.mHasHeadTracker -                    && mHeadTrackerEnabled == sads.mHeadTrackerEnabled; -        } - -        @Override -        public int hashCode() { -            return Objects.hash(mDeviceType, mDeviceAddress, mEnabled, mHasHeadTracker, -                    mHeadTrackerEnabled); -        } - -        @Override -        public String toString() { -            return "type:" + mDeviceType + " addr:" + mDeviceAddress + " enabled:" + mEnabled -                    + " HT:" + mHasHeadTracker + " HTenabled:" + mHeadTrackerEnabled; -        } - -        String toPersistableString() { -            return (new StringBuilder().append(mDeviceType) -                    .append(SETTING_FIELD_SEPARATOR).append(mDeviceAddress) -                    .append(SETTING_FIELD_SEPARATOR).append(mEnabled ? "1" : "0") -                    .append(SETTING_FIELD_SEPARATOR).append(mHasHeadTracker ? "1" : "0") -                    .append(SETTING_FIELD_SEPARATOR).append(mHeadTrackerEnabled ? "1" : "0") -                    .toString()); -        } - -        static @Nullable SADeviceState fromPersistedString(@Nullable String persistedString) { -            if (persistedString == null) { -                return null; -            } -            if (persistedString.isEmpty()) { -                return null; -            } -            String[] fields = TextUtils.split(persistedString, SETTING_FIELD_SEPARATOR); -            if (fields.length != 5) { -                // expecting all fields, fewer may mean corruption, ignore those settings -                return null; -            } -            try { -                final int deviceType = Integer.parseInt(fields[0]); -                final SADeviceState deviceState = new SADeviceState(deviceType, fields[1]); -                deviceState.mEnabled = Integer.parseInt(fields[2]) == 1; -                deviceState.mHasHeadTracker = Integer.parseInt(fields[3]) == 1; -                deviceState.mHeadTrackerEnabled = Integer.parseInt(fields[4]) == 1; -                return deviceState; -            } catch (NumberFormatException e) { -                Log.e(TAG, "unable to parse setting for SADeviceState: " + persistedString, e); -                return null; -            } -        } -    } - -    /*package*/ synchronized String getSADeviceSettings() { -        // expected max size of each String for each SADeviceState is 25 (accounting for separator) -        final StringBuilder settingsBuilder = new StringBuilder(mSADevices.size() * 25); -        for (int i = 0; i < mSADevices.size(); i++) { -            settingsBuilder.append(mSADevices.get(i).toPersistableString()); -            if (i != mSADevices.size() - 1) { -                settingsBuilder.append(SADeviceState.SETTING_DEVICE_SEPARATOR_CHAR); -            } -        } -        return settingsBuilder.toString(); -    } - -    /*package*/ synchronized void setSADeviceSettings(@NonNull String persistedSettings) { -        String[] devSettings = TextUtils.split(Objects.requireNonNull(persistedSettings), -                SADeviceState.SETTING_DEVICE_SEPARATOR); -        // small list, not worth overhead of Arrays.stream(devSettings) -        for (String setting : devSettings) { -            SADeviceState devState = SADeviceState.fromPersistedString(setting); -            if (devState != null) { -                mSADevices.add(devState); -                logDeviceState(devState, "setSADeviceSettings"); -            } -        }      }      private static String spatStateString(int state) { @@ -1645,24 +1535,6 @@ public class SpatializerHelper {          }      } -    private static boolean isWireless(@AudioDeviceInfo.AudioDeviceType int deviceType) { -        for (int type : WIRELESS_TYPES) { -            if (type == deviceType) { -                return true; -            } -        } -        return false; -    } - -    private static boolean isWirelessSpeaker(@AudioDeviceInfo.AudioDeviceType int deviceType) { -        for (int type : WIRELESS_SPEAKER_TYPES) { -            if (type == deviceType) { -                return true; -            } -        } -        return false; -    } -      private int getHeadSensorHandleUpdateTracker() {          int headHandle = -1;          UUID routingDeviceUuid = mAudioService.getDeviceSensorUuid(ROUTING_DEVICES[0]); @@ -1707,11 +1579,4 @@ public class SpatializerHelper {          AudioService.sSpatialLogger.loglog(msg, AudioEventLogger.Event.ALOGE, TAG);          return msg;      } - -    //------------------------------------------------ -    // for testing purposes only - -    /*package*/ void clearSADevices() { -        mSADevices.clear(); -    }  } diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index 0d9b75481ea9..4767969bd3ed 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -958,7 +958,7 @@ public class BiometricService extends SystemService {          public boolean isCoexFaceNonBypassHapticsDisabled(Context context) {              return Settings.Secure.getInt(context.getContentResolver(), -                    CoexCoordinator.FACE_HAPTIC_DISABLE, 1) != 0; +                    CoexCoordinator.FACE_HAPTIC_DISABLE, 0) != 0;          }          public Supplier<Long> getRequestGenerator() { diff --git a/services/core/java/com/android/server/biometrics/OWNERS b/services/core/java/com/android/server/biometrics/OWNERS index f05f40353e30..cd281e06f40d 100644 --- a/services/core/java/com/android/server/biometrics/OWNERS +++ b/services/core/java/com/android/server/biometrics/OWNERS @@ -1,9 +1,14 @@  set noparent -kchyn@google.com -jaggies@google.com -curtislb@google.com +graciecheng@google.com  ilyamaty@google.com -joshmccloskey@google.com +jaggies@google.com  jbolinger@google.com -graciecheng@google.com +jeffpu@google.com +joshmccloskey@google.com + +firewall@google.com +jasonsfchang@google.com +lbill@google.com +mingjuwu@google.com + diff --git a/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java b/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java index 5aa9b79c074c..c8a90e7a564b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java +++ b/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java @@ -92,7 +92,7 @@ public class CoexCoordinator {          void sendHapticFeedback();      } -    private static CoexCoordinator sInstance; +    private static final CoexCoordinator sInstance = new CoexCoordinator();      @VisibleForTesting      public static class SuccessfulAuth { @@ -147,14 +147,9 @@ public class CoexCoordinator {          }      } -    /** -     * @return a singleton instance. -     */ +    /** The singleton instance. */      @NonNull      public static CoexCoordinator getInstance() { -        if (sInstance == null) { -            sInstance = new CoexCoordinator(); -        }          return sInstance;      } @@ -339,18 +334,8 @@ public class CoexCoordinator {                          auth.mCallback.sendHapticFeedback();                          auth.mCallback.sendAuthenticationResult(true /* addAuthTokenIfStrong */);                          auth.mCallback.handleLifecycleAfterAuth(); -                    } else if (isFaceScanning()) { -                        // UDFPS rejected but face is still scanning -                        Slog.d(TAG, "UDFPS rejected in multi-sensor auth, face: " + face); -                        callback.handleLifecycleAfterAuth(); - -                        // TODO(b/193089985): Enforce/ensure that face auth finishes (whether -                        //  accept/reject) within X amount of time. Otherwise users will be stuck -                        //  waiting with their finger down for a long time.                      } else { -                        // Face not scanning, and was not found in the queue. Most likely, face -                        // auth was too long ago. -                        Slog.d(TAG, "UDFPS rejected in multi-sensor auth, face not scanning"); +                        Slog.d(TAG, "UDFPS rejected in multi-sensor auth");                          callback.sendHapticFeedback();                          callback.handleLifecycleAfterAuth();                      } diff --git a/services/core/java/com/android/server/biometrics/sensors/UserAwareBiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/UserAwareBiometricScheduler.java index a0999771a1be..ae75b7dcc101 100644 --- a/services/core/java/com/android/server/biometrics/sensors/UserAwareBiometricScheduler.java +++ b/services/core/java/com/android/server/biometrics/sensors/UserAwareBiometricScheduler.java @@ -67,6 +67,14 @@ public class UserAwareBiometricScheduler extends BiometricScheduler {          public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) {              mHandler.post(() -> {                  Slog.d(getTag(), "[Client finished] " + clientMonitor + ", success: " + success); + +                // Set mStopUserClient to null when StopUserClient fails. Otherwise it's possible +                // for that the queue will wait indefinitely until the field is cleared. +                if (clientMonitor instanceof StopUserClient<?> && !success) { +                    Slog.w(getTag(), +                            "StopUserClient failed(), is the HAL stuck? Clearing mStopUserClient"); +                    mStopUserClient = null; +                }                  if (mCurrentOperation != null && mCurrentOperation.isFor(mOwner)) {                      mCurrentOperation = null;                  } else { @@ -166,4 +174,9 @@ public class UserAwareBiometricScheduler extends BiometricScheduler {          mStopUserClient.onUserStopped();          mStopUserClient = null;      } + +    @VisibleForTesting +    @Nullable public StopUserClient<?> getStopUserClient() { +        return mStopUserClient; +    }  } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java index 9ae6750dbcbf..d0c58fd0545f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java @@ -99,7 +99,10 @@ class FaceAuthenticationClient extends AuthenticationClient<AidlSession>          super(context, lazyDaemon, token, listener, targetUserId, operationId, restricted,                  owner, cookie, requireConfirmation, sensorId, logger, biometricContext,                  isStrongBiometric, null /* taskStackListener */, lockoutCache, -                allowBackgroundAuthentication, true /* shouldVibrate */, +                allowBackgroundAuthentication, +                context.getResources().getBoolean( +                        com.android.internal.R.bool.system_server_plays_face_haptics) +                /* shouldVibrate */,                  isKeyguardBypassEnabled);          setRequestId(requestId);          mUsageStats = usageStats; diff --git a/services/core/java/com/android/server/input/GestureMonitorSpyWindow.java b/services/core/java/com/android/server/input/GestureMonitorSpyWindow.java index e222c644da9e..d238dae634ad 100644 --- a/services/core/java/com/android/server/input/GestureMonitorSpyWindow.java +++ b/services/core/java/com/android/server/input/GestureMonitorSpyWindow.java @@ -27,8 +27,6 @@ import android.view.InputWindowHandle;  import android.view.SurfaceControl;  import android.view.WindowManager; -import com.android.server.policy.WindowManagerPolicy; -  /**   * An internal implementation of an {@link InputMonitor} that uses a spy window.   * @@ -69,9 +67,7 @@ class GestureMonitorSpyWindow {          final SurfaceControl.Transaction t = new SurfaceControl.Transaction();          t.setInputWindowInfo(mInputSurface, mWindowHandle); -        // Gesture monitor should be above handwriting event surface, hence setting it to -        // WindowManagerPolicy.INPUT_DISPLAY_OVERLAY_LAYER + 1 -        t.setLayer(mInputSurface, WindowManagerPolicy.INPUT_DISPLAY_OVERLAY_LAYER + 1); +        t.setLayer(mInputSurface, Integer.MAX_VALUE);          t.setPosition(mInputSurface, 0, 0);          t.setCrop(mInputSurface, null /* crop to parent surface */);          t.show(mInputSurface); diff --git a/services/core/java/com/android/server/inputmethod/HandwritingEventReceiverSurface.java b/services/core/java/com/android/server/inputmethod/HandwritingEventReceiverSurface.java index 5438faa8793e..8180e66166d9 100644 --- a/services/core/java/com/android/server/inputmethod/HandwritingEventReceiverSurface.java +++ b/services/core/java/com/android/server/inputmethod/HandwritingEventReceiverSurface.java @@ -27,8 +27,6 @@ import android.view.InputWindowHandle;  import android.view.SurfaceControl;  import android.view.WindowManager; -import com.android.server.policy.WindowManagerPolicy; -  final class HandwritingEventReceiverSurface {      public static final String TAG = HandwritingEventReceiverSurface.class.getSimpleName(); @@ -38,8 +36,7 @@ final class HandwritingEventReceiverSurface {      // is above gesture monitors, then edge-back and swipe-up gestures won't work when this surface      // is intercepting.      // TODO(b/217538817): Specify the ordering in WM by usage. -    private static final int HANDWRITING_SURFACE_LAYER = -            WindowManagerPolicy.INPUT_DISPLAY_OVERLAY_LAYER; +    private static final int HANDWRITING_SURFACE_LAYER = Integer.MAX_VALUE - 1;      private final InputWindowHandle mWindowHandle;      private final InputChannel mClientChannel; diff --git a/services/core/java/com/android/server/location/gnss/GnssConfiguration.java b/services/core/java/com/android/server/location/gnss/GnssConfiguration.java index 12f8776a8e18..1435016fc55a 100644 --- a/services/core/java/com/android/server/location/gnss/GnssConfiguration.java +++ b/services/core/java/com/android/server/location/gnss/GnssConfiguration.java @@ -21,6 +21,7 @@ import android.os.PersistableBundle;  import android.os.SystemProperties;  import android.telephony.CarrierConfigManager;  import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager;  import android.text.TextUtils;  import android.util.Log; @@ -73,6 +74,8 @@ public class GnssConfiguration {      static final String CONFIG_NFW_PROXY_APPS = "NFW_PROXY_APPS";      private static final String CONFIG_ENABLE_PSDS_PERIODIC_DOWNLOAD =              "ENABLE_PSDS_PERIODIC_DOWNLOAD"; +    private static final String CONFIG_ENABLE_ACTIVE_SIM_EMERGENCY_SUPL = +            "ENABLE_ACTIVE_SIM_EMERGENCY_SUPL";      static final String CONFIG_LONGTERM_PSDS_SERVER_1 = "LONGTERM_PSDS_SERVER_1";      static final String CONFIG_LONGTERM_PSDS_SERVER_2 = "LONGTERM_PSDS_SERVER_2";      static final String CONFIG_LONGTERM_PSDS_SERVER_3 = "LONGTERM_PSDS_SERVER_3"; @@ -207,6 +210,14 @@ public class GnssConfiguration {      }      /** +     * Returns true if during an emergency call, the GnssConfiguration of the activeSubId will be +     * injected for the emergency SUPL flow; Returns false otherwise. Default false if not set. +     */ +    boolean isActiveSimEmergencySuplEnabled() { +        return getBooleanConfig(CONFIG_ENABLE_ACTIVE_SIM_EMERGENCY_SUPL, false); +    } + +    /**       * Returns true if a long-term PSDS server is configured.       */      boolean isLongTermPsdsServerConfigured() { @@ -232,16 +243,31 @@ public class GnssConfiguration {      /**       * Loads the GNSS properties from carrier config file followed by the properties from -     * gps debug config file. +     * gps debug config file, and injects the GNSS properties into the HAL.       */      void reloadGpsProperties() { -        if (DEBUG) Log.d(TAG, "Reset GPS properties, previous size = " + mProperties.size()); -        loadPropertiesFromCarrierConfig(); +        reloadGpsProperties(/* inEmergency= */ false, /* activeSubId= */ -1); +    } -        String lpp_prof = SystemProperties.get(LPP_PROFILE); -        if (!TextUtils.isEmpty(lpp_prof)) { -            // override default value of this if lpp_prof is not empty -            mProperties.setProperty(CONFIG_LPP_PROFILE, lpp_prof); +    /** +     * Loads the GNSS properties from carrier config file followed by the properties from +     * gps debug config file, and injects the GNSS properties into the HAL. +     */ +    void reloadGpsProperties(boolean inEmergency, int activeSubId) { +        if (DEBUG) { +            Log.d(TAG, +                    "Reset GPS properties, previous size = " + mProperties.size() + ", inEmergency:" +                            + inEmergency + ", activeSubId=" + activeSubId); +        } +        loadPropertiesFromCarrierConfig(inEmergency, activeSubId); + +        if (isSimAbsent(mContext)) { +            // Use the default SIM's LPP profile when SIM is absent. +            String lpp_prof = SystemProperties.get(LPP_PROFILE); +            if (!TextUtils.isEmpty(lpp_prof)) { +                // override default value of this if lpp_prof is not empty +                mProperties.setProperty(CONFIG_LPP_PROFILE, lpp_prof); +            }          }          /* @@ -322,16 +348,19 @@ public class GnssConfiguration {      /**       * Loads GNSS properties from carrier config file.       */ -    void loadPropertiesFromCarrierConfig() { +    void loadPropertiesFromCarrierConfig(boolean inEmergency, int activeSubId) {          CarrierConfigManager configManager = (CarrierConfigManager)                  mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);          if (configManager == null) {              return;          } -        int ddSubId = SubscriptionManager.getDefaultDataSubscriptionId(); -        PersistableBundle configs = SubscriptionManager.isValidSubscriptionId(ddSubId) -                ? configManager.getConfigForSubId(ddSubId) : configManager.getConfig(); +        int subId = SubscriptionManager.getDefaultDataSubscriptionId(); +        if (inEmergency && activeSubId >= 0) { +            subId = activeSubId; +        } +        PersistableBundle configs = SubscriptionManager.isValidSubscriptionId(subId) +                ? configManager.getConfigForSubId(subId) : configManager.getConfig();          if (configs == null) {              if (DEBUG) Log.d(TAG, "SIM not ready, use default carrier config.");              configs = CarrierConfigManager.getDefaultConfig(); @@ -422,6 +451,12 @@ public class GnssConfiguration {          return gnssConfiguartionIfaceVersion.mMajor < 2;      } +    private static boolean isSimAbsent(Context context) { +        TelephonyManager phone = (TelephonyManager) context.getSystemService( +                Context.TELEPHONY_SERVICE); +        return phone.getSimState() == TelephonyManager.SIM_STATE_ABSENT; +    } +      private static native HalInterfaceVersion native_get_gnss_configuration_version();      private static native boolean native_set_supl_version(int version); diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java index f5c2bbc8d5a2..a6a3db11b729 100644 --- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java @@ -126,6 +126,7 @@ import java.util.List;  import java.util.Objects;  import java.util.Set;  import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit;  /**   * A GNSS implementation of LocationProvider used by LocationManager. @@ -359,8 +360,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements                  }              }              if (isKeepLppProfile) { -                // load current properties for the carrier -                mGnssConfiguration.loadPropertiesFromCarrierConfig(); +                // load current properties for the carrier of ddSubId +                mGnssConfiguration.loadPropertiesFromCarrierConfig(/* inEmergency= */ false, +                        /* activeSubId= */ -1);                  String lpp_profile = mGnssConfiguration.getLppProfile();                  // set the persist property LPP_PROFILE for the value                  if (lpp_profile != null) { @@ -431,13 +433,38 @@ public class GnssLocationProvider extends AbstractLocationProvider implements          // this approach is just fine because events are posted to our handler anyway          mGnssConfiguration = mGnssNative.getConfiguration();          // Create a GPS net-initiated handler (also needed by handleInitialize) +        GpsNetInitiatedHandler.EmergencyCallCallback emergencyCallCallback = +                new GpsNetInitiatedHandler.EmergencyCallCallback() { + +                    @Override +                    public void onEmergencyCallStart(int subId) { +                        if (!mGnssConfiguration.isActiveSimEmergencySuplEnabled()) { +                            return; +                        } +                        mHandler.post(() -> mGnssConfiguration.reloadGpsProperties( +                                mNIHandler.getInEmergency(), subId)); +                    } + +                    @Override +                    public void onEmergencyCallEnd() { +                        if (!mGnssConfiguration.isActiveSimEmergencySuplEnabled()) { +                            return; +                        } +                        mHandler.postDelayed(() -> mGnssConfiguration.reloadGpsProperties( +                                        /* inEmergency= */ false, +                                        SubscriptionManager.getDefaultDataSubscriptionId()), +                                TimeUnit.SECONDS.toMillis(mGnssConfiguration.getEsExtensionSec())); +                    } +                };          mNIHandler = new GpsNetInitiatedHandler(context,                  mNetInitiatedListener, +                emergencyCallCallback,                  mSuplEsEnabled);          // Trigger PSDS data download when the network comes up after booting.          mPendingDownloadPsdsTypes.add(GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX);          mNetworkConnectivityHandler = new GnssNetworkConnectivityHandler(context, -                GnssLocationProvider.this::onNetworkAvailable, mHandler.getLooper(), mNIHandler); +                GnssLocationProvider.this::onNetworkAvailable, +                mHandler.getLooper(), mNIHandler);          mNtpTimeHelper = new NtpTimeHelper(mContext, mHandler.getLooper(), this);          mGnssSatelliteBlocklistHelper = @@ -1694,9 +1721,12 @@ public class GnssLocationProvider extends AbstractLocationProvider implements          int type = AGPS_SETID_TYPE_NONE;          String setId = null; -        int ddSubId = SubscriptionManager.getDefaultDataSubscriptionId(); -        if (SubscriptionManager.isValidSubscriptionId(ddSubId)) { -            phone = phone.createForSubscriptionId(ddSubId); +        int subId = SubscriptionManager.getDefaultDataSubscriptionId(); +        if (mNIHandler.getInEmergency() && mNetworkConnectivityHandler.getActiveSubId() >= 0) { +            subId = mNetworkConnectivityHandler.getActiveSubId(); +        } +        if (SubscriptionManager.isValidSubscriptionId(subId)) { +            phone = phone.createForSubscriptionId(subId);          }          if ((flags & AGPS_REQUEST_SETID_IMSI) == AGPS_REQUEST_SETID_IMSI) {              setId = phone.getSubscriberId(); diff --git a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java index aba7572ee1a0..6f890cda5964 100644 --- a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java +++ b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java @@ -190,7 +190,7 @@ class GnssNetworkConnectivityHandler {          mContext = context;          mGnssNetworkListener = gnssNetworkListener; -    SubscriptionManager subManager = mContext.getSystemService(SubscriptionManager.class); +        SubscriptionManager subManager = mContext.getSystemService(SubscriptionManager.class);          if (subManager != null) {              subManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);          } @@ -311,6 +311,13 @@ class GnssNetworkConnectivityHandler {      }      /** +     * Returns the active Sub ID for emergency SUPL connection. +     */ +    int getActiveSubId() { +        return mActiveSubId; +    } + +    /**       * Called from native code to update AGPS connection status, or to request or release a SUPL       * connection.       * diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java index d0651ed176cf..d4d3a39c724e 100644 --- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java +++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java @@ -348,18 +348,14 @@ class BluetoothRouteProvider {      private void addActiveRoute(BluetoothRouteInfo btRoute) {          if (btRoute == null) { -            if (DEBUG) { -                Log.d(TAG, " btRoute is null"); -            } +            Slog.w(TAG, "addActiveRoute: btRoute is null");              return;          }          if (DEBUG) {              Log.d(TAG, "Adding active route: " + btRoute.route);          }          if (mActiveRoutes.contains(btRoute)) { -            if (DEBUG) { -                Log.d(TAG, " btRoute is already added."); -            } +            Slog.w(TAG, "addActiveRoute: btRoute is already added.");              return;          }          setRouteConnectionState(btRoute, STATE_CONNECTED); @@ -392,6 +388,12 @@ class BluetoothRouteProvider {      private void addActiveDevices(BluetoothDevice device) {          // Let the given device be the first active device          BluetoothRouteInfo activeBtRoute = mBluetoothRoutes.get(device.getAddress()); +        // This could happen if ACTION_ACTIVE_DEVICE_CHANGED is sent before +        // ACTION_CONNECTION_STATE_CHANGED is sent. +        if (activeBtRoute == null) { +            activeBtRoute = createBluetoothRoute(device); +            mBluetoothRoutes.put(device.getAddress(), activeBtRoute); +        }          addActiveRoute(activeBtRoute);          // A bluetooth route with the same route ID should be added. diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index 22330c3bbcb0..496e8c6a1a34 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -907,7 +907,7 @@ abstract public class ManagedServices {                  || isPackageOrComponentAllowed(component.getPackageName(), userId))) {              return false;          } -        return isValidService(component, userId); +        return componentHasBindPermission(component, userId);      }      private boolean componentHasBindPermission(ComponentName component, int userId) { @@ -1252,12 +1252,11 @@ abstract public class ManagedServices {                      if (TextUtils.equals(getPackageName(approvedPackageOrComponent), packageName)) {                          final ComponentName component = ComponentName.unflattenFromString(                                  approvedPackageOrComponent); -                        if (component != null && !isValidService(component, userId)) { +                        if (component != null && !componentHasBindPermission(component, userId)) {                              approved.removeAt(j);                              if (DEBUG) {                                  Slog.v(TAG, "Removing " + approvedPackageOrComponent -                                        + " from approved list; no bind permission or " -                                        + "service interface filter found " +                                        + " from approved list; no bind permission found "                                          + mConfig.bindPermission);                              }                          } @@ -1276,11 +1275,6 @@ abstract public class ManagedServices {          }      } -    protected boolean isValidService(ComponentName component, int userId) { -        return componentHasBindPermission(component, userId) && queryPackageForServices( -                component.getPackageName(), userId).contains(component); -    } -      protected boolean isValidEntry(String packageOrComponent, int userId) {          return hasMatchingServices(packageOrComponent, userId);      } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 2562d88f8996..63b88faa2c50 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -7102,7 +7102,6 @@ public class NotificationManagerService extends SystemService {          @GuardedBy("mNotificationLock")          void snoozeLocked(NotificationRecord r) { -            final List<NotificationRecord> recordsToSnooze = new ArrayList<>();              if (r.getSbn().isGroup()) {                  final List<NotificationRecord> groupNotifications =                          findCurrentAndSnoozedGroupNotificationsLocked( @@ -7111,8 +7110,8 @@ public class NotificationManagerService extends SystemService {                  if (r.getNotification().isGroupSummary()) {                      // snooze all children                      for (int i = 0; i < groupNotifications.size(); i++) { -                        if (!mKey.equals(groupNotifications.get(i).getKey())) { -                            recordsToSnooze.add(groupNotifications.get(i)); +                        if (mKey != groupNotifications.get(i).getKey()) { +                            snoozeNotificationLocked(groupNotifications.get(i));                          }                      }                  } else { @@ -7122,8 +7121,8 @@ public class NotificationManagerService extends SystemService {                          if (groupNotifications.size() == 2) {                              // snooze summary and the one child                              for (int i = 0; i < groupNotifications.size(); i++) { -                                if (!mKey.equals(groupNotifications.get(i).getKey())) { -                                    recordsToSnooze.add(groupNotifications.get(i)); +                                if (mKey != groupNotifications.get(i).getKey()) { +                                    snoozeNotificationLocked(groupNotifications.get(i));                                  }                              }                          } @@ -7131,15 +7130,7 @@ public class NotificationManagerService extends SystemService {                  }              }              // snooze the notification -            recordsToSnooze.add(r); - -            if (mSnoozeHelper.canSnooze(recordsToSnooze.size())) { -                for (int i = 0; i < recordsToSnooze.size(); i++) { -                    snoozeNotificationLocked(recordsToSnooze.get(i)); -                } -            } else { -                Log.w(TAG, "Cannot snooze " + r.getKey() + ": too many snoozed notifications"); -            } +            snoozeNotificationLocked(r);          } diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java index f76ae51c5bcb..da984656ffea 100644 --- a/services/core/java/com/android/server/notification/SnoozeHelper.java +++ b/services/core/java/com/android/server/notification/SnoozeHelper.java @@ -164,7 +164,6 @@ public class SnoozeHelper {          return numNotifications;      } -      @NonNull      protected Long getSnoozeTimeForUnpostedNotification(int userId, String pkg, String key) {          Long time = null; diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 89178139ffec..7ca09ab5154f 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -156,10 +156,6 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {      int FINISH_LAYOUT_REDO_ANIM = 0x0008;      /** Layer for the screen off animation */      int COLOR_FADE_LAYER = 0x40000001; -    /** Layer for Input overlays for capturing inputs for gesture detection, etc. */ -    int INPUT_DISPLAY_OVERLAY_LAYER = 0x7f000000; -    /** Layer for Screen Decoration: The top most visible layer just below input overlay layers */ -    int SCREEN_DECOR_DISPLAY_OVERLAY_LAYER = INPUT_DISPLAY_OVERLAY_LAYER - 1;      /**       * Register shortcuts for window manager to dispatch. diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java index 92329cf4a8ff..6aa06e8ee068 100644 --- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java +++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java @@ -41,7 +41,6 @@ import static org.xmlpull.v1.XmlPullParser.START_TAG;  import android.annotation.NonNull;  import android.annotation.Nullable; -import android.annotation.RequiresPermission;  import android.app.ActivityManager;  import android.app.ActivityManagerInternal;  import android.app.AppGlobals; @@ -63,7 +62,6 @@ import android.os.Handler;  import android.os.IBinder;  import android.os.Looper;  import android.os.Message; -import android.os.Process;  import android.os.RemoteException;  import android.os.SystemClock;  import android.os.UserHandle; @@ -1306,46 +1304,6 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub implements          return false;      } -    /** -     * Check if the targetPkg can be granted permission to access uri by -     * the callingUid using the given modeFlags. See {@link #checkGrantUriPermissionUnlocked}. -     * -     * @param callingUid The uid of the grantor app that has permissions to the uri. -     * @param targetPkg The package name of the granted app that needs permissions to the uri. -     * @param uri The uri for which permissions should be granted. -     * @param modeFlags The modes to grant. See {@link Intent#FLAG_GRANT_READ_URI_PERMISSION}, etc. -     * @param userId The userId in which the uri is to be resolved. -     * @return uid of the target or -1 if permission grant not required. Returns -1 if the caller -     *  does not hold INTERACT_ACROSS_USERS_FULL -     * @throws SecurityException if the grant is not allowed. -     */ -    @Override -    @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) -    public int checkGrantUriPermission_ignoreNonSystem(int callingUid, String targetPkg, Uri uri, -            int modeFlags, int userId) { -        if (!isCallerIsSystemOrPrivileged()) { -            return Process.INVALID_UID; -        } -        final long origId = Binder.clearCallingIdentity(); -        try { -            return checkGrantUriPermissionUnlocked(callingUid, targetPkg, uri, modeFlags, -                userId); -        } finally { -            Binder.restoreCallingIdentity(origId); -        } -    } - -    private boolean isCallerIsSystemOrPrivileged() { -        final int uid = Binder.getCallingUid(); -        if (uid == Process.SYSTEM_UID || uid == Process.ROOT_UID) { -            return true; -        } -        return ActivityManager.checkComponentPermission( -            android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, -            uid, /* owningUid = */-1, /* exported = */ true) -            == PackageManager.PERMISSION_GRANTED; -    } -      @Override      public ArrayList<UriPermission> providePersistentUriGrants() {          final ArrayList<UriPermission> result = new ArrayList<>(); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 173a1a660ac8..f11261ae6a43 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -874,7 +874,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A      boolean mEnteringAnimation;      boolean mOverrideTaskTransition; -    boolean mDismissKeyguardIfInsecure; +    boolean mDismissKeyguard;      boolean mAppStopped;      // A hint to override the window specified rotation animation, or -1 to use the window specified @@ -1999,7 +1999,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A              }              mOverrideTaskTransition = options.getOverrideTaskTransition(); -            mDismissKeyguardIfInsecure = options.getDismissKeyguardIfInsecure(); +            mDismissKeyguard = options.getDismissKeyguard();          }          ColorDisplayService.ColorDisplayServiceInternal cds = LocalServices.getService( diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 375be381ad5a..ecca9611b302 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -65,8 +65,8 @@ import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS;  import static android.provider.Settings.System.FONT_SCALE;  import static android.view.Display.DEFAULT_DISPLAY;  import static android.view.Display.INVALID_DISPLAY; -import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT;  import static android.view.WindowManager.TRANSIT_WAKE; +import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT;  import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;  import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS; @@ -401,6 +401,26 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {      /** The time at which the previous process was last visible. */      private long mPreviousProcessVisibleTime; +    /** It is set from keyguard-going-away to set-keyguard-shown. */ +    static final int DEMOTE_TOP_REASON_DURING_UNLOCKING = 1; +    /** It is set if legacy recents animation is running. */ +    static final int DEMOTE_TOP_REASON_ANIMATING_RECENTS = 1 << 1; + +    @Retention(RetentionPolicy.SOURCE) +    @IntDef({ +            DEMOTE_TOP_REASON_DURING_UNLOCKING, +            DEMOTE_TOP_REASON_ANIMATING_RECENTS, +    }) +    @interface DemoteTopReason {} + +    /** +     * If non-zero, getTopProcessState() will +     * return {@link ActivityManager#PROCESS_STATE_IMPORTANT_FOREGROUND} to avoid top app from +     * preempting CPU while another process is running an important animation. +     */ +    @DemoteTopReason +    volatile int mDemoteTopAppReasons; +      /** List of intents that were used to start the most recent tasks. */      private RecentTasks mRecentTasks;      /** State of external calls telling us if the device is awake or asleep. */ @@ -2840,12 +2860,24 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {                          keyguardShowing);                  mH.sendMessage(msg);              } +            // Always reset the state regardless of keyguard-showing change, because that means the +            // unlock is either completed or canceled. +            if ((mDemoteTopAppReasons & DEMOTE_TOP_REASON_DURING_UNLOCKING) != 0) { +                mDemoteTopAppReasons &= ~DEMOTE_TOP_REASON_DURING_UNLOCKING; +                // The scheduling group of top process was demoted by unlocking, so recompute +                // to restore its real top priority if possible. +                if (mTopApp != null) { +                    mTopApp.scheduleUpdateOomAdj(); +                } +            }              try { +                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "setLockScreenShown");                  mRootWindowContainer.forAllDisplays(displayContent -> {                      mKeyguardController.setKeyguardShown(displayContent.getDisplayId(),                              keyguardShowing, aodShowing);                  });              } finally { +                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);                  Binder.restoreCallingIdentity(ident);              }          } @@ -2872,6 +2904,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {          // animation of system UI. Even if AOD is not enabled, it should be no harm.          final WindowProcessController proc;          synchronized (mGlobalLockWithoutBoost) { +            mDemoteTopAppReasons &= ~DEMOTE_TOP_REASON_DURING_UNLOCKING;              final WindowState notificationShade = mRootWindowContainer.getDefaultDisplay()                      .getDisplayPolicy().getNotificationShade();              proc = notificationShade != null @@ -3410,8 +3443,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {          try {              synchronized (mGlobalLock) {                  // Keyguard asked us to clear the home task snapshot before going away, so do that. -                if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT) != 0) { +                if ((flags & KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT) != 0) {                      mActivityClientController.invalidateHomeTaskSnapshot(null /* token */); +                } else if (mKeyguardShown) { +                    // Only set if it is not unlocking to launcher which may also animate. +                    mDemoteTopAppReasons |= DEMOTE_TOP_REASON_DURING_UNLOCKING;                  }                  mRootWindowContainer.forAllDisplays(displayContent -> { @@ -3979,6 +4015,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {              mTaskOrganizerController.dump(pw, "  ");              mVisibleActivityProcessTracker.dump(pw, "  ");              mActiveUids.dump(pw, "  "); +            if (mDemoteTopAppReasons != 0) { +                pw.println("  mDemoteTopAppReasons=" + mDemoteTopAppReasons); +            }          }          if (!printedAnything) { @@ -5606,12 +5645,17 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {          @HotPath(caller = HotPath.OOM_ADJUSTMENT)          @Override          public int getTopProcessState() { +            final int topState = mTopProcessState; +            if (mDemoteTopAppReasons != 0 && topState == ActivityManager.PROCESS_STATE_TOP) { +                // There may be a more important UI/animation than the top app. +                return ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND; +            }              if (mRetainPowerModeAndTopProcessState) {                  // There is a launching app while device may be sleeping, force the top state so                  // the launching process can have top-app scheduling group.                  return ActivityManager.PROCESS_STATE_TOP;              } -            return mTopProcessState; +            return topState;          }          @HotPath(caller = HotPath.PROCESS_CHANGE) diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java index 0bfc48b4b54c..e80c2607a0ad 100644 --- a/services/core/java/com/android/server/wm/AppTaskImpl.java +++ b/services/core/java/com/android/server/wm/AppTaskImpl.java @@ -98,7 +98,7 @@ class AppTaskImpl extends IAppTask.Stub {                      throw new IllegalArgumentException("Unable to find task ID " + mTaskId);                  }                  return mService.getRecentTasks().createRecentTaskInfo(task, -                        false /* stripExtras */, true /* getTasksAllowed */); +                        false /* stripExtras */);              } finally {                  Binder.restoreCallingIdentity(origId);              } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index a03dce364209..79aef00750a1 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3233,10 +3233,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp      }      public void setRotationAnimation(ScreenRotationAnimation screenRotationAnimation) { -        if (mScreenRotationAnimation != null) { -            mScreenRotationAnimation.kill(); -        } +        final ScreenRotationAnimation prev = mScreenRotationAnimation;          mScreenRotationAnimation = screenRotationAnimation; +        if (prev != null) { +            prev.kill(); +        }          // Hide the windows which are not significant in rotation animation. So that the windows          // don't need to block the unfreeze time. @@ -5395,7 +5396,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp      SurfaceControl[] findRoundedCornerOverlays() {          List<SurfaceControl> roundedCornerOverlays = new ArrayList<>();          for (WindowToken token : mTokenMap.values()) { -            if (token.mRoundedCornerOverlay) { +            if (token.mRoundedCornerOverlay && token.isVisible()) {                  roundedCornerOverlays.add(token.mSurfaceControl);              }          } diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java index b7ddbd070460..33cdd2e98113 100644 --- a/services/core/java/com/android/server/wm/InputManagerCallback.java +++ b/services/core/java/com/android/server/wm/InputManagerCallback.java @@ -265,7 +265,7 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal                      .setContainerLayer()                      .setName(name)                      .setCallsite("createSurfaceForGestureMonitor") -                    .setParent(dc.getOverlayLayer()) +                    .setParent(dc.getSurfaceControl())                      .build();          }      } diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index f36dbfa2316e..a4c05eecdb07 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -41,6 +41,7 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;  import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;  import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS;  import static com.android.server.wm.KeyguardControllerProto.AOD_SHOWING; +import static com.android.server.wm.KeyguardControllerProto.KEYGUARD_GOING_AWAY;  import static com.android.server.wm.KeyguardControllerProto.KEYGUARD_PER_DISPLAY;  import static com.android.server.wm.KeyguardControllerProto.KEYGUARD_SHOWING; @@ -589,13 +590,12 @@ class KeyguardController {                      mTopTurnScreenOnActivity = top;                  } -                final boolean isKeyguardSecure = controller.mWindowManager.isKeyguardSecure( -                        controller.mService.getCurrentUserId()); -                if (top.mDismissKeyguardIfInsecure && mKeyguardShowing && !isKeyguardSecure) { +                if (top.mDismissKeyguard && mKeyguardShowing) {                      mKeyguardGoingAway = true;                  } else if (top.canShowWhenLocked()) {                      mTopOccludesActivity = top;                  } +                top.mDismissKeyguard = false;                  // Only the top activity may control occluded, as we can't occlude the Keyguard                  // if the top app doesn't want to occlude it. @@ -673,6 +673,7 @@ class KeyguardController {              proto.write(KeyguardPerDisplayProto.KEYGUARD_SHOWING, mKeyguardShowing);              proto.write(KeyguardPerDisplayProto.AOD_SHOWING, mAodShowing);              proto.write(KeyguardPerDisplayProto.KEYGUARD_OCCLUDED, mOccluded); +            proto.write(KeyguardPerDisplayProto.KEYGUARD_GOING_AWAY, mKeyguardGoingAway);              proto.end(token);          }      } @@ -693,6 +694,7 @@ class KeyguardController {          final long token = proto.start(fieldId);          proto.write(AOD_SHOWING, default_state.mAodShowing);          proto.write(KEYGUARD_SHOWING, default_state.mKeyguardShowing); +        proto.write(KEYGUARD_GOING_AWAY, default_state.mKeyguardGoingAway);          writeDisplayStatesToProto(proto, KEYGUARD_PER_DISPLAY);          proto.end(token);      } diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 1fc061b2ca78..4860762a5f7f 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -976,7 +976,7 @@ class RecentTasks {                  continue;              } -            res.add(createRecentTaskInfo(task, true /* stripExtras */, getTasksAllowed)); +            res.add(createRecentTaskInfo(task, true /* stripExtras */));          }          return res;      } @@ -1895,8 +1895,7 @@ class RecentTasks {      /**       * Creates a new RecentTaskInfo from a Task.       */ -    ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras, -            boolean getTasksAllowed) { +    ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras) {          final ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo();          // If the recent Task is detached, we consider it will be re-attached to the default          // TaskDisplayArea because we currently only support recent overview in the default TDA. @@ -1908,9 +1907,6 @@ class RecentTasks {          rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID;          rti.persistentId = rti.taskId;          rti.lastSnapshotData.set(tr.mLastTaskSnapshotData); -        if (!getTasksAllowed) { -            Task.trimIneffectiveInfo(tr, rti); -        }          // Fill in organized child task info for the task created by organizer.          if (tr.mCreatedByOrganizer) { diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java index eca201dc2bda..f840171b29b0 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimation.java +++ b/services/core/java/com/android/server/wm/RecentsAnimation.java @@ -203,9 +203,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, OnRootTaskOrderChan          final LaunchingState launchingState =                  mTaskSupervisor.getActivityMetricsLogger().notifyActivityLaunching(mTargetIntent); -        if (mCaller != null) { -            mCaller.setRunningRecentsAnimation(true); -        } +        setProcessAnimating(true);          mService.deferWindowLayout();          try { @@ -409,15 +407,33 @@ class RecentsAnimation implements RecentsAnimationCallbacks, OnRootTaskOrderChan                      if (mWindowManager.mRoot.isLayoutNeeded()) {                          mWindowManager.mRoot.performSurfacePlacement();                      } -                    if (mCaller != null) { -                        mCaller.setRunningRecentsAnimation(false); -                    } +                    setProcessAnimating(false);                      Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);                  }              });          }      } +    /** Gives the owner of recents animation higher priority. */ +    private void setProcessAnimating(boolean animating) { +        if (mCaller == null) return; +        // Apply the top-app scheduling group to who runs the animation. +        mCaller.setRunningRecentsAnimation(animating); +        int demoteReasons = mService.mDemoteTopAppReasons; +        if (animating) { +            demoteReasons |= ActivityTaskManagerService.DEMOTE_TOP_REASON_ANIMATING_RECENTS; +        } else { +            demoteReasons &= ~ActivityTaskManagerService.DEMOTE_TOP_REASON_ANIMATING_RECENTS; +        } +        mService.mDemoteTopAppReasons = demoteReasons; +        // Make the demotion of the real top app take effect. No need to restore top app state for +        // finishing recents because addToStopping -> scheduleIdle -> activityIdleInternal -> +        // trimApplications will have a full update. +        if (animating && mService.mTopApp != null) { +            mService.mTopApp.scheduleUpdateOomAdj(); +        } +    } +      @Override      public void onAnimationFinished(@RecentsAnimationController.ReorderMode int reorderMode,              boolean sendUserLeaveHint) { diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java index 6cc36abaa6cd..1ec191ed7c05 100644 --- a/services/core/java/com/android/server/wm/RunningTasks.java +++ b/services/core/java/com/android/server/wm/RunningTasks.java @@ -142,10 +142,6 @@ class RunningTasks {          task.fillTaskInfo(rti, !mKeepIntentExtra);          // Fill in some deprecated values          rti.id = rti.taskId; - -        if (!mAllowed) { -            Task.trimIneffectiveInfo(task, rti); -        }          return rti;      }  } diff --git a/services/core/java/com/android/server/wm/SafeActivityOptions.java b/services/core/java/com/android/server/wm/SafeActivityOptions.java index 2d4aef682d62..fd05f19f54c5 100644 --- a/services/core/java/com/android/server/wm/SafeActivityOptions.java +++ b/services/core/java/com/android/server/wm/SafeActivityOptions.java @@ -16,6 +16,7 @@  package com.android.server.wm; +import static android.Manifest.permission.CONTROL_KEYGUARD;  import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;  import static android.Manifest.permission.START_TASKS_FROM_RECENTS;  import static android.Manifest.permission.STATUS_BAR_SERVICE; @@ -297,6 +298,20 @@ public class SafeActivityOptions {              }          } +        // Check if the caller is allowed to dismiss keyguard. +        final boolean dismissKeyguard = options.getDismissKeyguard(); +        if (aInfo != null && dismissKeyguard) { +            final int controlKeyguardPerm = ActivityTaskManagerService.checkPermission( +                    CONTROL_KEYGUARD, callingPid, callingUid); +            if (controlKeyguardPerm != PERMISSION_GRANTED) { +                final String msg = "Permission Denial: starting " + getIntentString(intent) +                        + " from " + callerApp + " (pid=" + callingPid +                        + ", uid=" + callingUid + ") with dismissKeyguard=true"; +                Slog.w(TAG, msg); +                throw new SecurityException(msg); +            } +        } +          // Check permission for remote animations          final RemoteAnimationAdapter adapter = options.getRemoteAnimationAdapter();          if (adapter != null && supervisor.mService.checkPermission( diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 2ef19321d958..f31a3cc9bcb3 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -40,9 +40,11 @@ import android.graphics.Matrix;  import android.graphics.Point;  import android.graphics.Rect;  import android.hardware.HardwareBuffer; +import android.os.IBinder;  import android.os.Trace;  import android.util.Slog;  import android.util.proto.ProtoOutputStream; +import android.view.DisplayAddress;  import android.view.DisplayInfo;  import android.view.Surface;  import android.view.Surface.OutOfResourcesException; @@ -102,6 +104,7 @@ class ScreenRotationAnimation {      private SurfaceControl mEnterBlackFrameLayer;      /** This layer contains the actual screenshot that is to be faded out. */      private SurfaceControl mScreenshotLayer; +    private SurfaceControl[] mRoundedCornerOverlay;      /**       * Only used for screen rotation and not custom animations. Layered behind all other layers       * to avoid showing any "empty" spots @@ -151,6 +154,11 @@ class ScreenRotationAnimation {          final boolean flipped = delta == Surface.ROTATION_90 || delta == Surface.ROTATION_270;          mOriginalWidth = flipped ? height : width;          mOriginalHeight = flipped ? width : height; +        final int logicalWidth = displayInfo.logicalWidth; +        final int logicalHeight = displayInfo.logicalHeight; +        final boolean isSizeChanged = +                logicalWidth > mOriginalWidth == logicalHeight > mOriginalHeight +                && (logicalWidth != mOriginalWidth || logicalHeight != mOriginalHeight);          mSurfaceRotationAnimationController = new SurfaceRotationAnimationController();          // Check whether the current screen contains any secure content. @@ -159,18 +167,43 @@ class ScreenRotationAnimation {          final SurfaceControl.Transaction t = mService.mTransactionFactory.get();          try { -            SurfaceControl.LayerCaptureArgs args = -                    new SurfaceControl.LayerCaptureArgs.Builder(displayContent.getSurfaceControl()) -                            .setCaptureSecureLayers(true) -                            .setAllowProtected(true) -                            .setSourceCrop(new Rect(0, 0, width, height)) -                            // Exclude rounded corner overlay from screenshot buffer. Rounded -                            // corner overlay windows are un-rotated during rotation animation -                            // for a seamless transition. -                            .setExcludeLayers(displayContent.findRoundedCornerOverlays()) -                            .build(); -            SurfaceControl.ScreenshotHardwareBuffer screenshotBuffer = -                    SurfaceControl.captureLayers(args); +            final SurfaceControl.ScreenshotHardwareBuffer screenshotBuffer; +            if (isSizeChanged) { +                final DisplayAddress address = displayInfo.address; +                if (!(address instanceof DisplayAddress.Physical)) { +                    Slog.e(TAG, "Display does not have a physical address: " + displayId); +                    return; +                } +                final DisplayAddress.Physical physicalAddress = +                        (DisplayAddress.Physical) address; +                final IBinder displayToken = SurfaceControl.getPhysicalDisplayToken( +                        physicalAddress.getPhysicalDisplayId()); +                if (displayToken == null) { +                    Slog.e(TAG, "Display token is null."); +                    return; +                } +                // Temporarily not skip screenshot for the rounded corner overlays and screenshot +                // the whole display to include the rounded corner overlays. +                setSkipScreenshotForRoundedCornerOverlays(false, t); +                mRoundedCornerOverlay = displayContent.findRoundedCornerOverlays(); +                final SurfaceControl.DisplayCaptureArgs captureArgs = +                        new SurfaceControl.DisplayCaptureArgs.Builder(displayToken) +                                .setSourceCrop(new Rect(0, 0, width, height)) +                                .setAllowProtected(true) +                                .setCaptureSecureLayers(true) +                                .build(); +                screenshotBuffer = SurfaceControl.captureDisplay(captureArgs); +            } else { +                SurfaceControl.LayerCaptureArgs captureArgs = +                        new SurfaceControl.LayerCaptureArgs.Builder( +                                displayContent.getSurfaceControl()) +                                .setCaptureSecureLayers(true) +                                .setAllowProtected(true) +                                .setSourceCrop(new Rect(0, 0, width, height)) +                                .build(); +                screenshotBuffer = SurfaceControl.captureLayers(captureArgs); +            } +              if (screenshotBuffer == null) {                  Slog.w(TAG, "Unable to take screenshot of display " + displayId);                  return; @@ -232,6 +265,14 @@ class ScreenRotationAnimation {              t.show(mScreenshotLayer);              t.show(mBackColorSurface); +            if (mRoundedCornerOverlay != null) { +                for (SurfaceControl sc : mRoundedCornerOverlay) { +                    if (sc.isValid()) { +                        t.hide(sc); +                    } +                } +            } +          } catch (OutOfResourcesException e) {              Slog.w(TAG, "Unable to allocate freeze surface", e);          } @@ -240,10 +281,7 @@ class ScreenRotationAnimation {          // the new logical display size. Currently pending transaction and RWC#mDisplayTransaction          // are merged to global transaction, so it can be synced with display change when calling          // DisplayManagerInternal#performTraversal(transaction). -        final int logicalWidth = displayInfo.logicalWidth; -        final int logicalHeight = displayInfo.logicalHeight; -        if (logicalWidth > mOriginalWidth == logicalHeight > mOriginalHeight -                && (logicalWidth != mOriginalWidth || logicalHeight != mOriginalHeight)) { +        if (mScreenshotLayer != null && isSizeChanged) {              displayContent.getPendingTransaction().setGeometry(mScreenshotLayer,                      new Rect(0, 0, mOriginalWidth, mOriginalHeight),                      new Rect(0, 0, logicalWidth, logicalHeight), Surface.ROTATION_0); @@ -264,6 +302,21 @@ class ScreenRotationAnimation {          t.apply();      } +    void setSkipScreenshotForRoundedCornerOverlays( +            boolean skipScreenshot, SurfaceControl.Transaction t) { +        mDisplayContent.forAllWindows(w -> { +            if (!w.mToken.mRoundedCornerOverlay || !w.isVisible() || !w.mWinAnimator.hasSurface()) { +                return; +            } +            t.setSkipScreenshot(w.mWinAnimator.mSurfaceController.mSurfaceControl, skipScreenshot); +        }, false); +        if (!skipScreenshot) { +            // Use sync apply to apply the change immediately, so that the next +            // SC.captureDisplay can capture the screen decor layers. +            t.apply(true /* sync */); +        } +    } +      public void dumpDebug(ProtoOutputStream proto, long fieldId) {          final long token = proto.start(fieldId);          proto.write(STARTED, mStarted); @@ -472,6 +525,19 @@ class ScreenRotationAnimation {                  }                  mBackColorSurface = null;              } + +            if (mRoundedCornerOverlay != null) { +                if (mDisplayContent.getRotationAnimation() == null +                        || mDisplayContent.getRotationAnimation() == this) { +                    setSkipScreenshotForRoundedCornerOverlays(true, t); +                    for (SurfaceControl sc : mRoundedCornerOverlay) { +                        if (sc.isValid()) { +                            t.show(sc); +                        } +                    } +                } +                mRoundedCornerOverlay = null; +            }              t.apply();          } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 5bb453bb4f9c..888dc3aee86a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3476,54 +3476,6 @@ class Task extends TaskFragment {          info.mTopActivityLocusId = topRecord != null ? topRecord.getLocusId() : null;      } -    /** -     * Removes the activity info if the activity belongs to a different uid, which is -     * different from the app that hosts the task. -     */ -    static void trimIneffectiveInfo(Task task, TaskInfo info) { -        final ActivityRecord baseActivity = task.getActivity(r -> !r.finishing, -                false /* traverseTopToBottom */); -        final int baseActivityUid = -                baseActivity != null ? baseActivity.getUid() : task.effectiveUid; - -        if (info.topActivityInfo != null -                && task.effectiveUid != info.topActivityInfo.applicationInfo.uid) { -            // Making a copy to prevent eliminating the info in the original ActivityRecord. -            info.topActivityInfo = new ActivityInfo(info.topActivityInfo); -            info.topActivityInfo.applicationInfo = -                    new ApplicationInfo(info.topActivityInfo.applicationInfo); - -            // Strip the sensitive info. -            info.topActivity = new ComponentName("", ""); -            info.topActivityInfo.packageName = ""; -            info.topActivityInfo.taskAffinity = ""; -            info.topActivityInfo.processName = ""; -            info.topActivityInfo.name = ""; -            info.topActivityInfo.parentActivityName = ""; -            info.topActivityInfo.targetActivity = ""; -            info.topActivityInfo.splitName = ""; -            info.topActivityInfo.applicationInfo.className = ""; -            info.topActivityInfo.applicationInfo.credentialProtectedDataDir = ""; -            info.topActivityInfo.applicationInfo.dataDir = ""; -            info.topActivityInfo.applicationInfo.deviceProtectedDataDir = ""; -            info.topActivityInfo.applicationInfo.manageSpaceActivityName = ""; -            info.topActivityInfo.applicationInfo.nativeLibraryDir = ""; -            info.topActivityInfo.applicationInfo.nativeLibraryRootDir = ""; -            info.topActivityInfo.applicationInfo.processName = ""; -            info.topActivityInfo.applicationInfo.publicSourceDir = ""; -            info.topActivityInfo.applicationInfo.scanPublicSourceDir = ""; -            info.topActivityInfo.applicationInfo.scanSourceDir = ""; -            info.topActivityInfo.applicationInfo.sourceDir = ""; -            info.topActivityInfo.applicationInfo.taskAffinity = ""; -            info.topActivityInfo.applicationInfo.name = ""; -            info.topActivityInfo.applicationInfo.packageName = ""; -        } - -        if (task.effectiveUid != baseActivityUid) { -            info.baseActivity = new ComponentName("", ""); -        } -    } -      @Nullable PictureInPictureParams getPictureInPictureParams() {          return getPictureInPictureParams(getTopMostTask());      } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 52af39ee64b3..902218621cd0 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8215,7 +8215,7 @@ public class WindowManagerService extends IWindowManager.Stub                          .setContainerLayer()                          .setName("IME Handwriting Surface")                          .setCallsite("getHandwritingSurfaceForDisplay") -                        .setParent(dc.getOverlayLayer()) +                        .setParent(dc.getSurfaceControl())                          .build();              }          } diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 22280cdb71fb..6a9df63b0110 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -1136,6 +1136,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio          mAtm.mH.sendMessage(m);      } +    /** Refreshes oom adjustment and process state of this process. */ +    void scheduleUpdateOomAdj() { +        mAtm.mH.sendMessage(PooledLambda.obtainMessage(WindowProcessListener::updateProcessInfo, +                mListener, false /* updateServiceConnectionActivities */, +                false /* activityChange */, true /* updateOomAdj */)); +    } +      /** Makes the process have top state before oom-adj is computed from a posted message. */      void addToPendingTop() {          mAtm.mAmInternal.addPendingTopUid(mUid, mPid, mThread); diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index 18f60b1a9a20..d2e56faa0914 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -368,7 +368,7 @@ class WindowToken extends WindowContainer<WindowState> {              super.assignRelativeLayer(t,                      mDisplayContent.getDefaultTaskDisplayArea().getSplitScreenDividerAnchor(), 1);          } else if (mRoundedCornerOverlay) { -            super.assignLayer(t, WindowManagerPolicy.SCREEN_DECOR_DISPLAY_OVERLAY_LAYER); +            super.assignLayer(t, WindowManagerPolicy.COLOR_FADE_LAYER + 1);          } else {              super.assignLayer(t, layer);          } @@ -378,7 +378,7 @@ class WindowToken extends WindowContainer<WindowState> {      SurfaceControl.Builder makeSurface() {          final SurfaceControl.Builder builder = super.makeSurface();          if (mRoundedCornerOverlay) { -            builder.setParent(getDisplayContent().getOverlayLayer()); +            builder.setParent(null);          }          return builder;      } diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java index dad9fe8648b2..b6b987c01a4a 100644 --- a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java +++ b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java @@ -29,13 +29,14 @@ import android.bluetooth.BluetoothDevice;  import android.content.Context;  import android.content.Intent;  import android.media.AudioDeviceAttributes; +import android.media.AudioDeviceInfo;  import android.media.AudioManager;  import android.media.AudioSystem;  import android.media.BluetoothProfileConnectionInfo;  import android.util.Log; -import androidx.test.InstrumentationRegistry;  import androidx.test.filters.MediumTest; +import androidx.test.platform.app.InstrumentationRegistry;  import androidx.test.runner.AndroidJUnit4;  import org.junit.After; @@ -54,7 +55,6 @@ 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; @@ -67,13 +67,13 @@ public class AudioDeviceBrokerTest {      @Before      public void setUp() throws Exception { -        mContext = InstrumentationRegistry.getTargetContext(); +        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();          mMockAudioService = mock(AudioService.class);          mSpyAudioSystem = spy(new NoOpAudioSystemAdapter());          mSpyDevInventory = spy(new AudioDeviceInventory(mSpyAudioSystem));          mSpySystemServer = spy(new NoOpSystemServerAdapter()); -        mAudioDeviceBroker = new AudioDeviceBroker(mContext, mMockAudioService, mSpyDevInventory, +        mAudioDeviceBroker = new AudioDeviceBroker(context, mMockAudioService, mSpyDevInventory,                  mSpySystemServer);          mSpyDevInventory.setDeviceBroker(mAudioDeviceBroker); @@ -197,6 +197,37 @@ public class AudioDeviceBrokerTest {                  any(Intent.class));      } +    /** +     * Test that constructing an AdiDeviceState instance requires a non-null address for a +     * wireless type, but can take null for a non-wireless type; +     * @throws Exception +     */ +    @Test +    public void testAdiDeviceStateNullAddressCtor() throws Exception { +        try { +            new AdiDeviceState(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, +                    AudioManager.DEVICE_OUT_SPEAKER, null); +            new AdiDeviceState(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP, +                    AudioManager.DEVICE_OUT_BLUETOOTH_A2DP, null); +            Assert.fail(); +        } catch (NullPointerException e) { } +    } + +    @Test +    public void testAdiDeviceStateStringSerialization() throws Exception { +        Log.i(TAG, "starting testAdiDeviceStateStringSerialization"); +        final AdiDeviceState devState = new AdiDeviceState( +                AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, AudioManager.DEVICE_OUT_SPEAKER, "bla"); +        devState.setHasHeadTracker(false); +        devState.setHeadTrackerEnabled(false); +        devState.setSAEnabled(true); +        final String persistString = devState.toPersistableString(); +        final AdiDeviceState result = AdiDeviceState.fromPersistedString(persistString); +        Log.i(TAG, "original:" + devState); +        Log.i(TAG, "result  :" + result); +        Assert.assertEquals(devState, result); +    } +      private void doTestConnectionDisconnectionReconnection(int delayAfterDisconnection,              boolean mockMediaPlayback, boolean guaranteeSingleConnection) throws Exception {          when(mMockAudioService.getDeviceForStream(AudioManager.STREAM_MUSIC)) diff --git a/services/tests/servicestests/src/com/android/server/audio/SpatializerHelperTest.java b/services/tests/servicestests/src/com/android/server/audio/SpatializerHelperTest.java index b17c3a18d89e..bf38fd1669ad 100644 --- a/services/tests/servicestests/src/com/android/server/audio/SpatializerHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/audio/SpatializerHelperTest.java @@ -15,18 +15,19 @@   */  package com.android.server.audio; -import com.android.server.audio.SpatializerHelper.SADeviceState; - +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean;  import static org.mockito.Mockito.doNothing;  import static org.mockito.Mockito.mock;  import static org.mockito.Mockito.spy;  import android.media.AudioDeviceAttributes; -import android.media.AudioDeviceInfo; +import android.media.AudioFormat;  import android.media.AudioSystem;  import android.util.Log;  import androidx.test.filters.MediumTest; +import androidx.test.platform.app.InstrumentationRegistry;  import androidx.test.runner.AndroidJUnit4;  import org.junit.Assert; @@ -49,41 +50,23 @@ public class SpatializerHelperTest {      @Mock private AudioService mMockAudioService;      @Spy private AudioSystemAdapter mSpyAudioSystem; +    @Spy private AudioDeviceBroker mSpyDeviceBroker;      @Before      public void setUp() throws Exception {          mMockAudioService = mock(AudioService.class); -        mSpyAudioSystem = spy(new NoOpAudioSystemAdapter()); -        mSpatHelper = new SpatializerHelper(mMockAudioService, mSpyAudioSystem); -    } - -    @Test -    public void testSADeviceStateNullAddressCtor() throws Exception { -        try { -            SADeviceState devState = new SADeviceState( -                    AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, null); -            Assert.fail(); -        } catch (NullPointerException e) { } -    } - -    @Test -    public void testSADeviceStateStringSerialization() throws Exception { -        Log.i(TAG, "starting testSADeviceStateStringSerialization"); -        final SADeviceState devState = new SADeviceState( -                AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, "bla"); -        devState.mHasHeadTracker = false; -        devState.mHeadTrackerEnabled = false; -        devState.mEnabled = true; -        final String persistString = devState.toPersistableString(); -        final SADeviceState result = SADeviceState.fromPersistedString(persistString); -        Log.i(TAG, "original:" + devState); -        Log.i(TAG, "result  :" + result); -        Assert.assertEquals(devState, result); +        mSpyAudioSystem = spy(new NoOpAudioSystemAdapter()); +        mSpyDeviceBroker = spy( +                new AudioDeviceBroker( +                        InstrumentationRegistry.getInstrumentation().getTargetContext(), +                        mMockAudioService)); +        mSpatHelper = new SpatializerHelper(mMockAudioService, mSpyAudioSystem, +                mSpyDeviceBroker);      }      @Test -    public void testSADeviceSettings() throws Exception { +    public void testAdiDeviceStateSettings() throws Exception {          Log.i(TAG, "starting testSADeviceSettings");          final AudioDeviceAttributes dev1 =                  new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_SPEAKER, ""); @@ -92,7 +75,7 @@ public class SpatializerHelperTest {          final AudioDeviceAttributes dev3 =                  new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, "R2:D2:bloop"); -        doNothing().when(mMockAudioService).persistSpatialAudioDeviceSettings(); +        doNothing().when(mSpyDeviceBroker).persistAudioDeviceSettings();          // test with single device          mSpatHelper.addCompatibleAudioDevice(dev1); @@ -126,11 +109,11 @@ public class SpatializerHelperTest {       * the original one.       */      private void checkAddSettings() throws Exception { -        String settings = mSpatHelper.getSADeviceSettings(); +        String settings = mSpyDeviceBroker.getDeviceSettings();          Log.i(TAG, "device settings: " + settings); -        mSpatHelper.clearSADevices(); -        mSpatHelper.setSADeviceSettings(settings); -        String settingsRestored = mSpatHelper.getSADeviceSettings(); +        mSpyDeviceBroker.clearDeviceInventory(); +        mSpyDeviceBroker.setDeviceSettings(settings); +        String settingsRestored = mSpyDeviceBroker.getDeviceSettings();          Log.i(TAG, "device settingsRestored: " + settingsRestored);          Assert.assertEquals(settings, settingsRestored);      } diff --git a/services/tests/servicestests/src/com/android/server/backup/restore/FullRestoreEngineTest.java b/services/tests/servicestests/src/com/android/server/backup/restore/FullRestoreEngineTest.java deleted file mode 100644 index 049c745fc128..000000000000 --- a/services/tests/servicestests/src/com/android/server/backup/restore/FullRestoreEngineTest.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.backup.restore; - -import static com.google.common.truth.Truth.assertWithMessage; - -import android.app.backup.BackupAgent; -import android.platform.test.annotations.Presubmit; -import android.system.OsConstants; - -import androidx.test.runner.AndroidJUnit4; - -import com.android.server.backup.FileMetadata; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -@Presubmit -@RunWith(AndroidJUnit4.class) -public class FullRestoreEngineTest { -    private static final String DEFAULT_PACKAGE_NAME = "package"; -    private static final String DEFAULT_DOMAIN_NAME = "domain"; -    private static final String NEW_PACKAGE_NAME = "new_package"; -    private static final String NEW_DOMAIN_NAME = "new_domain"; - -    private FullRestoreEngine mRestoreEngine; - -    @Before -    public void setUp() { -        mRestoreEngine = new FullRestoreEngine(); -    } - -    @Test -    public void shouldSkipReadOnlyDir_skipsAllReadonlyDirsAndTheirChildren() { -        // Create the file tree. -        TestFile[] testFiles = new TestFile[] { -                TestFile.dir("root"), -                TestFile.file("root/auth_token"), -                TestFile.dir("root/media"), -                TestFile.file("root/media/picture1.png"), -                TestFile.file("root/push_token.txt"), -                TestFile.dir("root/read-only-dir-1").markReadOnly().expectSkipped(), -                TestFile.dir("root/read-only-dir-1/writable-subdir").expectSkipped(), -                TestFile.file("root/read-only-dir-1/writable-subdir/writable-file").expectSkipped(), -                TestFile.dir("root/read-only-dir-1/writable-subdir/read-only-subdir-2") -                        .markReadOnly().expectSkipped(), -                TestFile.file("root/read-only-dir-1/writable-file").expectSkipped(), -                TestFile.file("root/random-stuff.txt"), -                TestFile.dir("root/database"), -                TestFile.file("root/database/users.db"), -                TestFile.dir("root/read-only-dir-2").markReadOnly().expectSkipped(), -                TestFile.file("root/read-only-dir-2/writable-file-1").expectSkipped(), -                TestFile.file("root/read-only-dir-2/writable-file-2").expectSkipped(), -        }; - -        assertCorrectItemsAreSkipped(testFiles); -    } - -    @Test -    public void shouldSkipReadOnlyDir_onlySkipsChildrenUnderTheSamePackage() { -        TestFile[] testFiles = new TestFile[]{ -                TestFile.dir("read-only-dir").markReadOnly().expectSkipped(), -                TestFile.file("read-only-dir/file").expectSkipped(), -                TestFile.file("read-only-dir/file-from-different-package") -                        .setPackage(NEW_PACKAGE_NAME), -        }; - -        assertCorrectItemsAreSkipped(testFiles); -    } - -    @Test -    public void shouldSkipReadOnlyDir_onlySkipsChildrenUnderTheSameDomain() { -        TestFile[] testFiles = new TestFile[]{ -                TestFile.dir("read-only-dir").markReadOnly().expectSkipped(), -                TestFile.file("read-only-dir/file").expectSkipped(), -                TestFile.file("read-only-dir/file-from-different-domain") -                        .setDomain(NEW_DOMAIN_NAME), -        }; - -        assertCorrectItemsAreSkipped(testFiles); -    } - -    private void assertCorrectItemsAreSkipped(TestFile[] testFiles) { -        // Verify all directories marked with .expectSkipped are skipped. -        for (TestFile testFile : testFiles) { -            boolean actualExcluded = mRestoreEngine.shouldSkipReadOnlyDir(testFile.mMetadata); -            boolean expectedExcluded = testFile.mShouldSkip; -            assertWithMessage(testFile.mMetadata.path).that(actualExcluded).isEqualTo( -                    expectedExcluded); -        } -    } - -    private static class TestFile { -        private final FileMetadata mMetadata; -        private boolean mShouldSkip; - -        static TestFile dir(String path) { -            return new TestFile(path, BackupAgent.TYPE_DIRECTORY); -        } - -        static TestFile file(String path) { -            return new TestFile(path, BackupAgent.TYPE_FILE); -        } - -        TestFile markReadOnly() { -            mMetadata.mode = 0; -            return this; -        } - -        TestFile expectSkipped() { -            mShouldSkip = true; -            return this; -        } - -        TestFile setPackage(String packageName) { -            mMetadata.packageName = packageName; -            return this; -        } - -        TestFile setDomain(String domain) { -            mMetadata.domain = domain; -            return this; -        } - -        private TestFile(String path, int type) { -            FileMetadata metadata = new FileMetadata(); -            metadata.path = path; -            metadata.type = type; -            metadata.packageName = DEFAULT_PACKAGE_NAME; -            metadata.domain = DEFAULT_DOMAIN_NAME; -            metadata.mode = OsConstants.S_IWUSR; // Mark as writable. -            mMetadata = metadata; -        } -    } -} diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java index f40b31a0bc0d..abf992b6c637 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java @@ -415,7 +415,7 @@ public class CoexCoordinatorTest {          // Auth was attempted          when(mUdfpsClient.getState())                  .thenReturn(AuthenticationClient.STATE_STARTED_PAUSED_ATTEMPTED); -        verify(mCallback, never()).sendHapticFeedback(); +        verify(mCallback).sendHapticFeedback();          verify(mCallback).handleLifecycleAfterAuth();          // Then face rejected. Note that scheduler leaves UDFPS in the CoexCoordinator since @@ -425,7 +425,7 @@ public class CoexCoordinatorTest {                  LockoutTracker.LOCKOUT_NONE, faceCallback);          verify(faceCallback).sendHapticFeedback();          verify(faceCallback).sendAuthenticationResult(eq(false) /* addAuthTokenIfStrong */); -        verify(mCallback, never()).sendHapticFeedback(); +        verify(mCallback).sendHapticFeedback();      }      @Test diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/UserAwareBiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/UserAwareBiometricSchedulerTest.java index 8391914a0bb6..0df3028805d2 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/UserAwareBiometricSchedulerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/UserAwareBiometricSchedulerTest.java @@ -80,6 +80,11 @@ public class UserAwareBiometricSchedulerTest {      @Mock      private BiometricContext mBiometricContext; +    private boolean mShouldFailStopUser = false; +    private final StopUserClientShouldFail mStopUserClientShouldFail = +            () -> { +                return mShouldFailStopUser; +            };      private final TestUserStartedCallback mUserStartedCallback = new TestUserStartedCallback();      private final TestUserStoppedCallback mUserStoppedCallback = new TestUserStoppedCallback();      private int mCurrentUserId = UserHandle.USER_NULL; @@ -88,6 +93,7 @@ public class UserAwareBiometricSchedulerTest {      @Before      public void setUp() { +        mShouldFailStopUser = false;          mHandler = new Handler(TestableLooper.get(this).getLooper());          mScheduler = new UserAwareBiometricScheduler(TAG,                  mHandler, @@ -101,7 +107,7 @@ public class UserAwareBiometricSchedulerTest {                      public StopUserClient<?> getStopUserClient(int userId) {                          return new TestStopUserClient(mContext, Object::new, mToken, userId,                                  TEST_SENSOR_ID, mBiometricLogger, mBiometricContext, -                                mUserStoppedCallback); +                                mUserStoppedCallback, mStopUserClientShouldFail);                      }                      @NonNull @@ -240,6 +246,36 @@ public class UserAwareBiometricSchedulerTest {          assertThat(mUserStoppedCallback.mNumInvocations).isEqualTo(1);      } +    @Test +    public void testStartUser_failsClearsStopUserClient() { +        // When a stop user client fails, check that mStopUserClient +        // is set to null to prevent the scheduler from getting stuck. +        BaseClientMonitor nextClient = mock(BaseClientMonitor.class); +        when(nextClient.getTargetUserId()).thenReturn(10); + +        mScheduler.scheduleClientMonitor(nextClient); + +        waitForIdle(); +        verify(nextClient).start(any()); + +        // finish first operation +        mScheduler.getInternalCallback().onClientFinished(nextClient, true /* success */); +        waitForIdle(); + +        // schedule second operation but swap out the current operation +        // before it runs so that it's not current when it's completion callback runs +        nextClient = mock(BaseClientMonitor.class); +        when(nextClient.getTargetUserId()).thenReturn(11); +        mUserStartedCallback.mAfterStart = () -> mScheduler.mCurrentOperation = null; +        mShouldFailStopUser = true; +        mScheduler.scheduleClientMonitor(nextClient); + +        waitForIdle(); +        assertThat(mUserStartedCallback.mStartedUsers).containsExactly(10, 11).inOrder(); +        assertThat(mUserStoppedCallback.mNumInvocations).isEqualTo(0); +        assertThat(mScheduler.getStopUserClient()).isEqualTo(null); +    } +      private void waitForIdle() {          TestableLooper.get(this).processAllMessages();      } @@ -268,13 +304,19 @@ public class UserAwareBiometricSchedulerTest {          }      } -    private static class TestStopUserClient extends StopUserClient<Object> { +    private interface StopUserClientShouldFail { +        boolean shouldFail(); +    } + +    private class TestStopUserClient extends StopUserClient<Object> { +        private StopUserClientShouldFail mShouldFailClient;          public TestStopUserClient(@NonNull Context context,                  @NonNull Supplier<Object> lazyDaemon, @Nullable IBinder token, int userId,                  int sensorId, @NonNull BiometricLogger logger,                  @NonNull BiometricContext biometricContext, -                @NonNull UserStoppedCallback callback) { +                @NonNull UserStoppedCallback callback, StopUserClientShouldFail shouldFail) {              super(context, lazyDaemon, token, userId, sensorId, logger, biometricContext, callback); +            mShouldFailClient = shouldFail;          }          @Override @@ -285,7 +327,14 @@ public class UserAwareBiometricSchedulerTest {          @Override          public void start(@NonNull ClientMonitorCallback callback) {              super.start(callback); -            onUserStopped(); +            if (mShouldFailClient.shouldFail()) { +                getCallback().onClientFinished(this, false /* success */); +                // When the above fails, it means that the HAL has died, in this case we +                // need to ensure the UserSwitchCallback correctly returns the NULL user handle. +                mCurrentUserId = UserHandle.USER_NULL; +            } else { +                onUserStopped(); +            }          }          @Override diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java index 6f7163d3fd56..27a9522f04c4 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java @@ -1013,80 +1013,6 @@ public class ManagedServicesTest extends UiServiceTestCase {      }      @Test -    public void testUpgradeAppNoIntentFilterNoRebind() throws Exception { -        Context context = spy(getContext()); -        doReturn(true).when(context).bindServiceAsUser(any(), any(), anyInt(), any()); - -        ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles, -                mIpm, APPROVAL_BY_COMPONENT); - -        List<String> packages = new ArrayList<>(); -        packages.add("package"); -        addExpectedServices(service, packages, 0); - -        final ComponentName unapprovedComponent = ComponentName.unflattenFromString("package/C1"); -        final ComponentName approvedComponent = ComponentName.unflattenFromString("package/C2"); - -        // Both components are approved initially -        mExpectedPrimaryComponentNames.clear(); -        mExpectedPrimaryPackages.clear(); -        mExpectedPrimaryComponentNames.put(0, "package/C1:package/C2"); -        mExpectedSecondaryComponentNames.clear(); -        mExpectedSecondaryPackages.clear(); - -        loadXml(service); - -        //Components keep bind permission -        when(mIpm.getServiceInfo(any(), anyLong(), anyInt())).thenAnswer( -                (Answer<ServiceInfo>) invocation -> { -                    ComponentName invocationCn = invocation.getArgument(0); -                    if (invocationCn != null) { -                        ServiceInfo serviceInfo = new ServiceInfo(); -                        serviceInfo.packageName = invocationCn.getPackageName(); -                        serviceInfo.name = invocationCn.getClassName(); -                        serviceInfo.permission = service.getConfig().bindPermission; -                        serviceInfo.metaData = null; -                        return serviceInfo; -                    } -                    return null; -                } -        ); - -        //Component package/C1 loses serviceInterface intent filter -        ManagedServices.Config config = service.getConfig(); -        when(mPm.queryIntentServicesAsUser(any(), anyInt(), anyInt())). -            thenAnswer(new Answer<List<ResolveInfo>>() { -                @Override -                public List<ResolveInfo> answer(InvocationOnMock invocationOnMock) -                    throws Throwable { -                    Object[] args = invocationOnMock.getArguments(); -                    Intent invocationIntent = (Intent) args[0]; -                    if (invocationIntent != null) { -                        if (invocationIntent.getAction().equals(config.serviceInterface) -                            && packages.contains(invocationIntent.getPackage())) { -                            List<ResolveInfo> dummyServices = new ArrayList<>(); -                            ResolveInfo resolveInfo = new ResolveInfo(); -                            ServiceInfo serviceInfo = new ServiceInfo(); -                            serviceInfo.packageName = invocationIntent.getPackage(); -                            serviceInfo.name = approvedComponent.getClassName(); -                            serviceInfo.permission = service.getConfig().bindPermission; -                            resolveInfo.serviceInfo = serviceInfo; -                            dummyServices.add(resolveInfo); -                            return dummyServices; -                        } -                    } -                    return new ArrayList<>(); -                } -            }); - -        // Trigger package update -        service.onPackagesChanged(false, new String[]{"package"}, new int[]{0}); - -        assertFalse(service.isComponentEnabledForCurrentProfiles(unapprovedComponent)); -        assertTrue(service.isComponentEnabledForCurrentProfiles(approvedComponent)); -    } - -    @Test      public void testSetPackageOrComponentEnabled() throws Exception {          for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {              ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 62adeefb8671..bb2159da8edc 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -3447,80 +3447,19 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {      }      @Test -    public void testSnoozeRunnable_tooManySnoozed_singleNotification() { -        final NotificationRecord notification = generateNotificationRecord( -                mTestNotificationChannel, 1, null, true); -        mService.addNotification(notification); - -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); -        when(mSnoozeHelper.canSnooze(1)).thenReturn(false); - -        NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = -                mService.new SnoozeNotificationRunnable( -                        notification.getKey(), 100, null); -        snoozeNotificationRunnable.run(); - -        verify(mSnoozeHelper, never()).snooze(any(NotificationRecord.class), anyLong()); -        assertThat(mService.getNotificationRecordCount()).isEqualTo(1); -    } - -    @Test -    public void testSnoozeRunnable_tooManySnoozed_singleGroupChildNotification() { -        final NotificationRecord notification = generateNotificationRecord( -                mTestNotificationChannel, 1, "group", true); -        final NotificationRecord notificationChild = generateNotificationRecord( -                mTestNotificationChannel, 1, "group", false); -        mService.addNotification(notification); -        mService.addNotification(notificationChild); - -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); -        when(mSnoozeHelper.canSnooze(2)).thenReturn(false); - -        NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = -                mService.new SnoozeNotificationRunnable( -                        notificationChild.getKey(), 100, null); -        snoozeNotificationRunnable.run(); - -        verify(mSnoozeHelper, never()).snooze(any(NotificationRecord.class), anyLong()); -        assertThat(mService.getNotificationRecordCount()).isEqualTo(2); -    } - -    @Test -    public void testSnoozeRunnable_tooManySnoozed_summaryNotification() { -        final NotificationRecord notification = generateNotificationRecord( -                mTestNotificationChannel, 1, "group", true); -        final NotificationRecord notificationChild = generateNotificationRecord( -                mTestNotificationChannel, 12, "group", false); -        final NotificationRecord notificationChild2 = generateNotificationRecord( -                mTestNotificationChannel, 13, "group", false); -        mService.addNotification(notification); -        mService.addNotification(notificationChild); -        mService.addNotification(notificationChild2); - -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); -        when(mSnoozeHelper.canSnooze(3)).thenReturn(false); - -        NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = -                mService.new SnoozeNotificationRunnable( -                        notification.getKey(), 100, null); -        snoozeNotificationRunnable.run(); - -        verify(mSnoozeHelper, never()).snooze(any(NotificationRecord.class), anyLong()); -        assertThat(mService.getNotificationRecordCount()).isEqualTo(3); -    } - -    @Test -    public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() { +    public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() throws Exception {          final NotificationRecord notification = generateNotificationRecord(                  mTestNotificationChannel, 1, null, true);          mService.addNotification(notification);          when(mSnoozeHelper.getNotification(any())).thenReturn(notification); -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true);          NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =                  mService.new SnoozeNotificationRunnable(                  notification.getKey(), 100, null);          snoozeNotificationRunnable.run(); +        NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = +                mService.new SnoozeNotificationRunnable( +                notification.getKey(), 100, null);          snoozeNotificationRunnable.run();          // snooze twice @@ -3528,17 +3467,19 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {      }      @Test -    public void testSnoozeRunnable_reSnoozeASnoozedNotificationWithGroupKey() { +    public void testSnoozeRunnable_reSnoozeASnoozedNotificationWithGroupKey() throws Exception {          final NotificationRecord notification = generateNotificationRecord(                  mTestNotificationChannel, 1, "group", true);          mService.addNotification(notification);          when(mSnoozeHelper.getNotification(any())).thenReturn(notification); -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true);          NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =                  mService.new SnoozeNotificationRunnable(                  notification.getKey(), 100, null);          snoozeNotificationRunnable.run(); +        NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = +                mService.new SnoozeNotificationRunnable( +                notification.getKey(), 100, null);          snoozeNotificationRunnable.run();          // snooze twice @@ -3556,7 +3497,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {          when(mSnoozeHelper.getNotification(any())).thenReturn(notification);          when(mSnoozeHelper.getNotifications(                  anyString(), anyString(), anyInt())).thenReturn(new ArrayList<>()); -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true);          NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =                  mService.new SnoozeNotificationRunnable( @@ -3566,8 +3506,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {                  .thenReturn(new ArrayList<>(Arrays.asList(notification, notification2)));          NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 =                  mService.new SnoozeNotificationRunnable( -                        notification2.getKey(), 100, null); -        snoozeNotificationRunnable2.run(); +                        notification.getKey(), 100, null); +        snoozeNotificationRunnable.run();          // snooze twice          verify(mSnoozeHelper, times(4)).snooze(any(NotificationRecord.class), anyLong()); @@ -3581,7 +3521,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {                  mTestNotificationChannel, 2, "group", false);          mService.addNotification(grouped);          mService.addNotification(nonGrouped); -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true);          NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =                  mService.new SnoozeNotificationRunnable( @@ -3611,7 +3550,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {          mService.addNotification(parent);          mService.addNotification(child);          mService.addNotification(child2); -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true);          NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =                  mService.new SnoozeNotificationRunnable( @@ -3633,7 +3571,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {          mService.addNotification(parent);          mService.addNotification(child);          mService.addNotification(child2); -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true);          NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =                  mService.new SnoozeNotificationRunnable( @@ -3659,7 +3596,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {                  mTestNotificationChannel, 2, "group", false);          mService.addNotification(parent);          mService.addNotification(child); -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true);          NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =                  mService.new SnoozeNotificationRunnable( @@ -3687,7 +3623,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {          final NotificationRecord child = generateNotificationRecord(                  mTestNotificationChannel, 2, "group", false);          mService.addNotification(child); -        when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true);          NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =                  mService.new SnoozeNotificationRunnable( diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 5f9bdc67daa5..feb1c6fa6b5c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -30,7 +30,6 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;  import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;  import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;  import static android.content.res.Configuration.ORIENTATION_PORTRAIT; -import static android.os.Process.NOBODY_UID;  import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;  import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -1221,36 +1220,21 @@ public class RecentTasksTest extends WindowTestsBase {      @Test      public void testCreateRecentTaskInfo_detachedTask() { -        final Task task = createTaskBuilder(".Task").build(); -        final ComponentName componentName = getUniqueComponentName(); -        new ActivityBuilder(mSupervisor.mService) -                .setTask(task) -                .setUid(NOBODY_UID) -                .setComponent(componentName) -                .build(); +        final Task task = createTaskBuilder(".Task").setCreateActivity(true).build();          final TaskDisplayArea tda = task.getDisplayArea();          assertTrue(task.isAttached());          assertTrue(task.supportsMultiWindow()); -        RecentTaskInfo info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, -                true /* getTasksAllowed */); +        RecentTaskInfo info = mRecentTasks.createRecentTaskInfo(task, true);          assertTrue(info.supportsMultiWindow);          assertTrue(info.supportsSplitScreenMultiWindow); -        info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, -                false /* getTasksAllowed */); - -        assertFalse(info.topActivity.equals(componentName)); -        assertFalse(info.topActivityInfo.packageName.equals(componentName.getPackageName())); -        assertFalse(info.baseActivity.equals(componentName)); -          // The task can be put in split screen even if it is not attached now.          task.removeImmediately(); -        info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, -                true /* getTasksAllowed */); +        info = mRecentTasks.createRecentTaskInfo(task, true);          assertTrue(info.supportsMultiWindow);          assertTrue(info.supportsSplitScreenMultiWindow); @@ -1260,8 +1244,7 @@ public class RecentTasksTest extends WindowTestsBase {          doReturn(false).when(tda).supportsNonResizableMultiWindow();          doReturn(false).when(task).isResizeable(); -        info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, -                true /* getTasksAllowed */); +        info = mRecentTasks.createRecentTaskInfo(task, true);          assertFalse(info.supportsMultiWindow);          assertFalse(info.supportsSplitScreenMultiWindow); @@ -1270,8 +1253,7 @@ public class RecentTasksTest extends WindowTestsBase {          // the device supports it.          doReturn(true).when(tda).supportsNonResizableMultiWindow(); -        info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */, -                true /* getTasksAllowed */); +        info = mRecentTasks.createRecentTaskInfo(task, true);          assertTrue(info.supportsMultiWindow);          assertTrue(info.supportsSplitScreenMultiWindow); 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 1b19a28a9790..28fb0154a3b8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java @@ -37,13 +37,13 @@ import static com.android.server.wm.WindowContainer.POSITION_TOP;  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.assertTrue;  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; @@ -91,9 +91,15 @@ public class RecentsAnimationTest extends WindowTestsBase {          TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea();          Task recentsStack = taskDisplayArea.createRootTask(WINDOWING_MODE_FULLSCREEN,                  ACTIVITY_TYPE_RECENTS, true /* onTop */); +        final WindowProcessController wpc = mSystemServicesTestRule.addProcess( +                mRecentsComponent.getPackageName(), mRecentsComponent.getPackageName(), +                // Use real pid/uid of the test so the corresponding process can be mapped by +                // Binder.getCallingPid/Uid. +                android.os.Process.myPid(), android.os.Process.myUid());          ActivityRecord recentActivity = new ActivityBuilder(mAtm)                  .setComponent(mRecentsComponent)                  .setTask(recentsStack) +                .setUseProcess(wpc)                  .build();          ActivityRecord topActivity = new ActivityBuilder(mAtm).setCreateTask(true).build();          topActivity.getRootTask().moveToFront("testRecentsActivityVisiblility"); @@ -106,11 +112,14 @@ public class RecentsAnimationTest extends WindowTestsBase {                  mRecentsComponent, true /* getRecentsAnimation */);          // The launch-behind state should make the recents activity visible.          assertTrue(recentActivity.mVisibleRequested); +        assertEquals(ActivityTaskManagerService.DEMOTE_TOP_REASON_ANIMATING_RECENTS, +                mAtm.mDemoteTopAppReasons);          // Simulate the animation is cancelled without changing the stack order.          recentsAnimation.onAnimationFinished(REORDER_KEEP_IN_PLACE, false /* sendUserLeaveHint */);          // The non-top recents activity should be invisible by the restored launch-behind state.          assertFalse(recentActivity.mVisibleRequested); +        assertEquals(0, mAtm.mDemoteTopAppReasons);      }      @Test @@ -138,11 +147,8 @@ public class RecentsAnimationTest extends WindowTestsBase {                  anyInt() /* startFlags */, any() /* profilerInfo */);          // Assume its process is alive because the caller should be the recents service. -        WindowProcessController wpc = new WindowProcessController(mAtm, aInfo.applicationInfo, -                aInfo.processName, aInfo.applicationInfo.uid, 0 /* userId */, -                mock(Object.class) /* owner */, mock(WindowProcessListener.class)); -        wpc.setThread(mock(IApplicationThread.class)); -        doReturn(wpc).when(mAtm).getProcessController(eq(wpc.mName), eq(wpc.mUid)); +        mSystemServicesTestRule.addProcess(aInfo.packageName, aInfo.processName, 12345 /* pid */, +                aInfo.applicationInfo.uid);          Intent recentsIntent = new Intent().setComponent(mRecentsComponent);          // Null animation indicates to preload. diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java index dc9a62554fdb..258625c751a3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java +++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java @@ -43,12 +43,14 @@ import static org.mockito.Mockito.withSettings;  import android.app.ActivityManagerInternal;  import android.app.AppOpsManager; +import android.app.IApplicationThread;  import android.app.usage.UsageStatsManagerInternal;  import android.content.BroadcastReceiver;  import android.content.ComponentName;  import android.content.ContentResolver;  import android.content.Context;  import android.content.IntentFilter; +import android.content.pm.ApplicationInfo;  import android.content.pm.IPackageManager;  import android.content.pm.PackageManagerInternal;  import android.database.ContentObserver; @@ -454,8 +456,32 @@ public class SystemServicesTestRule implements TestRule {                  .spiedInstance(sWakeLock).stubOnly());      } -    void setSurfaceFactory(Supplier<Surface> factory) { -        mSurfaceFactory = factory; +    WindowProcessController addProcess(String pkgName, String procName, int pid, int uid) { +        return addProcess(mAtmService, pkgName, procName, pid, uid); +    } + +    static WindowProcessController addProcess(ActivityTaskManagerService atmService, String pkgName, +            String procName, int pid, int uid) { +        final ApplicationInfo info = new ApplicationInfo(); +        info.uid = uid; +        info.packageName = pkgName; +        return addProcess(atmService, info, procName, pid); +    } + +    static WindowProcessController addProcess(ActivityTaskManagerService atmService, +            ApplicationInfo info, String procName, int pid) { +        final WindowProcessListener mockListener = mock(WindowProcessListener.class, +                withSettings().stubOnly()); +        final int uid = info.uid; +        final WindowProcessController proc = new WindowProcessController(atmService, +                info, procName, uid, UserHandle.getUserId(uid), mockListener, mockListener); +        proc.setThread(mock(IApplicationThread.class, withSettings().stubOnly())); +        atmService.mProcessNames.put(procName, uid, proc); +        if (pid > 0) { +            proc.setPid(pid); +            atmService.mProcessMap.put(pid, proc); +        } +        return proc;      }      void cleanupWindowManagerHandlers() { diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 20fbda428381..7347f8825ff7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -64,7 +64,6 @@ import android.annotation.IntDef;  import android.annotation.NonNull;  import android.annotation.Nullable;  import android.app.ActivityOptions; -import android.app.IApplicationThread;  import android.content.ComponentName;  import android.content.Context;  import android.content.Intent; @@ -915,13 +914,15 @@ class WindowTestsBase extends SystemServiceTestsBase {       */      protected static class ActivityBuilder {          static final int DEFAULT_FAKE_UID = 12345; +        static final String DEFAULT_PROCESS_NAME = "procName"; +        static int sProcNameSeq;          private final ActivityTaskManagerService mService;          private ComponentName mComponent;          private String mTargetActivity;          private Task mTask; -        private String mProcessName = "name"; +        private String mProcessName = DEFAULT_PROCESS_NAME;          private String mAffinity;          private int mUid = DEFAULT_FAKE_UID;          private boolean mCreateTask = false; @@ -1109,6 +1110,9 @@ class WindowTestsBase extends SystemServiceTestsBase {              aInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT;              aInfo.applicationInfo.packageName = mComponent.getPackageName();              aInfo.applicationInfo.uid = mUid; +            if (DEFAULT_PROCESS_NAME.equals(mProcessName)) { +                mProcessName += ++sProcNameSeq; +            }              aInfo.processName = mProcessName;              aInfo.packageName = mComponent.getPackageName();              aInfo.name = mComponent.getClassName(); @@ -1173,16 +1177,11 @@ class WindowTestsBase extends SystemServiceTestsBase {              if (mWpc != null) {                  wpc = mWpc;              } else { -                wpc = new WindowProcessController(mService, -                        aInfo.applicationInfo, mProcessName, mUid, -                        UserHandle.getUserId(mUid), mock(Object.class), -                        mock(WindowProcessListener.class)); -                wpc.setThread(mock(IApplicationThread.class)); +                final WindowProcessController p = mService.getProcessController(mProcessName, mUid); +                wpc = p != null ? p : SystemServicesTestRule.addProcess( +                        mService, aInfo.applicationInfo, mProcessName, 0 /* pid */);              } -            wpc.setThread(mock(IApplicationThread.class));              activity.setProcess(wpc); -            doReturn(wpc).when(mService).getProcessController( -                    activity.processName, activity.info.applicationInfo.uid);              // Resume top activities to make sure all other signals in the system are connected.              mService.mRootWindowContainer.resumeFocusedTasksTopActivities(); diff --git a/telephony/java/android/telephony/AccessNetworkConstants.java b/telephony/java/android/telephony/AccessNetworkConstants.java index 4469ffc14447..7eec86a40c13 100644 --- a/telephony/java/android/telephony/AccessNetworkConstants.java +++ b/telephony/java/android/telephony/AccessNetworkConstants.java @@ -115,15 +115,15 @@ public final class AccessNetworkConstants {          /** @hide */          public static @RadioAccessNetworkType int fromString(@NonNull String str) {              switch (str.toUpperCase()) { -                case "GERAN" : return GERAN; -                case "UTRAN" : return UTRAN; -                case "EUTRAN" : return EUTRAN; -                case "CDMA2000" : return CDMA2000; -                case "IWLAN" : return IWLAN; -                case "NGRAN" : return NGRAN; +                case "UNKNOWN": return UNKNOWN; +                case "GERAN": return GERAN; +                case "UTRAN": return UTRAN; +                case "EUTRAN": return EUTRAN; +                case "CDMA2000": return CDMA2000; +                case "IWLAN": return IWLAN; +                case "NGRAN": return NGRAN;                  default: -                    Rlog.e(TAG, "Invalid access network type " + str); -                    return UNKNOWN; +                    throw new IllegalArgumentException("Invalid access network type " + str);              }          }      } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 70fe6b10ef20..e032f65f3427 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -8550,6 +8550,13 @@ public class CarrierConfigManager {       * IWLAN handover rules that determine whether handover is allowed or disallowed between       * cellular and IWLAN.       * +     * Rule syntax: "source=[GERAN|UTRAN|EUTRAN|NGRAN|IWLAN|UNKNOWN], target=[GERAN|UTRAN|EUTRAN +     * |NGRAN|IWLAN], type=[allowed|disallowed], roaming=[true|false], capabilities=[INTERNET|MMS +     * |FOTA|IMS|CBS|SUPL|EIMS|XCAP|DUN]" +     * +     * Note that UNKNOWN can be only specified in the source access network and can be only used +     * in the disallowed rule. +     *       * The handover rules will be matched in the order. Here are some sample rules.       * <string-array name="iwlan_handover_rules" num="5">       *     <!-- Handover from IWLAN to 2G/3G is not allowed --> diff --git a/telephony/java/android/telephony/DataFailCause.java b/telephony/java/android/telephony/DataFailCause.java index ac1f376cf6b5..e882b259f45e 100644 --- a/telephony/java/android/telephony/DataFailCause.java +++ b/telephony/java/android/telephony/DataFailCause.java @@ -125,6 +125,12 @@ public final class DataFailCause {      public static final int UNSUPPORTED_QCI_VALUE = 0x3B;      /** Procedure requested by the UE was rejected because the bearer handling is not supported. */      public static final int BEARER_HANDLING_NOT_SUPPORTED = 0x3C; +    /** +     * This cause is used to report a service or option not available event only when no other +     * cause in the service or option not available class applies. +     * @hide // TODO: Unhide in U. +     */ +    public static final int SERVICE_OR_OPTION_NOT_AVAILABLE = 0x3F;      /** Max number of Packet Data Protocol (PDP) context reached. */      public static final int ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED = 0x41;      /** Unsupported APN in current public land mobile network (PLMN). */ @@ -1135,6 +1141,7 @@ public final class DataFailCause {          sFailCauseMap.put(ONLY_NON_IP_ALLOWED, "ONLY_NON_IP_ALLOWED");          sFailCauseMap.put(UNSUPPORTED_QCI_VALUE, "UNSUPPORTED_QCI_VALUE");          sFailCauseMap.put(BEARER_HANDLING_NOT_SUPPORTED, "BEARER_HANDLING_NOT_SUPPORTED"); +        sFailCauseMap.put(SERVICE_OR_OPTION_NOT_AVAILABLE, "SERVICE_OR_OPTION_NOT_AVAILABLE");          sFailCauseMap.put(ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED,                  "ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED");          sFailCauseMap.put(UNSUPPORTED_APN_IN_CURRENT_PLMN, diff --git a/telephony/java/android/telephony/NetworkRegistrationInfo.java b/telephony/java/android/telephony/NetworkRegistrationInfo.java index c701e443a426..1d6798b7fc6e 100644 --- a/telephony/java/android/telephony/NetworkRegistrationInfo.java +++ b/telephony/java/android/telephony/NetworkRegistrationInfo.java @@ -183,8 +183,17 @@ public final class NetworkRegistrationInfo implements Parcelable {      @TransportType      private final int mTransportType; +    /** +     * The initial registration state +     */ +    @RegistrationState +    private final int mInitialRegistrationState; + +    /** +     * The registration state that might have been overridden by config +     */      @RegistrationState -    private final int mRegistrationState; +    private int mRegistrationState;      /**       * Save the {@link ServiceState.RoamingType roaming type}. it can be overridden roaming type @@ -255,6 +264,7 @@ public final class NetworkRegistrationInfo implements Parcelable {          mDomain = domain;          mTransportType = transportType;          mRegistrationState = registrationState; +        mInitialRegistrationState = registrationState;          mRoamingType = (registrationState == REGISTRATION_STATE_ROAMING)                  ? ServiceState.ROAMING_TYPE_UNKNOWN : ServiceState.ROAMING_TYPE_NOT_ROAMING;          setAccessNetworkTechnology(accessNetworkTechnology); @@ -310,6 +320,7 @@ public final class NetworkRegistrationInfo implements Parcelable {          mDomain = source.readInt();          mTransportType = source.readInt();          mRegistrationState = source.readInt(); +        mInitialRegistrationState = source.readInt();          mRoamingType = source.readInt();          mAccessNetworkTechnology = source.readInt();          mRejectCause = source.readInt(); @@ -336,6 +347,7 @@ public final class NetworkRegistrationInfo implements Parcelable {          mDomain = nri.mDomain;          mTransportType = nri.mTransportType;          mRegistrationState = nri.mRegistrationState; +        mInitialRegistrationState = nri.mInitialRegistrationState;          mRoamingType = nri.mRoamingType;          mAccessNetworkTechnology = nri.mAccessNetworkTechnology;          mIsUsingCarrierAggregation = nri.mIsUsingCarrierAggregation; @@ -398,6 +410,15 @@ public final class NetworkRegistrationInfo implements Parcelable {      }      /** +     * @return The initial registration state. +     * +     * @hide +     */ +    public @RegistrationState int getInitialRegistrationState() { +        return mInitialRegistrationState; +    } + +    /**       * @return {@code true} if registered on roaming or home network, {@code false} otherwise.       */      public boolean isRegistered() { @@ -451,6 +472,17 @@ public final class NetworkRegistrationInfo implements Parcelable {       */      public void setRoamingType(@ServiceState.RoamingType int roamingType) {          mRoamingType = roamingType; + +        // make sure mRegistrationState to be consistent in case of any roaming type override +        if (isRoaming()) { +            if (mRegistrationState == REGISTRATION_STATE_HOME) { +                mRegistrationState = REGISTRATION_STATE_ROAMING; +            } +        } else { +            if (mRegistrationState == REGISTRATION_STATE_ROAMING) { +                mRegistrationState = REGISTRATION_STATE_HOME; +            } +        }      }      /** @@ -634,6 +666,8 @@ public final class NetworkRegistrationInfo implements Parcelable {                  .append(" transportType=").append(                          AccessNetworkConstants.transportTypeToString(mTransportType))                  .append(" registrationState=").append(registrationStateToString(mRegistrationState)) +                .append(" mInitialRegistrationState=") +                .append(registrationStateToString(mInitialRegistrationState))                  .append(" roamingType=").append(ServiceState.roamingTypeToString(mRoamingType))                  .append(" accessNetworkTechnology=")                  .append(TelephonyManager.getNetworkTypeName(mAccessNetworkTechnology)) @@ -654,10 +688,10 @@ public final class NetworkRegistrationInfo implements Parcelable {      @Override      public int hashCode() { -        return Objects.hash(mDomain, mTransportType, mRegistrationState, mRoamingType, -                mAccessNetworkTechnology, mRejectCause, mEmergencyOnly, mAvailableServices, -                mCellIdentity, mVoiceSpecificInfo, mDataSpecificInfo, mNrState, mRplmn, -                mIsUsingCarrierAggregation); +        return Objects.hash(mDomain, mTransportType, mRegistrationState, mInitialRegistrationState, +                mRoamingType, mAccessNetworkTechnology, mRejectCause, mEmergencyOnly, +                mAvailableServices, mCellIdentity, mVoiceSpecificInfo, mDataSpecificInfo, mNrState, +                mRplmn, mIsUsingCarrierAggregation);      }      @Override @@ -672,6 +706,7 @@ public final class NetworkRegistrationInfo implements Parcelable {          return mDomain == other.mDomain                  && mTransportType == other.mTransportType                  && mRegistrationState == other.mRegistrationState +                && mInitialRegistrationState == other.mInitialRegistrationState                  && mRoamingType == other.mRoamingType                  && mAccessNetworkTechnology == other.mAccessNetworkTechnology                  && mRejectCause == other.mRejectCause @@ -694,6 +729,7 @@ public final class NetworkRegistrationInfo implements Parcelable {          dest.writeInt(mDomain);          dest.writeInt(mTransportType);          dest.writeInt(mRegistrationState); +        dest.writeInt(mInitialRegistrationState);          dest.writeInt(mRoamingType);          dest.writeInt(mAccessNetworkTechnology);          dest.writeInt(mRejectCause); @@ -790,7 +826,7 @@ public final class NetworkRegistrationInfo implements Parcelable {          private int mTransportType;          @RegistrationState -        private int mRegistrationState; +        private int mInitialRegistrationState;          @NetworkType          private int mAccessNetworkTechnology; @@ -851,7 +887,7 @@ public final class NetworkRegistrationInfo implements Parcelable {           * @return The same instance of the builder.           */          public @NonNull Builder setRegistrationState(@RegistrationState int registrationState) { -            mRegistrationState = registrationState; +            mInitialRegistrationState = registrationState;              return this;          } @@ -970,7 +1006,7 @@ public final class NetworkRegistrationInfo implements Parcelable {           */          @SystemApi          public @NonNull NetworkRegistrationInfo build() { -            return new NetworkRegistrationInfo(mDomain, mTransportType, mRegistrationState, +            return new NetworkRegistrationInfo(mDomain, mTransportType, mInitialRegistrationState,                      mAccessNetworkTechnology, mRejectCause, mEmergencyOnly, mAvailableServices,                      mCellIdentity, mRplmn, mVoiceSpecificRegistrationInfo,                      mDataSpecificRegistrationInfo); diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp index 34e8edb0a47f..8ea43abff895 100644 --- a/tools/aapt2/SdkConstants.cpp +++ b/tools/aapt2/SdkConstants.cpp @@ -27,7 +27,7 @@ namespace aapt {  static ApiVersion sDevelopmentSdkLevel = 10000;  static const auto sDevelopmentSdkCodeNames = -    std::unordered_set<StringPiece>({"Q", "R", "S", "Sv2", "Tiramisu", "UpsideDownCake"}); +    std::unordered_set<StringPiece>({"Q", "R", "S", "Sv2", "Tiramisu"});  static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = {      {0x021c, 1},  |