diff options
190 files changed, 3169 insertions, 859 deletions
diff --git a/api/test-current.txt b/api/test-current.txt index 0d8471c9299e..a3ef9c41d5d2 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2312,6 +2312,7 @@ package android.provider { } public static interface DeviceConfig.WindowManager { + field public static final String KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE = "system_gestures_excluded_by_pre_q_sticky_immersive"; field public static final String KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP = "system_gesture_exclusion_limit_dp"; } diff --git a/config/hiddenapi-greylist-max-p.txt b/config/hiddenapi-greylist-max-p.txt index 141e8e669dac..25d45b0e6570 100644 --- a/config/hiddenapi-greylist-max-p.txt +++ b/config/hiddenapi-greylist-max-p.txt @@ -70,6 +70,8 @@ Lcom/android/internal/R$styleable;->MenuView:[I Lcom/android/internal/R$styleable;->Searchable:[I Lcom/android/internal/R$styleable;->SearchableActionKey:[I Lcom/android/internal/telephony/IPhoneSubInfo$Stub;-><init>()V +Lcom/android/internal/telephony/ITelephony;->getDataActivity()I +Lcom/android/internal/telephony/ITelephony;->getDataState()I Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallForwardingChanged(Z)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCellLocation(Landroid/os/Bundle;)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyDataActivity(I)V diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 60f1424220f6..fb72e651cebd 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -240,7 +240,8 @@ public class AppOpsManager { public @interface UidState {} /** - * Uid state: The UID is a foreground persistent app. + * Uid state: The UID is a foreground persistent app. The lower the UID + * state the more important the UID is for the user. * @hide */ @TestApi @@ -248,7 +249,8 @@ public class AppOpsManager { public static final int UID_STATE_PERSISTENT = 100; /** - * Uid state: The UID is top foreground app. + * Uid state: The UID is top foreground app. The lower the UID + * state the more important the UID is for the user. * @hide */ @TestApi @@ -257,6 +259,7 @@ public class AppOpsManager { /** * Uid state: The UID is running a foreground service of location type. + * The lower the UID state the more important the UID is for the user. * @hide */ @TestApi @@ -264,7 +267,8 @@ public class AppOpsManager { public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; /** - * Uid state: The UID is running a foreground service. + * Uid state: The UID is running a foreground service. The lower the UID + * state the more important the UID is for the user. * @hide */ @TestApi @@ -279,7 +283,8 @@ public class AppOpsManager { public static final int UID_STATE_MAX_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE; /** - * Uid state: The UID is a foreground app. + * Uid state: The UID is a foreground app. The lower the UID + * state the more important the UID is for the user. * @hide */ @TestApi @@ -287,7 +292,8 @@ public class AppOpsManager { public static final int UID_STATE_FOREGROUND = 500; /** - * Uid state: The UID is a background app. + * Uid state: The UID is a background app. The lower the UID + * state the more important the UID is for the user. * @hide */ @TestApi @@ -295,7 +301,8 @@ public class AppOpsManager { public static final int UID_STATE_BACKGROUND = 600; /** - * Uid state: The UID is a cached app. + * Uid state: The UID is a cached app. The lower the UID + * state the more important the UID is for the user. * @hide */ @TestApi @@ -2507,7 +2514,7 @@ public class AppOpsManager { } /** - * @return The duration of the operation in milliseconds. + * @return The duration of the operation in milliseconds. The duration is in wall time. */ public long getDuration() { return getLastDuration(MAX_PRIORITY_UID_STATE, MIN_PRIORITY_UID_STATE, OP_FLAGS_ALL); @@ -2515,7 +2522,7 @@ public class AppOpsManager { /** * Return the duration in milliseconds the app accessed this op while - * in the foreground. + * in the foreground. The duration is in wall time. * * @param flags The flags which are any combination of * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY}, @@ -2534,7 +2541,7 @@ public class AppOpsManager { /** * Return the duration in milliseconds the app accessed this op while - * in the background. + * in the background. The duration is in wall time. * * @param flags The flags which are any combination of * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY}, @@ -2553,7 +2560,7 @@ public class AppOpsManager { /** * Return the duration in milliseconds the app accessed this op for - * a given range of UID states. + * a given range of UID states. The duration is in wall time. * * @param fromUidState The UID state for which to query. Could be one of * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP}, @@ -3968,6 +3975,7 @@ public class AppOpsManager { /** * Gets the total duration the app op was accessed (performed) in the foreground. + * The duration is in wall time. * * @param flags The flags which are any combination of * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY}, @@ -3986,6 +3994,7 @@ public class AppOpsManager { /** * Gets the total duration the app op was accessed (performed) in the background. + * The duration is in wall time. * * @param flags The flags which are any combination of * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY}, @@ -4004,7 +4013,7 @@ public class AppOpsManager { /** * Gets the total duration the app op was accessed (performed) for a given - * range of UID states. + * range of UID states. The duration is in wall time. * * @param fromUidState The UID state from which to query. Could be one of * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP}, diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java index ae421a4991a4..87c7118c0ed8 100644 --- a/core/java/android/net/NetworkTemplate.java +++ b/core/java/android/net/NetworkTemplate.java @@ -48,6 +48,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Arrays; +import java.util.List; import java.util.Objects; /** @@ -481,17 +482,39 @@ public class NetworkTemplate implements Parcelable { * For example, given an incoming template matching B, and the currently * active merge set [A,B], we'd return a new template that primarily matches * A, but also matches B. + * TODO: remove and use {@link #normalize(NetworkTemplate, List)}. */ @UnsupportedAppUsage public static NetworkTemplate normalize(NetworkTemplate template, String[] merged) { - if (template.isMatchRuleMobile() && ArrayUtils.contains(merged, template.mSubscriberId)) { - // Requested template subscriber is part of the merge group; return - // a template that matches all merged subscribers. - return new NetworkTemplate(template.mMatchRule, merged[0], merged, - template.mNetworkId); - } else { - return template; + return normalize(template, Arrays.<String[]>asList(merged)); + } + + /** + * Examine the given template and normalize if it refers to a "merged" + * mobile subscriber. We pick the "lowest" merged subscriber as the primary + * for key purposes, and expand the template to match all other merged + * subscribers. + * + * There can be multiple merged subscriberIds for multi-SIM devices. + * + * <p> + * For example, given an incoming template matching B, and the currently + * active merge set [A,B], we'd return a new template that primarily matches + * A, but also matches B. + */ + public static NetworkTemplate normalize(NetworkTemplate template, List<String[]> mergedList) { + if (!template.isMatchRuleMobile()) return template; + + for (String[] merged : mergedList) { + if (ArrayUtils.contains(merged, template.mSubscriberId)) { + // Requested template subscriber is part of the merge group; return + // a template that matches all merged subscribers. + return new NetworkTemplate(template.mMatchRule, merged[0], merged, + template.mNetworkId); + } } + + return template; } @UnsupportedAppUsage diff --git a/core/java/android/os/RedactingFileDescriptor.java b/core/java/android/os/RedactingFileDescriptor.java index 4e5eaac3442f..a1ed2146b38e 100644 --- a/core/java/android/os/RedactingFileDescriptor.java +++ b/core/java/android/os/RedactingFileDescriptor.java @@ -35,7 +35,7 @@ import java.util.Arrays; /** * Variant of {@link FileDescriptor} that allows its creator to specify regions - * that should be redacted (appearing as zeros to the reader). + * that should be redacted. * * @hide */ @@ -44,13 +44,16 @@ public class RedactingFileDescriptor { private static final boolean DEBUG = true; private volatile long[] mRedactRanges; + private volatile long[] mFreeOffsets; private FileDescriptor mInner = null; private ParcelFileDescriptor mOuter = null; - private RedactingFileDescriptor(Context context, File file, int mode, long[] redactRanges) + private RedactingFileDescriptor( + Context context, File file, int mode, long[] redactRanges, long[] freeOffsets) throws IOException { mRedactRanges = checkRangesArgument(redactRanges); + mFreeOffsets = freeOffsets; try { try { @@ -88,13 +91,17 @@ public class RedactingFileDescriptor { * * @param file The underlying file to open. * @param mode The {@link ParcelFileDescriptor} mode to open with. - * @param redactRanges List of file offsets that should be redacted, stored + * @param redactRanges List of file ranges that should be redacted, stored * as {@code [start1, end1, start2, end2, ...]}. Start values are * inclusive and end values are exclusive. + * @param freePositions List of file offsets at which the four byte value 'free' should be + * written instead of zeros within parts of the file covered by {@code redactRanges}. + * Non-redacted bytes will not be modified even if covered by a 'free'. This is + * useful for overwriting boxes in ISOBMFF files with padding data. */ public static ParcelFileDescriptor open(Context context, File file, int mode, - long[] redactRanges) throws IOException { - return new RedactingFileDescriptor(context, file, mode, redactRanges).mOuter; + long[] redactRanges, long[] freePositions) throws IOException { + return new RedactingFileDescriptor(context, file, mode, redactRanges, freePositions).mOuter; } /** @@ -169,6 +176,15 @@ public class RedactingFileDescriptor { for (long j = start; j < end; j++) { data[(int) (j - offset)] = 0; } + // Overwrite data at 'free' offsets within the redaction ranges. + for (long freeOffset : mFreeOffsets) { + final long freeEnd = freeOffset + 4; + final long redactFreeStart = Math.max(freeOffset, start); + final long redactFreeEnd = Math.min(freeEnd, end); + for (long j = redactFreeStart; j < redactFreeEnd; j++) { + data[(int) (j - offset)] = (byte) "free".charAt((int) (j - freeOffset)); + } + } } return n; } diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index 920eb4b51775..1fd212df4469 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -325,6 +325,26 @@ public final class DeviceConfig { */ @TestApi String KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP = "system_gesture_exclusion_limit_dp"; + + /** + * Key for controlling whether system gestures are implicitly excluded by windows requesting + * sticky immersive mode from apps that are targeting an SDK prior to Q. + * + * @see android.provider.DeviceConfig#NAMESPACE_WINDOW_MANAGER + * @hide + */ + @TestApi + String KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE = + "system_gestures_excluded_by_pre_q_sticky_immersive"; + + /** + * Key for controlling which packages are explicitly blocked from running at refresh rates + * higher than 60hz. + * + * @see android.provider.DeviceConfig#NAMESPACE_WINDOW_MANAGER + * @hide + */ + String KEY_HIGH_REFRESH_RATE_BLACKLIST = "high_refresh_rate_blacklist"; } private static final Object sLock = new Object(); diff --git a/core/java/com/android/internal/app/PlatLogoActivity.java b/core/java/com/android/internal/app/PlatLogoActivity.java index 57785443919e..157e0a74712b 100644 --- a/core/java/com/android/internal/app/PlatLogoActivity.java +++ b/core/java/com/android/internal/app/PlatLogoActivity.java @@ -16,252 +16,167 @@ package com.android.internal.app; +import android.animation.ObjectAnimator; import android.animation.TimeAnimator; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Intent; +import android.content.res.ColorStateList; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.ColorFilter; +import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; +import android.graphics.PixelFormat; +import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.provider.Settings; import android.util.Log; +import android.view.HapticFeedbackConstants; import android.view.MotionEvent; -import android.view.MotionEvent.PointerCoords; import android.view.View; -import android.widget.FrameLayout; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.android.internal.R; import org.json.JSONObject; +/** + * @hide + */ public class PlatLogoActivity extends Activity { - FrameLayout layout; - TimeAnimator anim; - PBackground bg; - - private class PBackground extends Drawable { - private float maxRadius, radius, x, y, dp; - private int[] palette; - private int darkest; - private float offset; - - public PBackground() { - randomizePalette(); - } - - /** - * set inner radius of "p" logo - */ - public void setRadius(float r) { - this.radius = Math.max(48*dp, r); - } - - /** - * move the "p" - */ - public void setPosition(float x, float y) { - this.x = x; - this.y = y; - } - - /** - * for animating the "p" - */ - public void setOffset(float o) { - this.offset = o; - } - - /** - * rough luminance calculation - * https://www.w3.org/TR/AERT/#color-contrast - */ - public float lum(int rgb) { - return ((Color.red(rgb) * 299f) + (Color.green(rgb) * 587f) + (Color.blue(rgb) * 114f)) / 1000f; - } - - /** - * create a random evenly-spaced color palette - * guaranteed to contrast! - */ - public void randomizePalette() { - final int slots = 2 + (int)(Math.random() * 2); - float[] color = new float[] { (float) Math.random() * 360f, 1f, 1f }; - palette = new int[slots]; - darkest = 0; - for (int i=0; i<slots; i++) { - palette[i] = Color.HSVToColor(color); - color[0] = (color[0] + 360f/slots) % 360f; - if (lum(palette[i]) < lum(palette[darkest])) darkest = i; - } - - final StringBuilder str = new StringBuilder(); - for (int c : palette) { - str.append(String.format("#%08x ", c)); - } - Log.v("PlatLogoActivity", "color palette: " + str); - } - - @Override - public void draw(Canvas canvas) { - if (dp == 0) dp = getResources().getDisplayMetrics().density; - final float width = canvas.getWidth(); - final float height = canvas.getHeight(); - if (radius == 0) { - setPosition(width / 2, height / 2); - setRadius(width / 6); - } - final float inner_w = radius * 0.667f; - - final Paint paint = new Paint(); - paint.setStrokeCap(Paint.Cap.BUTT); - canvas.translate(x, y); - - Path p = new Path(); - p.moveTo(-radius, height); - p.lineTo(-radius, 0); - p.arcTo(-radius, -radius, radius, radius, -180, 270, false); - p.lineTo(-radius, radius); - - float w = Math.max(canvas.getWidth(), canvas.getHeight()) * 1.414f; - paint.setStyle(Paint.Style.FILL); - - int i=0; - while (w > radius*2 + inner_w*2) { - paint.setColor(0xFF000000 | palette[i % palette.length]); - // for a slower but more complete version: - // paint.setStrokeWidth(w); - // canvas.drawPath(p, paint); - canvas.drawOval(-w/2, -w/2, w/2, w/2, paint); - w -= inner_w * (1.1f + Math.sin((i/20f + offset) * 3.14159f)); - i++; - } - - // the innermost circle needs to be a constant color to avoid rapid flashing - paint.setColor(0xFF000000 | palette[(darkest+1) % palette.length]); - canvas.drawOval(-radius, -radius, radius, radius, paint); - - p.reset(); - p.moveTo(-radius, height); - p.lineTo(-radius, 0); - p.arcTo(-radius, -radius, radius, radius, -180, 270, false); - p.lineTo(-radius + inner_w, radius); - - paint.setStyle(Paint.Style.STROKE); - paint.setStrokeWidth(inner_w*2); - paint.setColor(palette[darkest]); - canvas.drawPath(p, paint); - paint.setStrokeWidth(inner_w); - paint.setColor(0xFFFFFFFF); - canvas.drawPath(p, paint); - } - - @Override - public void setAlpha(int alpha) { - - } - - @Override - public void setColorFilter(ColorFilter colorFilter) { - - } + ImageView mZeroView, mOneView; + BackslashDrawable mBackslash; + int mClicks; + + static final Paint sPaint = new Paint(); + static { + sPaint.setStyle(Paint.Style.STROKE); + sPaint.setStrokeWidth(4f); + sPaint.setStrokeCap(Paint.Cap.SQUARE); + } - @Override - public int getOpacity() { - return 0; + @Override + protected void onPause() { + if (mBackslash != null) { + mBackslash.stopAnimating(); } + mClicks = 0; + super.onPause(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + final float dp = getResources().getDisplayMetrics().density; - layout = new FrameLayout(this); - setContentView(layout); + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + getWindow().setNavigationBarColor(0); + getWindow().setStatusBarColor(0); - bg = new PBackground(); - layout.setBackground(bg); + getActionBar().hide(); - final ContentResolver cr = getContentResolver(); + setContentView(R.layout.platlogo_layout); - layout.setOnTouchListener(new View.OnTouchListener() { - final String TOUCH_STATS = "touch.stats"; + mBackslash = new BackslashDrawable((int) (50 * dp)); - final PointerCoords pc0 = new PointerCoords(); - final PointerCoords pc1 = new PointerCoords(); + mOneView = findViewById(R.id.one); + mOneView.setImageDrawable(new OneDrawable()); + mZeroView = findViewById(R.id.zero); + mZeroView.setImageDrawable(new ZeroDrawable()); - double pressure_min, pressure_max; - int maxPointers; - int tapCount; + final ViewGroup root = (ViewGroup) mOneView.getParent(); + root.setClipChildren(false); + root.setBackground(mBackslash); + root.getBackground().setAlpha(0x20); + View.OnTouchListener tl = new View.OnTouchListener() { + float mOffsetX, mOffsetY; + long mClickTime; + ObjectAnimator mRotAnim; @Override public boolean onTouch(View v, MotionEvent event) { - final float pressure = event.getPressure(); + measureTouchPressure(event); switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: - pressure_min = pressure_max = pressure; - // fall through - case MotionEvent.ACTION_MOVE: - if (pressure < pressure_min) pressure_min = pressure; - if (pressure > pressure_max) pressure_max = pressure; - final int pc = event.getPointerCount(); - if (pc > maxPointers) maxPointers = pc; - if (pc > 1) { - event.getPointerCoords(0, pc0); - event.getPointerCoords(1, pc1); - bg.setRadius((float) Math.hypot(pc0.x - pc1.x, pc0.y - pc1.y) / 2f); + v.animate().scaleX(1.1f).scaleY(1.1f); + v.getParent().bringChildToFront(v); + mOffsetX = event.getRawX() - v.getX(); + mOffsetY = event.getRawY() - v.getY(); + long now = System.currentTimeMillis(); + if (now - mClickTime < 350) { + mRotAnim = ObjectAnimator.ofFloat(v, View.ROTATION, + v.getRotation(), v.getRotation() + 3600); + mRotAnim.setDuration(10000); + mRotAnim.start(); + mClickTime = 0; + } else { + mClickTime = now; } break; - case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_MOVE: + v.setX(event.getRawX() - mOffsetX); + v.setY(event.getRawY() - mOffsetY); + v.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE); + break; case MotionEvent.ACTION_UP: - try { - final String touchDataJson = Settings.System.getString(cr, TOUCH_STATS); - final JSONObject touchData = new JSONObject( - touchDataJson != null ? touchDataJson : "{}"); - if (touchData.has("min")) { - pressure_min = Math.min(pressure_min, touchData.getDouble("min")); - } - if (touchData.has("max")) { - pressure_max = Math.max(pressure_max, touchData.getDouble("max")); - } - touchData.put("min", pressure_min); - touchData.put("max", pressure_max); - Settings.System.putString(cr, TOUCH_STATS, touchData.toString()); - } catch (Exception e) { - Log.e("PlatLogoActivity", "Can't write touch settings", e); - } - - if (maxPointers == 1) { - tapCount ++; - if (tapCount < 7) { - bg.randomizePalette(); - } else { - launchNextStage(); - } - } else { - tapCount = 0; - } - maxPointers = 0; + v.performClick(); + // fall through + case MotionEvent.ACTION_CANCEL: + v.animate().scaleX(1f).scaleY(1f); + if (mRotAnim != null) mRotAnim.cancel(); + testOverlap(); break; } return true; } - }); + }; + + findViewById(R.id.one).setOnTouchListener(tl); + findViewById(R.id.zero).setOnTouchListener(tl); + findViewById(R.id.text).setOnTouchListener(tl); + } + + private void testOverlap() { + final float width = mZeroView.getWidth(); + final float targetX = mZeroView.getX() + width * .2f; + final float targetY = mZeroView.getY() + width * .3f; + if (Math.hypot(targetX - mOneView.getX(), targetY - mOneView.getY()) < width * .2f + && Math.abs(mOneView.getRotation() % 360 - 315) < 15) { + mOneView.animate().x(mZeroView.getX() + width * .2f); + mOneView.animate().y(mZeroView.getY() + width * .3f); + mOneView.setRotation(mOneView.getRotation() % 360); + mOneView.animate().rotation(315); + mOneView.performHapticFeedback(HapticFeedbackConstants.CONFIRM); + + mBackslash.startAnimating(); + + mClicks++; + if (mClicks >= 7) { + launchNextStage(); + } + } else { + mBackslash.stopAnimating(); + } } private void launchNextStage() { final ContentResolver cr = getContentResolver(); - if (Settings.System.getLong(cr, Settings.System.EGG_MODE, 0) == 0) { + if (Settings.System.getLong(cr, "egg_mode" /* Settings.System.EGG_MODE */, 0) == 0) { // For posterity: the moment this user unlocked the easter egg try { Settings.System.putLong(cr, - Settings.System.EGG_MODE, + "egg_mode", // Settings.System.EGG_MODE, System.currentTimeMillis()); } catch (RuntimeException e) { - Log.e("PlatLogoActivity", "Can't write settings", e); + Log.e("com.android.internal.app.PlatLogoActivity", "Can't write settings", e); } } try { @@ -270,36 +185,206 @@ public class PlatLogoActivity extends Activity { | Intent.FLAG_ACTIVITY_CLEAR_TASK) .addCategory("com.android.internal.category.PLATLOGO")); } catch (ActivityNotFoundException ex) { - Log.e("PlatLogoActivity", "No more eggs."); + Log.e("com.android.internal.app.PlatLogoActivity", "No more eggs."); } finish(); } + static final String TOUCH_STATS = "touch.stats"; + double mPressureMin = 0, mPressureMax = -1; + + private void measureTouchPressure(MotionEvent event) { + final float pressure = event.getPressure(); + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + if (mPressureMax < 0) { + mPressureMin = mPressureMax = pressure; + } + break; + case MotionEvent.ACTION_MOVE: + if (pressure < mPressureMin) mPressureMin = pressure; + if (pressure > mPressureMax) mPressureMax = pressure; + break; + } + } + + private void syncTouchPressure() { + try { + final String touchDataJson = Settings.System.getString( + getContentResolver(), TOUCH_STATS); + final JSONObject touchData = new JSONObject( + touchDataJson != null ? touchDataJson : "{}"); + if (touchData.has("min")) { + mPressureMin = Math.min(mPressureMin, touchData.getDouble("min")); + } + if (touchData.has("max")) { + mPressureMax = Math.max(mPressureMax, touchData.getDouble("max")); + } + if (mPressureMax >= 0) { + touchData.put("min", mPressureMin); + touchData.put("max", mPressureMax); + Settings.System.putString(getContentResolver(), TOUCH_STATS, touchData.toString()); + } + } catch (Exception e) { + Log.e("com.android.internal.app.PlatLogoActivity", "Can't write touch settings", e); + } + } + @Override public void onStart() { super.onStart(); + syncTouchPressure(); + } - bg.randomizePalette(); + @Override + public void onStop() { + syncTouchPressure(); + super.onStop(); + } - anim = new TimeAnimator(); - anim.setTimeListener( - new TimeAnimator.TimeListener() { - @Override - public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) { - bg.setOffset((float) totalTime / 60000f); - bg.invalidateSelf(); - } - }); + static class ZeroDrawable extends Drawable { + int mTintColor; + + @Override + public void draw(Canvas canvas) { + sPaint.setColor(mTintColor | 0xFF000000); + + canvas.save(); + canvas.scale(canvas.getWidth() / 24f, canvas.getHeight() / 24f); + + canvas.drawCircle(12f, 12f, 10f, sPaint); + canvas.restore(); + } - anim.start(); + @Override + public void setAlpha(int alpha) { } + + @Override + public void setColorFilter(ColorFilter colorFilter) { } + + @Override + public void setTintList(ColorStateList tint) { + mTintColor = tint.getDefaultColor(); + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } } - @Override - public void onStop() { - if (anim != null) { - anim.cancel(); - anim = null; + static class OneDrawable extends Drawable { + int mTintColor; + + @Override + public void draw(Canvas canvas) { + sPaint.setColor(mTintColor | 0xFF000000); + + canvas.save(); + canvas.scale(canvas.getWidth() / 24f, canvas.getHeight() / 24f); + + final Path p = new Path(); + p.moveTo(12f, 21.83f); + p.rLineTo(0f, -19.67f); + p.rLineTo(-5f, 0f); + canvas.drawPath(p, sPaint); + canvas.restore(); + } + + @Override + public void setAlpha(int alpha) { } + + @Override + public void setColorFilter(ColorFilter colorFilter) { } + + @Override + public void setTintList(ColorStateList tint) { + mTintColor = tint.getDefaultColor(); + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } + } + + private static class BackslashDrawable extends Drawable implements TimeAnimator.TimeListener { + Bitmap mTile; + Paint mPaint = new Paint(); + BitmapShader mShader; + TimeAnimator mAnimator = new TimeAnimator(); + Matrix mMatrix = new Matrix(); + + public void draw(Canvas canvas) { + canvas.drawPaint(mPaint); + } + + BackslashDrawable(int width) { + mTile = Bitmap.createBitmap(width, width, Bitmap.Config.ALPHA_8); + mAnimator.setTimeListener(this); + + final Canvas tileCanvas = new Canvas(mTile); + final float w = tileCanvas.getWidth(); + final float h = tileCanvas.getHeight(); + + final Path path = new Path(); + path.moveTo(0, 0); + path.lineTo(w / 2, 0); + path.lineTo(w, h / 2); + path.lineTo(w, h); + path.close(); + + path.moveTo(0, h / 2); + path.lineTo(w / 2, h); + path.lineTo(0, h); + path.close(); + + final Paint slashPaint = new Paint(); + slashPaint.setAntiAlias(true); + slashPaint.setStyle(Paint.Style.FILL); + slashPaint.setColor(0xFF000000); + tileCanvas.drawPath(path, slashPaint); + + //mPaint.setColor(0xFF0000FF); + mShader = new BitmapShader(mTile, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); + mPaint.setShader(mShader); + } + + public void startAnimating() { + if (!mAnimator.isStarted()) { + mAnimator.start(); + } + } + + public void stopAnimating() { + if (mAnimator.isStarted()) { + mAnimator.cancel(); + } + } + + @Override + public void setAlpha(int alpha) { + mPaint.setAlpha(alpha); + } + + @Override + public void setColorFilter(ColorFilter colorFilter) { + mPaint.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } + + @Override + public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) { + if (mShader != null) { + mMatrix.postTranslate(deltaTime / 4f, 0); + mShader.setLocalMatrix(mMatrix); + invalidateSelf(); + } } - super.onStop(); } } + diff --git a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java index adf7692adc56..52172cf04362 100644 --- a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java +++ b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java @@ -36,13 +36,16 @@ public class ScreenDecorationsUtils { } // Radius that should be used in case top or bottom aren't defined. - float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius); + float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius) + - resources.getDimension(R.dimen.rounded_corner_radius_adjustment); - float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top); + float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top) + - resources.getDimension(R.dimen.rounded_corner_radius_top_adjustment); if (topRadius == 0f) { topRadius = defaultRadius; } - float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom); + float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom) + - resources.getDimension(R.dimen.rounded_corner_radius_bottom_adjustment); if (bottomRadius == 0f) { bottomRadius = defaultRadius; } diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 14dbabb1ce02..c3e7a36bef78 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -575,7 +575,7 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o if (outArray != NULL) { outLen = MEMINFO_COUNT; for (int i = 0; i < outLen; i++) { - if (i == MEMINFO_VMALLOC_USED) { + if (i == MEMINFO_VMALLOC_USED && mem[i] == 0) { outArray[i] = smi.ReadVmallocInfo() / 1024; continue; } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index fef4dcd3b9f1..eda6cd09d7f5 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -724,6 +724,10 @@ <!-- Allows an application to send SMS messages. <p>Protection level: dangerous + + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> <permission android:name="android.permission.SEND_SMS" android:permissionGroup="android.permission-group.UNDEFINED" @@ -734,6 +738,10 @@ <!-- Allows an application to receive SMS messages. <p>Protection level: dangerous + + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> <permission android:name="android.permission.RECEIVE_SMS" android:permissionGroup="android.permission-group.UNDEFINED" @@ -744,6 +752,10 @@ <!-- Allows an application to read SMS messages. <p>Protection level: dangerous + + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> <permission android:name="android.permission.READ_SMS" android:permissionGroup="android.permission-group.UNDEFINED" @@ -754,6 +766,10 @@ <!-- Allows an application to receive WAP push messages. <p>Protection level: dangerous + + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> <permission android:name="android.permission.RECEIVE_WAP_PUSH" android:permissionGroup="android.permission-group.UNDEFINED" @@ -763,7 +779,11 @@ android:protectionLevel="dangerous" /> <!-- Allows an application to monitor incoming MMS messages. - <p>Protection level: dangerous + <p>Protection level: dangerous + + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> <permission android:name="android.permission.RECEIVE_MMS" android:permissionGroup="android.permission-group.UNDEFINED" @@ -783,6 +803,11 @@ when the alert is first received, and to delay presenting the info to the user until after the initial alert dialog is dismissed. <p>Protection level: dangerous + + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. + @hide Pending API council approval --> <permission android:name="android.permission.READ_CELL_BROADCASTS" android:permissionGroup="android.permission-group.UNDEFINED" @@ -805,30 +830,35 @@ android:priority="900" /> <!-- Allows an application to read from external storage. - <p>Any app that declares the {@link #WRITE_EXTERNAL_STORAGE} permission is implicitly - granted this permission.</p> - <p>This permission is enforced starting in API level 19. Before API level 19, this - permission is not enforced and all apps still have access to read from external storage. - You can test your app with the permission enforced by enabling <em>Protect USB - storage</em> under Developer options in the Settings app on a device running Android 4.1 or - higher.</p> - <p>Also starting in API level 19, this permission is <em>not</em> required to - read/write files in your application-specific directories returned by - {@link android.content.Context#getExternalFilesDir} and - {@link android.content.Context#getExternalCacheDir}. - <p class="note"><strong>Note:</strong> If <em>both</em> your <a - href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code - minSdkVersion}</a> and <a - href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code - targetSdkVersion}</a> values are set to 3 or lower, the system implicitly - grants your app this permission. If you don't need this permission, be sure your <a - href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code - targetSdkVersion}</a> is 4 or higher. - <p>Is this permission is not whitelisted for an app that targets an API level before - {@link android.os.Build.VERSION_CODES#Q} this permission cannot be granted to apps.</p> - <p>Is this permission is not whitelisted for an app that targets an API level - {@link android.os.Build.VERSION_CODES#Q} or later the app will be forced into isolated storage. - </p> + <p>Any app that declares the {@link #WRITE_EXTERNAL_STORAGE} permission is implicitly + granted this permission.</p> + <p>This permission is enforced starting in API level 19. Before API level 19, this + permission is not enforced and all apps still have access to read from external storage. + You can test your app with the permission enforced by enabling <em>Protect USB + storage</em> under Developer options in the Settings app on a device running Android 4.1 or + higher.</p> + <p>Also starting in API level 19, this permission is <em>not</em> required to + read/write files in your application-specific directories returned by + {@link android.content.Context#getExternalFilesDir} and + {@link android.content.Context#getExternalCacheDir}. + <p class="note"><strong>Note:</strong> If <em>both</em> your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code + minSdkVersion}</a> and <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> values are set to 3 or lower, the system implicitly + grants your app this permission. If you don't need this permission, be sure your <a + href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code + targetSdkVersion}</a> is 4 or higher. + + <p> This is a soft restricted permission which cannot be held by an app it its + full form until the installer on record did not whitelist the permission. + Specifically, if the permission is whitelisted the holder app can access + external storage and the visual and aural media collections while if the + permission is not whitelisted the holder app can only access to the visual + and aural medial collections. Also the permission is immutably restricted + meaning that the whitelist state can be specified only at install time and + cannot change until the app is installed. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> <permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:permissionGroup="android.permission-group.UNDEFINED" @@ -916,6 +946,10 @@ {@link #ACCESS_FINE_LOCATION}. Requesting this permission by itself doesn't give you location access. <p>Protection level: dangerous + + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> <permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" android:permissionGroup="android.permission-group.UNDEFINED" @@ -958,6 +992,10 @@ href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> is 16 or higher.</p> <p>Protection level: dangerous + + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> <permission android:name="android.permission.READ_CALL_LOG" android:permissionGroup="android.permission-group.UNDEFINED" @@ -978,6 +1016,10 @@ href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> is 16 or higher.</p> <p>Protection level: dangerous + + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> <permission android:name="android.permission.WRITE_CALL_LOG" android:permissionGroup="android.permission-group.UNDEFINED" @@ -991,6 +1033,10 @@ abort the call altogether. <p>Protection level: dangerous + <p> This is a hard restricted permission which cannot be held by an app until + the installer on record did not whitelist the permission. For more details see + {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. + @deprecated Applications should use {@link android.telecom.CallRedirectionService} instead of the {@link android.content.Intent#ACTION_NEW_OUTGOING_CALL} broadcast. --> @@ -4616,8 +4662,9 @@ android:process=":ui"> </activity> <activity android:name="com.android.internal.app.PlatLogoActivity" - android:theme="@style/Theme.Wallpaper.NoTitleBar.Fullscreen" + android:theme="@style/Theme.DeviceDefault.DayNight" android:configChanges="orientation|keyboardHidden" + android:icon="@drawable/platlogo" android:process=":ui"> </activity> <activity android:name="com.android.internal.app.DisableCarModeActivity" diff --git a/core/res/res/anim/lock_screen_behind_enter_subtle.xml b/core/res/res/anim/lock_screen_behind_enter_subtle.xml index 23b26b791a57..f9f69b12514c 100644 --- a/core/res/res/anim/lock_screen_behind_enter_subtle.xml +++ b/core/res/res/anim/lock_screen_behind_enter_subtle.xml @@ -23,9 +23,11 @@ android:fromAlpha="0.0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:interpolator="@interpolator/linear" + android:startOffset="80" android:duration="233"/> <translate android:fromYDelta="5%p" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/fast_out_slow_in" + android:startOffset="80" android:duration="233" /> </set>
\ No newline at end of file diff --git a/core/res/res/drawable-nodpi/android_logotype.xml b/core/res/res/drawable-nodpi/android_logotype.xml new file mode 100644 index 000000000000..bd298e48ef34 --- /dev/null +++ b/core/res/res/drawable-nodpi/android_logotype.xml @@ -0,0 +1,42 @@ +<!-- +Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="290dp" + android:height="64dp" + android:viewportWidth="290.0" + android:viewportHeight="64.0"> + <path + android:fillColor="#FF000000" + android:pathData="M21.81,28.91c-7.44,0,-12.45,5.85,-12.45,13.37c0,7.52,5.01,13.37,12.45,13.37s12.45,-5.85,12.45,-13.37 C34.26,34.76,29.24,28.91,21.81,28.91 M20.13,20.55c6.02,0,11.03,3.09,13.37,6.43v-5.6l9.19,0l0,41.78l-6.24,0 c-1.63,0,-2.95,-1.32,-2.95,-2.95v-2.65C31.17,60.91,26.15,64,20.14,64C8.69,64,0,54.23,0,42.28C0,30.33,8.69,20.55,20.13,20.55"/> + <path + android:fillColor="#FF000000" + android:pathData="M53.13,21.39l9.19,0l0,5.68c2.5,-4.18,7.27,-6.52,12.7,-6.52c9.69,0,15.96,6.85,15.96,17.46l0,25.15l-6.24,0 c-1.63,0,-2.95,-1.32,-2.95,-2.95l0,-20.7c0,-6.6,-3.34,-10.61,-8.69,-10.61c-6.1,0,-10.78,4.76,-10.78,13.7l0,20.55l-6.25,0 c-1.63,0,-2.95,-1.32,-2.95,-2.95L53.13,21.39z"/> + <path + android:fillColor="#FF000000" + android:pathData="M120.06,28.91c-7.43,0,-12.45,5.85,-12.45,13.37c0,7.52,5.01,13.37,12.45,13.37c7.43,0,12.45,-5.85,12.45,-13.37 C132.51,34.76,127.5,28.91,120.06,28.91 M118.39,20.55c6.02,0,11.03,3.09,13.37,6.43l0,-26.49l9.19,0l0,62.66h-6.24 c-1.63,0,-2.95,-1.32,-2.95,-2.95v-2.65c-2.34,3.34,-7.35,6.43,-13.37,6.43c-11.45,0,-20.14,-9.77,-20.14,-21.72 C98.25,30.33,106.94,20.55,118.39,20.55"/> + <path + android:fillColor="#FF000000" + android:pathData="M151.39,21.39l9.19,0v7.44c1.59,-4.76,6.27,-7.86,11.03,-7.86c1.17,0,2.34,0.08,3.59,0.34v9.44c-1.59,-0.5,-2.92,-0.75,-4.59,-0.75 c-5.26,0,-10.03,4.43,-10.03,12.78l0,20.39l-6.24,0c-1.63,0,-2.95,-1.32,-2.95,-2.95L151.39,21.39z"/> + <path + android:fillColor="#FF000000" + android:pathData="M199.98,55.48c7.35,0,12.53,-5.77,12.53,-13.2c0,-7.44,-5.18,-13.2,-12.53,-13.2c-7.44,0,-12.62,5.77,-12.62,13.2 C187.37,49.71,192.55,55.48,199.98,55.48 M199.98,64c-12.37,0,-21.89,-9.61,-21.89,-21.72c0,-12.12,9.52,-21.73,21.89,-21.73 c12.37,0,21.89,9.61,21.89,21.73C221.87,54.39,212.35,64,199.98,64"/> + <path + android:fillColor="#FF000000" + android:pathData="M229.32,21.39l9.19,0l0,41.78l-6.24,0c-1.63,0,-2.95,-1.32,-2.95,-2.95L229.32,21.39z M233.92,12.28 c-3.34,0,-6.18,-2.76,-6.18,-6.18c0,-3.34,2.84,-6.1,6.18,-6.1c3.43,0,6.1,2.76,6.1,6.1C240.02,9.53,237.34,12.28,233.92,12.28"/> + <path + android:fillColor="#FF000000" + android:pathData="M267.87,28.91c-7.43,0,-12.45,5.85,-12.45,13.37c0,7.52,5.01,13.37,12.45,13.37c7.44,0,12.45,-5.85,12.45,-13.37 C280.32,34.76,275.31,28.91,267.87,28.91 M266.2,20.55c6.02,0,11.03,3.09,13.37,6.43l0,-26.49l9.19,0l0,62.66l-6.24,0 c-1.63,0,-2.95,-1.32,-2.95,-2.95v-2.65c-2.34,3.34,-7.35,6.43,-13.37,6.43c-11.44,0,-20.14,-9.77,-20.14,-21.72S254.76,20.55,266.2,20.55"/> +</vector> diff --git a/core/res/res/drawable-nodpi/platlogo.xml b/core/res/res/drawable-nodpi/platlogo.xml index f5bbadcce06b..19a296a0e46b 100644 --- a/core/res/res/drawable-nodpi/platlogo.xml +++ b/core/res/res/drawable-nodpi/platlogo.xml @@ -1,5 +1,5 @@ <!-- -Copyright (C) 2018 The Android Open Source Project +Copyright (C) 2015 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -13,21 +13,15 @@ Copyright (C) 2018 The Android Open Source Project See the License for the specific language governing permissions and limitations under the License. --> -<vector - xmlns:android="http://schemas.android.com/apk/res/android" - android:name="vector" - android:width="640dp" - android:height="640dp" - android:viewportWidth="64" - android:viewportHeight="64"> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> <path - android:name="bg" - android:pathData="M 27 43 L 32 43 C 38.075 43 43 38.075 43 32 C 43 25.925 38.075 21 32 21 C 25.925 21 21 25.925 21 32 L 21 64" - android:strokeColor="#6823a1" - android:strokeWidth="16"/> + android:fillColor="#FF000000" + android:pathData="M19.45,22.89l-10.250001,-10.249999l-2.6599998,2.6599998l-1.77,-1.7600002l4.43,-4.4300003l12.0199995,12.0199995l-1.7699986,1.7600002z"/> <path - android:name="fg" - android:pathData="M 29 43 L 32 43 C 38.075 43 43 38.075 43 32 C 43 25.925 38.075 21 32 21 C 25.925 21 21 25.925 21 32 L 21 64" - android:strokeColor="#ff0000" - android:strokeWidth="8"/> + android:fillColor="#FF000000" + android:pathData="M12,6a6,6 0,1 1,-6 6,6 6,0 0,1 6,-6m0,-2.5A8.5,8.5 0,1 0,20.5 12,8.51 8.51,0 0,0 12,3.5Z"/> </vector> diff --git a/core/res/res/layout/platlogo_layout.xml b/core/res/res/layout/platlogo_layout.xml new file mode 100644 index 000000000000..4a4ad751e421 --- /dev/null +++ b/core/res/res/layout/platlogo_layout.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clipChildren="false" + android:background="@android:color/transparent"> + <ImageView + android:id="@+id/text" + android:layout_width="400dp" + android:layout_height="wrap_content" + android:translationY="-100dp" + android:adjustViewBounds="true" + android:layout_marginBottom="-80dp" + android:layout_centerInParent="true" + android:src="@drawable/android_logotype" + android:tint="?android:attr/textColorPrimary" + /> + <ImageView + android:id="@+id/one" + android:layout_width="200dp" + android:layout_height="200dp" + android:layout_marginLeft="24dp" + android:layout_below="@id/text" + android:layout_alignLeft="@id/text" + android:tint="?android:attr/textColorPrimary" + /> + <ImageView + android:id="@+id/zero" + android:layout_width="200dp" + android:layout_height="200dp" + android:layout_marginRight="34dp" + android:layout_below="@id/text" + android:layout_alignRight="@id/text" + android:tint="?android:attr/textColorPrimary" + /> +</RelativeLayout> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index cdd1696836d6..0816cc0cb594 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Beweeg foon na links."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Beweeg foon na regs."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Kyk asseblief meer reguit na jou toestel."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Kan nie jou gesig sien nie. Kyk na die foon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posisioneer jou gesig direk voor die foon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Te veel beweging. Hou foon stil."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Skryf jou gesig asseblief weer in."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Kan nie meer gesig herken nie. Probeer weer."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 2da35baaf4df..9ab7a53e3ab8 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ስልክን ወደ ግራ ያንቀሳቅሱ።"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ስልክን ወደ ቀኝ ያንቀሳቅሱ።"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"እባክዎ መሣሪያዎን ይበልጥ በቀጥታ ይመልከቱ።"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"የእርስዎን ፊት መመልከት አይችልም። ስልኩ ላይ ይመልከቱ።"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"መልክዎን በቀጥታ ከስልኩ ፊት ያድርጉት።"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ከልክ በላይ ብዙ እንቅስቃሴ። ስልኩን ቀጥ አድርገው ይያዙት።"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"እባክዎ ፊትዎን እንደገና ያስመዝግቡ"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ከእንግዲህ ፊትን ለይቶ ማወቅ አይችልም። እንደገና ይሞክሩ።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 26c2d54e4d8d..375592a9f52f 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -579,7 +579,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"يُرجى نقل الهاتف إلى اليمين."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"يُرجى نقل الهاتف إلى اليسار."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"يُرجى النظر إلى جهازك مباشرة أكثر."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"يتعذّر رؤية وجهك. يُرجى النظر إلى الهاتف."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ضع وجهك أمام الهاتف مباشرة."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"حركة أكثر من اللازم يُرجى حمل بدون حركة."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"يُرجى إعادة تسجيل وجهك."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"لم يعُد يمكن التعرّف على الوجه. حاول مرة أخرى."</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 2f9d52606611..698921978c54 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ফ’নটো বাওঁফালে নিয়ক।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ফ’নটো সোঁফালে নিয়ক।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"আপোনাৰ ডিভাইচটোলৈ অধিক পোনে পোনে চাওক।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"আপোনাৰ মুখমণ্ডল দেখা নাই। ফ’নটোলৈ চাওক।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"আপোনাৰ মুখখন পোনপটীয়াকৈ ফ’নটোৰ সন্মুখত ৰাখক।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"বেছি লৰচৰ কৰি আছে। ফ’নটো স্থিৰকৈ ধৰক।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"মুখমণ্ডল আৰু চিনাক্ত কৰিব নোৱাৰি। আকৌ চেষ্টা কৰক।"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 6beb0c307cc8..7a3cc7aaef5b 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefonu sola hərəkət etdirin."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefonu sağa hərəkət etdirin."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Birbaşa cihaza baxın."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Üzünüz görünmür. Telefona baxın."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Üzünüzü telefonun qarşısında sabit saxlayın."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Cihaz stabil deyil. Telefonu tərpətməyin."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Üzünüzü yenidən qeydiyyatdan keçirin."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Üzü artıq tanımaq olmur. Yenidən cəhd edin."</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index e8d4b5934092..93d87fe2b303 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -570,7 +570,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pomerite telefon ulevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pomerite telefon udesno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Gledajte pravo u uređaj."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ne vidi se lice. Gledajte u telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Postavite lice direktno ispred telefona"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Mnogo se pomerate. Držite telefon mirno."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrujte lice."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Više ne može da se prepozna lice. Probajte ponovo."</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index dcfc4c37a8d6..6823c44b21f8 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -573,7 +573,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Перамясціце тэлефон улева."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Перамясціце тэлефон управа."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Глядзіце прама на экран прылады."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Не відаць твару. Глядзіце на тэлефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Трымайце тэлефон прама перад тварам."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Трымайце прыладу нерухома. Трымайце тэлефон роўна."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Паўтарыце рэгістрацыю твару."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Не ўдаецца распазнаць твар. Паўтарыце спробу."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 639ccd40dd14..b41d69d3f32c 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Преместете телефона наляво."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Преместете телефона надясно."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Моля, гледайте точно към устройството си."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Лицето ви не се вижда. Погледнете към телефона."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Позиционирайте лицето си директно пред телефона."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Твърде много движение. Дръжте телефона неподвижно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Моля, регистрирайте лицето си отново."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Лицето не бе разпознато. Опитайте отново."</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 33968c07f0bc..1889519ecd85 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ফোনটি বাঁদিকে সরান।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ফোনটি ডানদিকে সরান।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"সরাসরি ডিভাইসের দিকে তাকান।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"আপনার মুখ দেখা যাচ্ছে না। ফোনের দিকে তাকান।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"আপনার মুখ সরাসরি ফোনের সামনে রাখুন।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"খুব বেশি নড়ছে। ফোনটি যাতে না কাঁপে সেইভাবে ধরুন।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"আপনার মুখের ছবি আবার নথিভুক্ত করুন।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"আর মুখ চিনতে পারবেন না। আবার চেষ্টা করুন।"</string> @@ -1130,14 +1130,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"এর মাধ্যমে খুলুন"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s দিয়ে খুলুন"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"খুলুন"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"এই ব্রাউজারে <xliff:g id="HOST">%1$s</xliff:g> লিঙ্কটি খুলুন"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"এই ব্রাউজারে লিঙ্কটি খুলুন"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g>-এ লিঙ্ক খুলুন"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g>-এ <xliff:g id="HOST">%1$s</xliff:g> লিঙ্কটি খুলুন"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"অ্যাক্সেস দিন"</string> <string name="whichEditApplication" msgid="144727838241402655">"এর মাধ্যমে সম্পাদনা করুন"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s দিয়ে সম্পাদনা করুন"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ব্রাউজার লঞ্চ করতে চান?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"কল গ্রহণ করবেন?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"সবসময়"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"\'সবসময় খোলা থাকবে\' হিসেবে সেট করুন"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"শুধু একবার"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"সেটিংস"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s কর্মস্থলের প্রোফাইল সমর্থন করে না।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 6ed77e438e04..cd0a1d5aaf7e 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -127,7 +127,7 @@ <item msgid="3910386316304772394">"Da biste pozivali i slali poruke koristeći WiFi mrežu, prvo zatražite od operatera da postavi tu uslugu. Zatim ponovo uključite pozivanje putem WiFi-ja u Postavkama. (Kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> - <item msgid="7372514042696663278">"Došlo je do problema prilikom registracije pozivanja putem WiFi mreže kod vašeg operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item> + <item msgid="7372514042696663278">"Došlo je do problema prilikom registracije pozivanja putem WiFi mreže kod vašeg mobilnog operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> @@ -570,7 +570,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pomjerite telefon ulijevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pomjerite telefon udesno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Gledajte direktno u uređaj."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ne vidi se lice. Gledajte u telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Postavite lice direktno ispred telefona"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Previše pokreta. Držite telefon mirno."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrirajte lice."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nije više moguće prepoznati lice. Pokušajte opet."</string> @@ -801,7 +801,7 @@ <string name="quick_contacts_not_available" msgid="746098007828579688">"Nije pronađena aplikacija za pregled ovog kontakta."</string> <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Unesite PIN"</string> <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Unesite PUK i novi PIN"</string> - <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK"</string> + <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kôd"</string> <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Novi PIN"</string> <string name="keyguard_password_entry_touch_hint" msgid="2644215452200037944"><font size="17">"Dodirnite za unos lozinke"</font></string> <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Unesite lozinku za otključavanje tipkovnice"</string> @@ -893,7 +893,7 @@ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Otključavanje licem."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje pinom."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Otključavanje Pin-om za Sim."</string> - <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Otključavanje Puk-om za Sim."</string> + <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Otključavanje SIM-a PUK-om"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje lozinkom."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Uzorak oblasti."</string> <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblast za pomjeranje klizača."</string> @@ -1150,10 +1150,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otvori koristeći"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvori koristeći %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string> - <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Otvaranje linkova hosta <xliff:g id="HOST">%1$s</xliff:g> pomoću"</string> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Otvaranje <xliff:g id="HOST">%1$s</xliff:g> linkova pomoću"</string> <string name="whichOpenLinksWith" msgid="6392123355599572804">"Otvaranje linkova pomoću"</string> <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Otvaranje linkova pomoću aplikacije <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> - <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Otvaranje linkova hosta <xliff:g id="HOST">%1$s</xliff:g> pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Otvaranje <xliff:g id="HOST">%1$s</xliff:g> linkova pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dozvoli pristup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Uredi koristeći"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Uredi koristeći %1$s"</string> @@ -1542,7 +1542,7 @@ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Povećaj sate"</string> <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Smanji sate"</string> <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Postavi za poslijepodne (PM)"</string> - <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Postavi za prijepodne (AM)"</string> + <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Postavi za prijepodne"</string> <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Povećaj mjesece"</string> <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Smanji mjesece"</string> <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Povećaj dane"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index f7c08d818a51..619af249598d 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mou el telèfon cap a l\'esquerra."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mou el telèfon cap a la dreta."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira més directament cap al dispositiu."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"No se\'t veu la cara. Mira el telèfon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posa la cara directament davant del telèfon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Massa moviment. Subjecta bé el telèfon."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Torna a registrar la teva cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ja no es reconeix la teva cara. Torna-ho a provar."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 660038c43bf9..a9413bdfaaba 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -573,7 +573,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Přesuňte telefon vlevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Přesuňte telefon vpravo."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Dívejte se přímo na zařízení."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Obličej není vidět. Podívejte se na telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Umístěte obličej přímo před telefon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Příliš mnoho pohybu. Držte telefon nehybně."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Zaznamenejte obličej znovu."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Obličej už nelze rozpoznat. Zkuste to znovu."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index b67d0e1211b1..76dea804a645 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Flyt telefonen til venstre."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Flyt telefonen til højre."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Kig mere direkte på din enhed."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Dit ansigt kan ikke registreres. Kig på telefonen."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Sørg for, at dit ansigt er direkte foran telefonen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Der er for meget bevægelse. Hold telefonen stille."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrer dit ansigt igen."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ansigtet kan ikke længere genkendes. Prøv igen."</string> @@ -1130,7 +1130,7 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Åbn med"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Åbn med %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Åbn"</string> - <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Åbn <xliff:g id="HOST">%1$s</xliff:g> links med"</string> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Åbn <xliff:g id="HOST">%1$s</xliff:g>-links med"</string> <string name="whichOpenLinksWith" msgid="6392123355599572804">"Åbn links med"</string> <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Åbn links med <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Åbn <xliff:g id="HOST">%1$s</xliff:g>-links med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 49f58c331978..1ab77ccf66ef 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -315,15 +315,15 @@ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Fensterinhalte abrufen"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die Inhalte eines Fensters, mit dem du interagierst, werden abgerufen."</string> <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Tippen & Entdecken\" aktivieren"</string> - <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Berührte Elemente werden laut vorgelesen und der Bildschirm kann über Gesten erkundet werden."</string> + <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Berührte Elemente werden laut vorgelesen und der Bildschirm kann über Touch-Gesten erkundet werden."</string> <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Text bei der Eingabe beobachten"</string> <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Einschließlich personenbezogener Daten wie Kreditkartennummern und Passwörter."</string> <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Displayvergrößerung festlegen"</string> <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Legt die Zoom-Stufe und -Position auf dem Display fest."</string> - <string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Gesten möglich"</string> - <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Tippen, Wischen, Zusammenziehen und andere Gesten möglich."</string> - <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Bewegungen auf dem Fingerabdrucksensor"</string> - <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Erfasst Bewegungen auf dem Fingerabdrucksensor des Geräts."</string> + <string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Touch-Gesten möglich"</string> + <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Tippen, Wischen, Zusammenziehen und andere Touch-Gesten möglich."</string> + <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerabdrucksensor-Gesten"</string> + <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Erfasst Touch-Gesten auf dem Fingerabdrucksensor des Geräts."</string> <string name="permlab_statusBar" msgid="7417192629601890791">"Statusleiste deaktivieren oder ändern"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Ermöglicht der App, die Statusleiste zu deaktivieren oder Systemsymbole hinzuzufügen oder zu entfernen"</string> <string name="permlab_statusBarService" msgid="4826835508226139688">"Statusleiste darstellen"</string> @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Beweg das Smartphone nach links."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Beweg das Smartphone nach rechts."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Bitte sieh direkt auf dein Gerät."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Gesicht wurde nicht gefunden. Blicke aufs Telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Halte dein Gesicht direkt vor dein Smartphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Zu viel Unruhe. Halte das Smartphone ruhig."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Bitte registriere dein Gesicht noch einmal."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Gesicht wird nicht mehr erkannt. Erneut versuchen."</string> @@ -970,8 +970,8 @@ <string name="searchview_description_submit" msgid="2688450133297983542">"Anfrage senden"</string> <string name="searchview_description_voice" msgid="2453203695674994440">"Sprachsuche"</string> <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"\"Tippen & Entdecken\" aktivieren?"</string> - <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> fordert die Aktivierung von \"Tippen & Entdecken\" an. Wenn \"Tippen & Entdecken\" aktiviert ist, kannst du Beschreibungen dessen hören oder sehen, was sich unter deinen Fingern befindet, oder Gesten ausführen, um mit dem Tablet zu kommunizieren."</string> - <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> fordert die Aktivierung von \"Tippen & Entdecken\" an. Wenn \"Tippen & Entdecken\" aktiviert ist, kannst du Beschreibungen dessen hören oder sehen, was sich unter deinen Fingern befindet, oder Gesten ausführen, um mit dem Telefon zu kommunizieren."</string> + <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> fordert die Aktivierung von \"Tippen & Entdecken\" an. Wenn \"Tippen & Entdecken\" aktiviert ist, kannst du Beschreibungen dessen hören oder sehen, was sich unter deinen Fingern befindet, oder über Touch-Gesten mit dem Tablet kommunizieren."</string> + <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> fordert die Aktivierung von \"Tippen & Entdecken\" an. Wenn \"Tippen & Entdecken\" aktiviert ist, kannst du Beschreibungen dessen hören oder sehen, was sich unter deinen Fingern befindet, oder über Touch-Gesten mit dem Telefon kommunizieren."</string> <string name="oneMonthDurationPast" msgid="7396384508953779925">"Vor 1 Monat"</string> <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Vor mehr als 1 Monat"</string> <plurals name="last_num_days" formatted="false" msgid="5104533550723932025"> @@ -1669,8 +1669,8 @@ <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> wurde durch die Bedienungshilfenverknüpfung deaktiviert"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="8376923232350078434">"Halten Sie beide Lautstärketasten drei Sekunden lang gedrückt, um <xliff:g id="SERVICE_NAME">%1$s</xliff:g> zu verwenden"</string> <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Wähle den Dienst aus, der verwendet werden soll, wenn du auf die Schaltfläche für die Bedienungshilfen tippst:"</string> - <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Wähle den Dienst aus, der mit der Bewegung für die Bedienungshilfen verwendet werden soll (mit zwei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> - <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Wähle den Dienst aus, der mit der Geste für die Bedienungshilfen verwendet werden soll (mit drei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Wähle den Dienst aus, der mit der Touch-Geste für die Bedienungshilfen verwendet werden soll (mit zwei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Wähle den Dienst aus, der mit der Touch-Geste für die Bedienungshilfen verwendet werden soll (mit drei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Wenn du zwischen den Diensten wechseln möchtest, halte die Schaltfläche für die Bedienungshilfen gedrückt."</string> <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Wenn du zwischen den Diensten wechseln möchtest, wische mit zwei Fingern nach oben und halte sie gedrückt."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Wenn du zwischen den Diensten wechseln möchtest, wische mit drei Fingern nach oben und halte sie gedrückt."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 094bb6aababd..6d1306f4102f 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Μετακινήστε το τηλέφωνο στα αριστερά."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Μετακινήστε το τηλέφωνο στα δεξιά."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Κοιτάξτε απευθείας τη συσκευή σας."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Δεν εντοπίστηκε το πρόσωπό σας. Δείτε το τηλέφωνο."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Στρέψτε το πρόσωπό σάς απευθείας στο τηλέφωνο."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Πάρα πολλή κίνηση. Κρατήστε σταθερό το τηλέφωνο."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Καταχωρίστε ξανά το πρόσωπό σας."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Αδύνατη η αναγνώριση του προσώπου. Επανάληψη."</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 1870fbf291fd..c2a22ad2c466 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index c1989ff7ce57..6cf284320cdb 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 1870fbf291fd..c2a22ad2c466 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 1870fbf291fd..c2a22ad2c466 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 7709cc33a891..f62b3857b930 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognize face. Try again."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 9d95392b1dd7..5128f67bfb2c 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -291,7 +291,7 @@ <string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string> <string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar y ver mensajes SMS"</string> <string name="permgrouprequest_sms" msgid="7168124215838204719">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> envíe y vea SMS?"</string> - <string name="permgrouplab_storage" msgid="1971118770546336966">"Espacio de almacenamiento"</string> + <string name="permgrouplab_storage" msgid="1971118770546336966">"Almacenamiento"</string> <string name="permgroupdesc_storage" msgid="637758554581589203">"acceder a las fotos, el contenido multimedia y los archivos"</string> <string name="permgrouprequest_storage" msgid="7885942926944299560">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a las fotos, el contenido multimedia y los archivos de tu dispositivo?"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Micrófono"</string> @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mueve el teléfono hacia la izquierda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mueve el teléfono hacia la derecha."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira directamente al dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"No se ve tu cara. Mira el teléfono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ubica el rostro directamente frente al teléfono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Te estás moviendo demasiado. No muevas el teléfono"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vuelve a registrar tu cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ya no se reconoce la cara. Vuelve a intentarlo."</string> @@ -601,7 +601,7 @@ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Permite que la aplicación consulte las estadísticas de sincronización de una cuenta, por ejemplo, el historial de eventos sincronizados y la cantidad de datos sincronizados."</string> <string name="permlab_sdcardRead" msgid="1438933556581438863">"ver almacenamiento compartido"</string> <string name="permdesc_sdcardRead" msgid="1804941689051236391">"Ver almacenamiento compartido"</string> - <string name="permlab_sdcardWrite" msgid="9220937740184960897">"Cambia/borra almac. compartido"</string> + <string name="permlab_sdcardWrite" msgid="9220937740184960897">"cambiar o borrar contenido de almacenamiento compartido"</string> <string name="permdesc_sdcardWrite" msgid="2834431057338203959">"Editar almacen. compartido"</string> <string name="permlab_use_sip" msgid="2052499390128979920">"realizar/recibir llamadas SIP"</string> <string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que la aplicación realice y reciba llamadas SIP."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index c10fb57def2f..608a8515bcc3 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mueve el teléfono hacia la izquierda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mueve el teléfono hacia la derecha."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira de forma más directa al dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"No se detecta tu cara. Mira al teléfono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Coloca la cara directamente frente al teléfono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"El teléfono se mueve demasiado. Mantenlo quieto."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vuelve a registrar tu cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No puede reconocer tu cara. Vuelve a intentarlo."</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 0e4045c9db18..a78178c8fbf6 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Liigutage telefoni vasakule."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Liigutage telefoni paremale."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Vaadake otse oma seadmesse."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Teie nägu ei ole näha. Vaadake telefoni poole."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hoidke oma nägu otse telefoni ees."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Liiga palju liikumist. Hoidke telefoni paigal."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registreerige oma nägu uuesti."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nägu ei õnnestu enam tuvastada. Proovige uuesti."</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index f97d4f56b152..fb79545da1ce 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -374,7 +374,7 @@ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta tableta motel daiteke."</string> <string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Beren zati batzuk memorian modu iraunkorrean aktibo uztea baimentzen die aplikazioei. Horrela, beste aplikazioek memoria gutxiago izan lezakete erabilgarri eta telebistak motelago funtziona lezake."</string> <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta telefonoa motel daiteke."</string> - <string name="permlab_foregroundService" msgid="3310786367649133115">"Exekutatu zerbitzuak aurreko planoan"</string> + <string name="permlab_foregroundService" msgid="3310786367649133115">"Abiarazi zerbitzuak aurreko planoan"</string> <string name="permdesc_foregroundService" msgid="6471634326171344622">"Aurreko planoko zerbitzuak erabiltzea baimentzen dio aplikazioari."</string> <string name="permlab_getPackageSize" msgid="7472921768357981986">"neurtu aplikazioen biltegiratzeko tokia"</string> <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Bere kodea, datuak eta cache-tamainak eskuratzeko baimena ematen die aplikazioei."</string> @@ -421,7 +421,7 @@ <string name="permdesc_accessCoarseLocation" product="tv" msgid="3027871910200890806">"Aplikazioa aurreko planoan dagoenean, zure kokapenaren berri izan dezake sareen iturburuak erabilita; adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telebistan, aplikazioak erabil ditzan."</string> <string name="permdesc_accessCoarseLocation" product="default" msgid="854896049371048754">"Aplikazioa aurreko planoan dagoenean, zure kokapenaren berri izan dezake sareen iturburuak erabilita; adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telefonoan, aplikazioak erabil ditzan."</string> <string name="permlab_accessBackgroundLocation" msgid="3965397804300661062">"Atzitu kokapena atzeko planoan"</string> - <string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan exekutatu bitartean atzitu ahalko du aplikazioak kokapena."</string> + <string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan abian den bitartean atzitu ahalko du aplikazioak kokapena."</string> <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"aldatu audio-ezarpenak"</string> <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Audio-ezarpen orokorrak aldatzeko baimena ematen dio; besteak beste, bolumena eta irteerarako zer bozgorailu erabiltzen den."</string> <string name="permlab_recordAudio" msgid="3876049771427466323">"grabatu audioa"</string> @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mugitu telefonoa ezkerretara."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mugitu telefonoa eskuinetara."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Begiratu zuzenago gailuari."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ez da hautematen aurpegia. Begiratu telefonoari."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ipini aurrez aurre aurpegia eta telefonoa."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Mugimendu gehiegi dago. Eutsi tinko telefonoari."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Erregistratu berriro aurpegia."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ez dugu ezagutzen aurpegi hori. Saiatu berriro."</string> @@ -1176,7 +1176,7 @@ <string name="wait" msgid="7147118217226317732">"Itxaron"</string> <string name="webpage_unresponsive" msgid="3272758351138122503">"Orriak ez du erantzuten.\n\nItxi egin nahi duzu?"</string> <string name="launch_warning_title" msgid="1547997780506713581">"Aplikazioa birbideratu da"</string> - <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioa exekutatzen ari da."</string> + <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioa abian da."</string> <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioa lehenago abiarazi da."</string> <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Eskala"</string> <string name="screen_compat_mode_show" msgid="4013878876486655892">"Erakutsi beti"</string> @@ -1202,7 +1202,7 @@ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> prestatzen."</string> <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Aplikazioak abiarazten."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Bertsio-berritzea amaitzen."</string> - <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> exekutatzen"</string> + <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> abian da"</string> <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Sakatu jokora itzultzeko"</string> <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Aukeratu joko bat"</string> <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Funtzionamendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean."</string> @@ -1440,7 +1440,7 @@ <string name="ime_action_next" msgid="3138843904009813834">"Hurrengoa"</string> <string name="ime_action_done" msgid="8971516117910934605">"Eginda"</string> <string name="ime_action_previous" msgid="1443550039250105948">"Atzera"</string> - <string name="ime_action_default" msgid="2840921885558045721">"Exekutatu"</string> + <string name="ime_action_default" msgid="2840921885558045721">"Abiarazi"</string> <string name="dial_number_using" msgid="5789176425167573586">"Markatu zenbakia \n<xliff:g id="NUMBER">%s</xliff:g> erabilita"</string> <string name="create_contact_using" msgid="4947405226788104538">"Sortu kontaktua\n<xliff:g id="NUMBER">%s</xliff:g> erabilita"</string> <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Aplikazio hauetako bat edo gehiago kontua orain eta etorkizunean atzitzeko baimena eskatzen ari dira."</string> @@ -1550,7 +1550,7 @@ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD txartela"</string> <string name="storage_usb_drive" msgid="6261899683292244209">"USB bidezko unitatea"</string> <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> enpresaren USB bidezko unitatea"</string> - <string name="storage_usb" msgid="3017954059538517278">"USB memoria"</string> + <string name="storage_usb" msgid="3017954059538517278">"USB bidezko memoria"</string> <string name="extract_edit_menu_button" msgid="8940478730496610137">"Editatu"</string> <string name="data_usage_warning_title" msgid="6499834033204801605">"Datuen erabileraren abisua"</string> <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> erabili dituzu"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 8ef635198721..f79628756a02 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"تلفن را بهسمت چپ حرکت دهید."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"تلفن را به سمت راست حرکت دهید."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"لطفاً مستقیم به دستگاه نگه کنید."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"چهرهتان دیده نمیشود. به تلفن نگاه کنید."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"صورتتان را مستقیماً روبروی تلفن قرار دهید."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"حرکت خیلی زیاد است. تلفن را ثابت نگهدارید."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"لطفاً چهرهتان را مجدداً ثبت کنید."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"دیگر چهره را تشخیص نمیدهد. دوباره امتحان کنید."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index b1fbcd325754..0b86b22ccb1e 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Siirrä puhelinta vasemmalle."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Siirrä puhelinta oikealle."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Katso suoremmin laitteeseen."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Kasvojasi ei näy. Katso puhelinta."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Aseta kasvosi suoraan puhelimen eteen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Laite liikkui liikaa. Pidä puhelin vakaana."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Rekisteröi kasvot uudelleen."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ei enää tunnista kasvoja. Yritä uudelleen."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index cf535f63aa07..ca9121d470d3 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Déplacez le téléphone vers la gauche."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Déplacez le téléphone vers la droite."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Veuillez regarder plus directement votre appareil."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Visage non détecté. Regardez le téléphone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Placez votre visage directement devant le téléphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Trop de mouvement. Tenez le téléphone immobile."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Veuillez inscrire votre visage à nouveau."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ce visage ne sera plus reconnu. Réessayez."</string> @@ -1585,7 +1585,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Toujours"</string> - <string name="activity_resolver_set_always" msgid="1422574191056490585">"Régler pour toujours ouvrir"</string> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Définir cette activité comme toujours ouverte"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Une seule fois"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Paramètres"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne prend pas en charge le profil professionnel"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 3c3dc29878b6..ab1a928c15ad 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Déplacez le téléphone vers la gauche."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Déplacez le téléphone vers la droite."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Veuillez regarder plus directement l\'appareil."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Visage non détecté. Regardez le téléphone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Placez votre visage en face du téléphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Trop de mouvement. Ne bougez pas le téléphone."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Veuillez enregistrer à nouveau votre visage."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Impossible de reconnaître le visage. Réessayez."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index f9d75c39f257..4c8cc64d7067 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move o teléfono cara á esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move o teléfono cara á dereita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira o dispositivo de forma máis directa."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Non se ve a túa cara. Mira para o teléfono"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Coloca a cara directamente diante do teléfono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Demasiado movemento. Non movas o teléfono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Volve rexistrar a túa cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Xa non se pode recoñecer a cara. Téntao de novo."</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index c58f0adca937..880454a9cd5b 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ફોનને ડાબી બાજુ ખસેડો."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ફોનને જમણી બાજુ ખસેડો."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"કૃપા કરીને તમારા ડિવાઇસ તરફ સીધું જુઓ."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"તમારો ચહેરો દેખાતો નથી. ફોનની સામે જુઓ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"તમારો ચહેરો તમારા ફોનની બિલકુલ સામે રાખો."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ડિવાઇસ અસ્થિર છે. ફોનને સ્થિર રાખો."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ચહેરો ઓળખી શકાતો નથી. ફરી પ્રયાસ કરો."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 5bd95ff20a1e..7dc0b92437e2 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"फ़ोन को बाईं ओर घुमाएं."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"फ़ोन को दाईं ओर घुमाएं."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"कृपया अपने डिवाइस की तरफ़ सीधे देखें."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"आपका चेहरा नहीं दिखाई दे रहा. फ़ोन की तरफ़ देखें."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"अपने चेहरे को फोन के ठीक सामने लाएं."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"डिवाइस बहुत ज़्यादा हिल रहा है. फ़ोन को बिना हिलाएं पकड़ें."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया फिर से अपने चेहरे की पहचान कराएं."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"अब चेहरे की पहचान नहीं कर पा रहा. फिर से कोशिश करें."</string> @@ -783,7 +783,7 @@ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"हमसफ़र"</string> <string name="relationTypeFather" msgid="5228034687082050725">"पिता"</string> <string name="relationTypeFriend" msgid="7313106762483391262">"दोस्त"</string> - <string name="relationTypeManager" msgid="6365677861610137895">"प्रबंधक"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"मैनेजर"</string> <string name="relationTypeMother" msgid="4578571352962758304">"मां"</string> <string name="relationTypeParent" msgid="4755635567562925226">"अभिभावक"</string> <string name="relationTypePartner" msgid="7266490285120262781">"सहयोगी"</string> @@ -903,7 +903,7 @@ <string name="granularity_label_line" msgid="5764267235026120888">"पंक्ति"</string> <string name="factorytest_failed" msgid="5410270329114212041">"फ़ैक्ट्री परीक्षण विफल"</string> <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST का काम केवल /system/app में इंस्टॉल किए गए पैकेज के लिए ही हो सकता है."</string> - <string name="factorytest_no_action" msgid="872991874799998561">"ऐसा कोई पैकेज नहीं मिला था जो FACTORY_TEST कार्रवाई प्रदान करता हो."</string> + <string name="factorytest_no_action" msgid="872991874799998561">"ऐसा कोई पैकेज नहीं मिला था जो FACTORY_TEST कार्रवाई मुहैया करवाता हो."</string> <string name="factorytest_reboot" msgid="6320168203050791643">"रीबूट करें"</string> <string name="js_dialog_title" msgid="1987483977834603872">"\'<xliff:g id="TITLE">%s</xliff:g>\' पर यह पेज दर्शाता है:"</string> <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string> @@ -1084,7 +1084,7 @@ <string name="undo" msgid="7905788502491742328">"वापस लाएं"</string> <string name="redo" msgid="7759464876566803888">"फिर से करें"</string> <string name="autofill" msgid="3035779615680565188">"ऑटोमैटिक भरना"</string> - <string name="textSelectionCABTitle" msgid="5236850394370820357">"लेख चयन"</string> + <string name="textSelectionCABTitle" msgid="5236850394370820357">"टेक्स्ट चुनें"</string> <string name="addToDictionary" msgid="4352161534510057874">"शब्दकोश में जोड़ें"</string> <string name="deleteText" msgid="6979668428458199034">"मिटाएं"</string> <string name="inputMethod" msgid="1653630062304567879">"इनपुट विधि"</string> @@ -1283,7 +1283,7 @@ <item msgid="75483255295529161">"वाई-फ़ाई"</item> <item msgid="6862614801537202646">"ब्लूटूथ"</item> <item msgid="5447331121797802871">"ईथरनेट"</item> - <item msgid="8257233890381651999">"VPN"</item> + <item msgid="8257233890381651999">"वीपीएन"</item> </string-array> <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"अज्ञात नेटवर्क प्रकार"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाई-फ़ाई से कनेक्ट नहीं हो सका"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 29c9286422b8..35853d6ecbea 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -570,7 +570,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pomaknite telefon ulijevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pomaknite telefon udesno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Gledajte izravnije prema uređaju."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Vaše se lice ne vidi. Pogledajte telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Postavite lice izravno ispred telefona."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Previše kretanja. Držite telefon mirno."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrirajte svoje lice."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Lice nije prepoznato. Pokušajte ponovo."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 7559d2417b11..1fbc3fe02105 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mozgassa a telefont balra."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mozgassa a telefont jobbra."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Szemből nézzen az eszközre."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nem látszik az arca. Nézzen a telefonra."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"A telefont közvetlenül az arca elé tegye."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Túl sok a mozgás. Tartsa stabilan a telefont."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Rögzítsen újra képet az arcáról."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Már nem lehet felismerni az arcát. Próbálja újra."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index f484358cafdd..c615356f020d 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -104,7 +104,7 @@ <string name="serviceClassFAX" msgid="5566624998840486475">"Ֆաքս"</string> <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string> <string name="serviceClassDataAsync" msgid="4523454783498551468">"Չհամաժամեցված"</string> - <string name="serviceClassDataSync" msgid="7530000519646054776">"Համաժամել"</string> + <string name="serviceClassDataSync" msgid="7530000519646054776">"Համաժամացնել"</string> <string name="serviceClassPacket" msgid="6991006557993423453">"Փաթեթ"</string> <string name="serviceClassPAD" msgid="3235259085648271037">"Հարթակ"</string> <string name="roamingText0" msgid="7170335472198694945">"Ռոումինգի ցուցիչը միացված է"</string> @@ -169,8 +169,8 @@ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Չհաջողվեց գտնել հարցվող ֆայլը:"</string> <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Չափից շատ հարցումներ են մշակվում: Փորձեք կրկին ավելի ուշ:"</string> <string name="notification_title" msgid="8967710025036163822">"Մուտք գործելու սխալ` <xliff:g id="ACCOUNT">%1$s</xliff:g>-ի համար"</string> - <string name="contentServiceSync" msgid="8353523060269335667">"Համաժամեցնել"</string> - <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Չի հաջողվում համաժամեցնել"</string> + <string name="contentServiceSync" msgid="8353523060269335667">"Համաժամացնել"</string> + <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Չի հաջողվում համաժամացնել"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Հետևյալ ծառայությունից չափազանց շատ տարրեր եք ջնջել՝ <xliff:g id="CONTENT_TYPE">%s</xliff:g>:"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Պլանշետի պահոցը լիքն է: Ջնջեք մի քանի ֆայլ` տարածք ազատելու համար:"</string> <string name="low_memory" product="watch" msgid="4415914910770005166">"Ժամացույցի ֆայլերի պահեստը լիքն է: Ջնջեք որոշ ֆայլեր՝ տարածք ազատելու համար:"</string> @@ -345,7 +345,7 @@ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"կարդալ բջջային զեկուցվող հաղորդագրությունները"</string> <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Թույլ է տալիս հավելվածին կարդալ ձեր սարքի կողմից ստացված բջջային հեռարձակվող հաղորդագրությունները: Բջջային հեռարձակվող զգուշացումները ուղարկվում են որոշ վայրերում` արտակարգ իրավիճակների մասին ձեզ զգուշացնելու համար: Վնասարար հավելվածները կարող են խանգարել ձեր սարքի արդյունավետությանը կամ շահագործմանը, երբ ստացվում է արտակարգ իրավիճակի մասին բջջային հաղորդում:"</string> <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"կարդալ բաժանորդագրված հոսքերը"</string> - <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Թույլ է տալիս հավելվածին մանրամասներ ստանալ ընթացիկ համաժամեցված հոսքերի մասին:"</string> + <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Թույլ է տալիս հավելվածին մանրամասներ ստանալ ընթացիկ համաժամացված հոսքերի մասին:"</string> <string name="permlab_sendSms" msgid="7544599214260982981">"SMS հաղորդագրությունների ուղարկում և ընթերցում"</string> <string name="permdesc_sendSms" msgid="7094729298204937667">"Թույլ է տալիս հավելվածին ուղարկել SMS հաղորդագրություններ: Այն կարող է անսպասելի ծախսերի պատճառ դառնալ: Վնասարար հավելվածները կարող են ձեր հաշվից գումար ծախսել` ուղարկելով հաղորդագրություններ` առանց ձեր հաստատման:"</string> <string name="permlab_readSms" msgid="8745086572213270480">"կարդալ ձեր տեքստային հաղորդագրությունները (SMS կամ MMS)"</string> @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Տեղափոխեք հեռախոսը ձախ:"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Տեղափոխեք հեռախոսը աջ:"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Նայեք ուղիղ էկրանին։"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ձեր դեմքը չի երևում։ Նայեք հեռախոսին։"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Պահեք ձեր դեմքն անմիջապես հեռախոսի էկրանի դիմաց:"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Շատ եք շարժում։ Հեռախոսն անշարժ պահեք։"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Նորից փորձեք։"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Չհաջողվեց ճանաչել դեմքը։ Նորից փորձեք:"</string> @@ -593,12 +593,12 @@ <string-array name="face_error_vendor"> </string-array> <string name="face_icon_content_description" msgid="4024817159806482191">"Դեմքի պատկերակ"</string> - <string name="permlab_readSyncSettings" msgid="6201810008230503052">"կարդալ համաժամեցման կարգավորումները"</string> - <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Թույլ է տալիս հավելվածին կարդալ համաժամեցման կարգավորումները հաշվի համար: Օրինակ` այն կարող է որոշել, արդյոք Մարդիկ հավելվածը համաժամեցված է հաշվի հետ:"</string> - <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"համաժամեցումը փոխարկել միացվածի և անջատվածի"</string> - <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Թույլ է տալիս հավելվածին փոփոխել համաժամեցման կարգավորումները հաշվի համար: Օրինակ, այն կարող է օգտագործվել` միացնելու Մարդիկ հավելվածի համաժամեցումը հաշվի հետ:"</string> - <string name="permlab_readSyncStats" msgid="7396577451360202448">"կարդալ համաժամեցման վիճակագրությունը"</string> - <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Թույլ է տալիս հավելվածին կարդալ հաշվի համաժամեցման վիճակագրությունը, այդ թվում` համաժամեցման իրադարձությունների պատմությունը և թե որքան տվյալ է համաժամեցված:"</string> + <string name="permlab_readSyncSettings" msgid="6201810008230503052">"կարդալ համաժամացման կարգավորումները"</string> + <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Թույլ է տալիս հավելվածին կարդալ համաժամացման կարգավորումները հաշվի համար: Օրինակ` այն կարող է որոշել, արդյոք Մարդիկ հավելվածը համաժամացված է հաշվի հետ:"</string> + <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"համաժամացումը փոխարկել միացվածի և անջատվածի"</string> + <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Թույլ է տալիս հավելվածին փոփոխել համաժամացման կարգավորումները հաշվի համար: Օրինակ, այն կարող է օգտագործվել` միացնելու Մարդիկ հավելվածի համաժամացումը հաշվի հետ:"</string> + <string name="permlab_readSyncStats" msgid="7396577451360202448">"կարդալ համաժամացման վիճակագրությունը"</string> + <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Թույլ է տալիս հավելվածին կարդալ հաշվի համաժամացման վիճակագրությունը, այդ թվում` համաժամացման իրադարձությունների պատմությունը և թե որքան տվյալ է համաժամացված:"</string> <string name="permlab_sdcardRead" msgid="1438933556581438863">"կարդալ ձեր ընդհանուր հիշողության պարունակությունը"</string> <string name="permdesc_sdcardRead" msgid="1804941689051236391">"Հավելվածին թույլ է տալիս կարդալ ձեր ընդհանուր հիշողության պարունակությունը:"</string> <string name="permlab_sdcardWrite" msgid="9220937740184960897">"փոփոխել կամ ջնջել ձեր ընդհանուր հիշողության բովանդակությունը"</string> @@ -1452,7 +1452,7 @@ <string name="forward_intent_to_owner" msgid="1207197447013960896">"Դուք օգտագործում եք այս հավելվածը ձեր աշխատանքային պրոֆիլից դուրս"</string> <string name="forward_intent_to_work" msgid="621480743856004612">"Դուք օգտագործում եք այս հավելվածը ձեր աշխատանքային պրոֆիլում"</string> <string name="input_method_binding_label" msgid="1283557179944992649">"Ներածման եղանակը"</string> - <string name="sync_binding_label" msgid="3687969138375092423">"Համաժամել"</string> + <string name="sync_binding_label" msgid="3687969138375092423">"Համաժամացնել"</string> <string name="accessibility_binding_label" msgid="4148120742096474641">"Մատչելիությունը"</string> <string name="wallpaper_binding_label" msgid="1240087844304687662">"Պաստառ"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Փոխել պաստառը"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 0fa12498f0c7..07671b2c758a 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Gerakkan ponsel ke kiri."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Gerakkan ponsel ke kanan."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Lihat langsung ke perangkat."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Tidak dapat melihat wajah Anda. Lihat ke ponsel."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posisikan wajah Anda langsung di depan ponsel."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Terlalu banyak gerakan. Stabilkan ponsel."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Daftarkan ulang wajah Anda."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Tidak lagi dapat mengenali wajah. Coba lagi."</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 85c3a071ac13..c796dbffe527 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Færðu símann til vinstri."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Færðu símann til hægri."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Horfðu beint á tækið."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Sé ekki andlit þitt. Horfðu á símann."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hafðu andlitið beint fyrir framan símann."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Of mikil hreyfing. Haltu símanum stöðugum."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Skráðu nafnið þitt aftur."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Andlit þekkist ekki lengur. Reyndu aftur."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index f89b3998b9de..45efc5ddf60b 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -324,7 +324,7 @@ <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Consente di toccare, far scorrere, pizzicare ed eseguire altri gesti."</string> <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gesti con sensore di impronte digitali"</string> <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"È in grado di rilevare i gesti compiuti con il sensore di impronte digitali dei dispositivi."</string> - <string name="permlab_statusBar" msgid="7417192629601890791">"disattivare o modificare la barra di stato"</string> + <string name="permlab_statusBar" msgid="7417192629601890791">"disattivazione o modifica della barra di stato"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Consente all\'applicazione di disattivare la barra di stato o di aggiungere e rimuovere icone di sistema."</string> <string name="permlab_statusBarService" msgid="4826835508226139688">"ruolo di barra di stato"</string> <string name="permdesc_statusBarService" msgid="716113660795976060">"Consente di visualizzare l\'applicazione nella barra di stato."</string> @@ -336,7 +336,7 @@ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Consente all\'applicazione di rimuovere le scorciatoie della schermata Home automaticamente."</string> <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"reindirizzamento chiamate in uscita"</string> <string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Consente all\'app di rilevare il numero digitato durante una chiamata in uscita, con la possibilità di reindirizzare la telefonata a un numero diverso o interromperla del tutto."</string> - <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"rispondi a telefonate in arrivo"</string> + <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"risposta a telefonate in arrivo"</string> <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Consente all\'app di rispondere a una telefonata in arrivo."</string> <string name="permlab_receiveSms" msgid="8673471768947895082">"ricezione messaggi di testo (SMS)"</string> <string name="permdesc_receiveSms" msgid="6424387754228766939">"Consente all\'applicazione di ricevere ed elaborare messaggi SMS. Significa che l\'applicazione potrebbe monitorare o eliminare i messaggi inviati al tuo dispositivo senza mostrarteli."</string> @@ -346,7 +346,7 @@ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Consente all\'applicazione di leggere i messaggi cell broadcast ricevuti dal dispositivo. Gli avvisi cell broadcast vengono trasmessi in alcune località per avvertire di eventuali situazioni di emergenza. Le applicazioni dannose potrebbero interferire con il rendimento o con il funzionamento del dispositivo quando si riceve un messaggio cell broadcast di emergenza."</string> <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lettura feed sottoscritti"</string> <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Consente all\'applicazione di ottenere dettagli sui feed attualmente sincronizzati."</string> - <string name="permlab_sendSms" msgid="7544599214260982981">"inviare e visualizzare SMS"</string> + <string name="permlab_sendSms" msgid="7544599214260982981">"invio e visualizzazione di SMS"</string> <string name="permdesc_sendSms" msgid="7094729298204937667">"Consente all\'applicazione di inviare messaggi SMS. Ciò potrebbe comportare costi imprevisti. Applicazioni dannose potrebbero generare dei costi inviando messaggi senza la tua conferma."</string> <string name="permlab_readSms" msgid="8745086572213270480">"lettura messaggi di testo personali (SMS o MMS)"</string> <string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"Questa app può leggere tutti i messaggi di testo (SMS) memorizzati sul tablet."</string> @@ -374,7 +374,7 @@ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Consente all\'applicazione di rendere persistenti in memoria alcune sue parti. Ciò può limitare la memoria disponibile per altre applicazioni, rallentando il tablet."</string> <string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Consente all\'app di rendere alcune sue parti persistenti nella memoria. Potrebbe così essere limitata la memoria a disposizione di altre app ed essere rallentata la TV."</string> <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Consente all\'applicazione di rendere persistenti in memoria alcune sue parti. Ciò può limitare la memoria disponibile per altre applicazioni, rallentando il telefono."</string> - <string name="permlab_foregroundService" msgid="3310786367649133115">"esegui servizio in primo piano"</string> + <string name="permlab_foregroundService" msgid="3310786367649133115">"esecuzione servizio in primo piano"</string> <string name="permdesc_foregroundService" msgid="6471634326171344622">"Consente all\'app di utilizzare i servizi in primo piano."</string> <string name="permlab_getPackageSize" msgid="7472921768357981986">"calcolo spazio di archiviazione applicazioni"</string> <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Consente all\'applicazione di recuperare il suo codice, i suoi dati e le dimensioni della cache"</string> @@ -404,7 +404,7 @@ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Consente all\'applicazione di modificare il registro chiamate del telefono, inclusi i dati sulle chiamate in arrivo e in uscita. Le applicazioni dannose potrebbero farne uso per cancellare o modificare il registro chiamate."</string> <string name="permlab_bodySensors" msgid="4683341291818520277">"accesso ai sensori (come il cardiofrequenzimetro)"</string> <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Consente all\'app di accedere ai dati relativi ai sensori che monitorano le tue condizioni fisiche, ad esempio la frequenza cardiaca."</string> - <string name="permlab_readCalendar" msgid="6716116972752441641">"Leggi eventi di calendario e dettagli"</string> + <string name="permlab_readCalendar" msgid="6716116972752441641">"lettura di eventi di calendario e dettagli"</string> <string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"Questa app può leggere tutti gli eventi di calendario memorizzati sul tablet e condividere o salvare i dati di calendario."</string> <string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"Questa app può leggere tutti gli eventi di calendario memorizzati sulla TV e condividere o salvare i dati di calendario."</string> <string name="permdesc_readCalendar" product="default" msgid="4373978642145196715">"Questa app può leggere tutti gli eventi di calendario memorizzati sul telefono e condividere o salvare i dati di calendario."</string> @@ -414,9 +414,9 @@ <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Questa app può aggiungere, rimuovere o modificare eventi di calendario sul telefono. Può inviare messaggi che possono sembrare inviati dai proprietari del calendario o modificare eventi senza notificare i proprietari."</string> <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accesso a comandi aggiuntivi provider di geolocalizz."</string> <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Consente all\'app di accedere a ulteriori comandi del fornitore di posizione. Ciò potrebbe consentire all\'app di interferire con il funzionamento del GPS o di altre fonti di geolocalizzazione."</string> - <string name="permlab_accessFineLocation" msgid="6265109654698562427">"Accesso alla posizione esatta solo in primo piano"</string> + <string name="permlab_accessFineLocation" msgid="6265109654698562427">"accesso alla posizione esatta solo in primo piano"</string> <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Questa app può recuperare la tua posizione esatta solo quando è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul telefono affinché l\'app possa usarli. Potrebbe aumentare il consumo della batteria."</string> - <string name="permlab_accessCoarseLocation" msgid="3707180371693213469">"Accesso alla posizione approssimativa (in base alla rete) solo in primo piano"</string> + <string name="permlab_accessCoarseLocation" msgid="3707180371693213469">"accesso alla posizione approssimativa (in base alla rete) solo in primo piano"</string> <string name="permdesc_accessCoarseLocation" product="tablet" msgid="8594719010575779120">"Questa app può recuperare la tua posizione tramite fonti di rete quali ripetitori di telefonia mobile e reti Wi-Fi, ma soltanto quando l\'app è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul tablet affinché l\'app possa usarli."</string> <string name="permdesc_accessCoarseLocation" product="tv" msgid="3027871910200890806">"Questa app può recuperare la tua posizione tramite fonti di rete quali ripetitori di telefonia mobile e reti Wi-Fi, ma soltanto quando l\'app è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sulla TV affinché l\'app possa usarli."</string> <string name="permdesc_accessCoarseLocation" product="default" msgid="854896049371048754">"Questa app può recuperare la tua posizione tramite fonti di rete quali ripetitori di telefonia mobile e reti Wi-Fi, ma soltanto quando l\'app è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul telefono affinché l\'app possa usarli."</string> @@ -424,7 +424,7 @@ <string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"Se concedi l\'autorizzazione insieme all\'accesso alla posizione precisa o approssimativa, l\'app potrà accedere alla posizione mentre viene eseguita in background."</string> <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modifica impostazioni audio"</string> <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Consente all\'applicazione di modificare le impostazioni audio globali, come il volume e quale altoparlante viene utilizzato per l\'uscita."</string> - <string name="permlab_recordAudio" msgid="3876049771427466323">"registrare audio"</string> + <string name="permlab_recordAudio" msgid="3876049771427466323">"registrazione audio"</string> <string name="permdesc_recordAudio" msgid="4245930455135321433">"Questa app può registrare audio tramite il microfono in qualsiasi momento."</string> <string name="permlab_sim_communication" msgid="2935852302216852065">"invio di comandi alla SIM"</string> <string name="permdesc_sim_communication" msgid="5725159654279639498">"Consente all\'app di inviare comandi alla SIM. Questo è molto pericoloso."</string> @@ -436,7 +436,7 @@ <string name="permdesc_vibrate" msgid="6284989245902300945">"Consente all\'applicazione di controllare la vibrazione."</string> <string name="permlab_callPhone" msgid="3925836347681847954">"chiamata diretta n. telefono"</string> <string name="permdesc_callPhone" msgid="3740797576113760827">"Consente all\'applicazione di chiamare numeri di telefono senza il tuo intervento. Ciò può comportare chiamate o addebiti imprevisti. Tieni presente che ciò non consente all\'applicazione di chiamare numeri di emergenza. Applicazioni dannose potrebbero generare dei costi effettuando chiamate senza la tua conferma."</string> - <string name="permlab_accessImsCallService" msgid="3574943847181793918">"Accesso al servizio di chiamata IMS"</string> + <string name="permlab_accessImsCallService" msgid="3574943847181793918">"accesso al servizio di chiamata IMS"</string> <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"Consente all\'app di utilizzare il servizio IMS per fare chiamate senza il tuo intervento."</string> <string name="permlab_readPhoneState" msgid="9178228524507610486">"lettura stato e identità telefono"</string> <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Consente all\'applicazione di accedere alle funzioni telefoniche del dispositivo. Questa autorizzazione consente all\'applicazione di determinare il numero di telefono e gli ID dei dispositivi, se una chiamata è attiva e il numero remoto connesso da una chiamata."</string> @@ -444,12 +444,12 @@ <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Consente all\'app di indirizzare le proprie chiamate tramite il sistema al fine di migliorare l\'esperienza di chiamata."</string> <string name="permlab_callCompanionApp" msgid="3599252979411970473">"visualizzazione e controllo delle chiamate tramite il sistema."</string> <string name="permdesc_callCompanionApp" msgid="4567344683275099090">"Consente all\'app di visualizzare e controllare le chiamate in corso sul dispositivo. Sono incluse informazioni quali i numeri e lo stato relativi alle chiamate."</string> - <string name="permlab_acceptHandover" msgid="2661534649736022409">"Continuazione di una chiamata da un\'altra app"</string> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuazione di una chiamata da un\'altra app"</string> <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Consente all\'app di continuare una chiamata che è stata iniziata in un\'altra app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lettura dei numeri di telefono"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Consente all\'app di accedere ai numeri di telefono del dispositivo."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"disattivazione stand-by del tablet"</string> - <string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"divieto di attivazione della modalità di sospensione della TV"</string> + <string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"disattivazione della modalità di sospensione della TV"</string> <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"disattivazione stand-by del telefono"</string> <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Consente all\'applicazione di impedire lo stand-by del tablet."</string> <string name="permdesc_wakeLock" product="tv" msgid="3208534859208996974">"Consente all\'app di impedire l\'attivazione della modalità di sospensione della TV."</string> @@ -482,7 +482,7 @@ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Consente all\'applicazione di visualizzare informazioni sulle reti Wi-Fi, ad esempio di rilevare se il Wi-Fi è abilitato e il nome dei dispositivi Wi-Fi connessi."</string> <string name="permlab_changeWifiState" msgid="6550641188749128035">"connessione e disconnessione dal Wi-Fi"</string> <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Consente all\'applicazione di connettersi/disconnettersi da punti di accesso Wi-Fi e di apportare modifiche alla configurazione del dispositivo per le reti Wi-Fi."</string> - <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"consenti ricezione multicast Wi-Fi"</string> + <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"ricezione multicast Wi-Fi"</string> <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Consente all\'applicazione di ricevere pacchetti inviati a tutti i dispositivi su una rete Wi-Fi utilizzando indirizzi multicast, non solo il tuo tablet. Viene consumata più batteria rispetto alla modalità non multicast."</string> <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"Consente all\'app di ricevere pacchetti inviati a tutti i dispositivi tramite una rete Wi-Fi utilizzando indirizzi multicast, non soltanto la TV. Questa modalità consuma più energia della modalità non multicast."</string> <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Consente all\'applicazione di ricevere pacchetti inviati a tutti i dispositivi su una rete Wi-Fi utilizzando indirizzi multicast, non solo il tuo telefono. Viene consumata più batteria rispetto alla modalità non multicast."</string> @@ -504,21 +504,21 @@ <string name="permdesc_nfc" msgid="7120611819401789907">"Consente all\'applicazione di comunicare con tag, schede e lettori NFC (Near Field Communication)."</string> <string name="permlab_disableKeyguard" msgid="3598496301486439258">"disattivazione blocco schermo"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Consente all\'applicazione di disattivare il blocco tastiera ed eventuali protezioni tramite password associate. Ad esempio, il telefono disattiva il blocco tastiera quando riceve una telefonata in arrivo e lo riattiva al termine della chiamata."</string> - <string name="permlab_requestPasswordComplexity" msgid="202650535669249674">"richiedi complessità del blocco schermo"</string> + <string name="permlab_requestPasswordComplexity" msgid="202650535669249674">"richiesta di complessità del blocco schermo"</string> <string name="permdesc_requestPasswordComplexity" msgid="4730994229754212347">"Consente all\'app di conoscere il livello di complessità del blocco schermo (alto, medio, basso o nessuno), che indica l\'intervallo di caratteri possibile e il tipo di blocco schermo. L\'app può inoltre suggerire agli utenti di aggiornare il blocco schermo a un livello specifico di complessità, ma gli utenti possono ignorare liberamente il suggerimento e uscire. Tieni presente che il blocco schermo non viene memorizzato come testo non crittografato, quindi l\'app non conosce la password esatta."</string> - <string name="permlab_useBiometric" msgid="8837753668509919318">"Utilizzo di hardware biometrico"</string> + <string name="permlab_useBiometric" msgid="8837753668509919318">"utilizzo di hardware biometrico"</string> <string name="permdesc_useBiometric" msgid="8389855232721612926">"Consente all\'app di utilizzare hardware biometrico per eseguire l\'autenticazione"</string> - <string name="permlab_manageFingerprint" msgid="5640858826254575638">"gestisci hardware per il riconoscimento delle impronte digitali"</string> + <string name="permlab_manageFingerprint" msgid="5640858826254575638">"gestione di hardware per il riconoscimento delle impronte digitali"</string> <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Consente all\'app di richiamare metodi per aggiungere e rimuovere modelli di impronte digitali da utilizzare."</string> <string name="permlab_useFingerprint" msgid="3150478619915124905">"utilizzo di hardware per il riconoscimento delle impronte digitali"</string> <string name="permdesc_useFingerprint" msgid="9165097460730684114">"Consente all\'app di utilizzare l\'hardware per il riconoscimento delle impronte digitali per eseguire l\'autenticazione"</string> - <string name="permlab_audioWrite" msgid="2661772059799779292">"Modifica della tua raccolta musicale"</string> + <string name="permlab_audioWrite" msgid="2661772059799779292">"modifica della tua raccolta musicale"</string> <string name="permdesc_audioWrite" msgid="8888544708166230494">"Consente all\'app di modificare la tua raccolta musicale."</string> - <string name="permlab_videoWrite" msgid="128769316366746446">"Modifica della tua raccolta di video"</string> + <string name="permlab_videoWrite" msgid="128769316366746446">"modifica della tua raccolta di video"</string> <string name="permdesc_videoWrite" msgid="5448565757490640841">"Consente all\'app di modificare la tua raccolta di video."</string> - <string name="permlab_imagesWrite" msgid="3391306186247235510">"Modifica della tua raccolta di foto"</string> + <string name="permlab_imagesWrite" msgid="3391306186247235510">"modifica della tua raccolta di foto"</string> <string name="permdesc_imagesWrite" msgid="7073662756617474375">"Consente all\'app di modificare la tua raccolta di foto."</string> - <string name="permlab_mediaLocation" msgid="8675148183726247864">"Lettura delle posizioni dalla tua raccolta multimediale"</string> + <string name="permlab_mediaLocation" msgid="8675148183726247864">"lettura delle posizioni dalla tua raccolta multimediale"</string> <string name="permdesc_mediaLocation" msgid="2237023389178865130">"Consente all\'app di leggere le posizioni dalla tua raccolta multimediale."</string> <string name="biometric_dialog_default_title" msgid="881952973720613213">"Verifica la tua identità"</string> <string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biometrico non disponibile"</string> @@ -550,9 +550,9 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona dell\'impronta digitale"</string> - <string name="permlab_manageFace" msgid="7262837876352591553">"gestisci l\'hardware per Sblocco col sorriso"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gestione dell\'hardware per Sblocco col sorriso"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti."</string> - <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utilizza l\'hardware per Sblocco col sorriso"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utilizzo dell\'hardware per Sblocco col sorriso"</string> <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Consente all\'app di utilizzare hardware per l\'autenticazione con Sblocco col sorriso"</string> <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Sblocco col sorriso"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registra di nuovo il volto"</string> @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Sposta il telefono verso sinistra."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Sposta il telefono verso destra."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Guarda più direttamente verso il dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Impossibile vedere il volto. Guarda il telefono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posiziona il viso davanti al telefono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Troppo movimento. Tieni fermo il telefono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ripeti l\'acquisizione del volto."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Non è più possibile riconoscere il volto. Riprova."</string> @@ -599,21 +599,21 @@ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Consente a un\'applicazione di modificare le impostazioni di sincronizzazione per un account. Ad esempio, può servire per attivare la sincronizzazione dell\'applicazione Persone con un account."</string> <string name="permlab_readSyncStats" msgid="7396577451360202448">"lettura statistiche di sincronizz."</string> <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Consente a un\'applicazione di leggere le statistiche di sincronizzazione per un account, incluse la cronologia degli eventi di sincronizzazione e la quantità di dati sincronizzati."</string> - <string name="permlab_sdcardRead" msgid="1438933556581438863">"leggere i contenuti dell\'archivio condiviso"</string> + <string name="permlab_sdcardRead" msgid="1438933556581438863">"lettura dei contenuti dell\'archivio condiviso"</string> <string name="permdesc_sdcardRead" msgid="1804941689051236391">"Consente all\'app di leggere i contenuti del tuo archivio condiviso."</string> - <string name="permlab_sdcardWrite" msgid="9220937740184960897">"modificare/eliminare i contenuti dell\'archivio condiviso"</string> + <string name="permlab_sdcardWrite" msgid="9220937740184960897">"modifica/eliminazione dei contenuti dell\'archivio condiviso"</string> <string name="permdesc_sdcardWrite" msgid="2834431057338203959">"Consente all\'app di modificare i contenuti del tuo archivio condiviso."</string> - <string name="permlab_use_sip" msgid="2052499390128979920">"fare/ricevere chiamate SIP"</string> + <string name="permlab_use_sip" msgid="2052499390128979920">"invio/ricezione di chiamate SIP"</string> <string name="permdesc_use_sip" msgid="2297804849860225257">"Consente all\'app di effettuare e ricevere chiamate SIP."</string> <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrazione di nuove connessioni SIM di telecomunicazione"</string> <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Consente all\'app di registrare nuove connessioni SIM di telecomunicazione."</string> <string name="permlab_register_call_provider" msgid="108102120289029841">"registrazione di nuove connessioni di telecomunicazione"</string> <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Consente all\'app di registrare nuove connessioni di telecomunicazione."</string> - <string name="permlab_connection_manager" msgid="1116193254522105375">"gestisci connessioni di telecomunicazione"</string> + <string name="permlab_connection_manager" msgid="1116193254522105375">"gestione di connessioni di telecomunicazione"</string> <string name="permdesc_connection_manager" msgid="5925480810356483565">"Consente all\'app di gestire connessioni di telecomunicazione."</string> <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interazione con lo schermo durante una chiamata"</string> <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Consente all\'app di stabilire quando e come l\'utente vede lo schermo durante una chiamata."</string> - <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interagire con i servizi di telefonia"</string> + <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interazione con i servizi di telefonia"</string> <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Consente all\'app di interagire con i servizi di telefonia per effettuare/ricevere chiamate."</string> <string name="permlab_control_incall_experience" msgid="9061024437607777619">"offerta di un\'esperienza utente durante le chiamate"</string> <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Consente all\'app di offrire un\'esperienza utente durante le chiamate."</string> @@ -629,7 +629,7 @@ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Consente al titolare di vincolarsi all\'interfaccia di primo livello di un servizio listener di notifica. Non dovrebbe mai essere necessaria per le normali applicazioni."</string> <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"collegamento a un servizio provider di condizioni"</string> <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Consente al titolare di collegarsi all\'interfaccia di primo livello di un servizio provider di condizioni. Non dovrebbe essere mai necessaria per le normali app."</string> - <string name="permlab_bindDreamService" msgid="4153646965978563462">"associa a servizio dream"</string> + <string name="permlab_bindDreamService" msgid="4153646965978563462">"associazione a servizio dream"</string> <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Consente all\'utente di associare l\'interfaccia di primo livello di un servizio dream. Questa impostazione non è mai necessaria per le app normali."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"richiamo dell\'app di configurazione operatore-provider"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Consente al titolare di richiamare l\'app di configurazione dell\'operatore-provider. Non dovrebbe essere mai necessaria per le normali applicazioni."</string> @@ -645,7 +645,7 @@ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Consente a un\'applicazione di rimuovere certificati DRM. Non dovrebbe mai essere necessaria per le normali applicazioni."</string> <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"associazione a un servizio di messaggi dell\'operatore"</string> <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Consente l\'associazione di un servizio di messaggi dell\'operatore all\'interfaccia principale. Non dovrebbe mai essere necessaria per le normali applicazioni."</string> - <string name="permlab_bindCarrierServices" msgid="3233108656245526783">"Collegamento a servizi dell\'operatore"</string> + <string name="permlab_bindCarrierServices" msgid="3233108656245526783">"associazione a servizi dell\'operatore"</string> <string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"Consente al titolare di collegarsi a servizi dell\'operatore. Non dovrebbe mai essere necessaria per le normali app."</string> <string name="permlab_access_notification_policy" msgid="4247510821662059671">"accesso alla funzione Non disturbare"</string> <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"Consente all\'app di leggere e modificare la configurazione della funzione Non disturbare."</string> @@ -1429,7 +1429,7 @@ <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"Consente a un\'applicazione di richiedere l\'installazione di pacchetti."</string> <string name="permlab_requestDeletePackages" msgid="1703686454657781242">"richiesta di eliminazione dei pacchetti"</string> <string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"Consente a un\'applicazione di richiedere l\'eliminazione di pacchetti."</string> - <string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"chiedi di ignorare le ottimizzazioni della batteria"</string> + <string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"richiesta di ignorare le ottimizzazioni della batteria"</string> <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"Consente a un\'app di chiedere l\'autorizzazione a ignorare le ottimizzazioni della batteria per quell\'app."</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Tocca due volte per il comando dello zoom"</string> <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Aggiunta del widget non riuscita."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 93083084217a..d792b5c6cede 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -573,7 +573,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"צריך להזיז את הטלפון שמאלה."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"צריך להזיז את הטלפון ימינה."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"יש להביט ישירות אל המכשיר."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"אי אפשר לראות את הפנים שלך. צריך להביט אל הטלפון."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"עליך למקם את הפנים ישירות מול הטלפון."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"יותר מדי תנועה. יש להחזיק את הטלפון בצורה יציבה."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"יש לרשום מחדש את הפנים."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"כבר לא ניתן לזהות פנים. יש לנסות שוב."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 8ec80b4d3df6..ebe2fc478395 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"スマートフォンを左に動かしてください。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"スマートフォンを右に動かしてください。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"もっとまっすぐデバイスに顔を向けてください。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"顔を確認できません。スマートフォンを見てください。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"顔をスマートフォンの真正面に向けてください。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"あまり動かさないでください。安定させてください。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"顔を登録し直してください。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"顔を認識できなくなりました。もう一度お試しください。"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index c72ab7f4d683..9404f49f4fc6 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"გადაანაცვლეთ ტელეფონი მარცხნივ."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"გადაანაცვლეთ ტელეფონი მარჯვნივ."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"გთხოვთ, უფრო პირდაპირ შეხედოთ თქვენს მოწყობილობას."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"თქვენი სახე არ ჩანს. შეხედეთ ტელეფონს."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"დაიჭირეთ სახე უშუალოდ ტელეფონის წინ."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"მეტისმეტად მოძრაობთ. მყარად დაიჭირეთ ტელეფონი."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"სახის ამოცნობა ვეღარ ხერხდება. ცადეთ ხელახლა."</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index a192dfd2eae3..c3ea2a909d14 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Телефонды солға жылжытыңыз."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Телефонды оңға жылжытыңыз."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Құрылғының камерасына тура қараңыз."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Бетіңіз көрінбейді. Телефонға қараңыз."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Бетіңізді телефонға тура қаратыңыз."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Қозғалыс тым көп. Телефонды қозғалтпаңыз."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Қайта тіркеліңіз."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Енді бет анықтау мүмкін емес. Әрекетті қайталаңыз."</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 100c4beb74dc..28c097049b41 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ផ្លាស់ទីទូរសព្ទទៅខាងឆ្វេង។"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ផ្លាស់ទីទូរសព្ទទៅខាងស្ដាំ។"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"សូមមើលឱ្យចំឧបករណ៍របស់អ្នកជាងមុន។"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"មើលមិនឃើញមុខរបស់អ្នកទេ។ សូមសម្លឹងមើលទូរសព្ទ។"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"បែរមុខរបស់អ្នកឱ្យចំពីមុខទូរសព្ទផ្ទាល់។"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"មានចលនាខ្លាំងពេក។ សូមកាន់ទូរសព្ទឱ្យនឹង។"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"សូមស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត។"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"មិនអាចសម្គាល់មុខបានទៀតទេ។ សូមព្យាយាមម្ដងទៀត។"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 07493703452a..0331f863cb63 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ಫೋನ್ ಅನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ಫೋನ್ ಅನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಹೆಚ್ಚಿನದ್ದನ್ನು ನೇರವಾಗಿ ನೋಡಿ."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ನಿಮ್ಮ ಮುಖ ಕಾಣಿಸುತ್ತಿಲ್ಲ. ಫೋನ್ ಕಡೆಗೆ ನೋಡಿ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ನಿಮ್ಮ ಮುಖವನ್ನು ಫೋನ್ಗೆ ನೇರವಾಗಿ ಇರಿಸಿ."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ತುಂಬಾ ಅಲುಗಾಡುತ್ತಿದೆ ಫೋನ್ ಅನ್ನು ಸ್ಥಿರವಾಗಿ ಹಿಡಿಯಿರಿ."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ಮುಖ ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 30dfe4100082..c97f740c9da2 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"휴대전화를 왼쪽으로 이동하세요."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"휴대전화를 오른쪽으로 이동하세요."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"기기에서 더 똑바로 바라보세요."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"얼굴이 보이지 않습니다. 휴대전화를 바라보세요."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"휴대전화가 얼굴 정면을 향하도록 두세요."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"너무 많이 움직였습니다. 휴대전화를 흔들리지 않게 잡으세요."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"얼굴을 다시 등록해 주세요."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"더 이상 얼굴을 인식할 수 없습니다. 다시 시도하세요."</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index cb3552b043d6..e86ceb13f3d7 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Телефонду солго жылдырыңыз."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Телефонду оңго жылдырыңыз."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Түзмөгүңүзгө түз караңыз."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Жүзүңүз көрүнбөй жатат. Телефонду караңыз."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Телефонду жүзүңүздүн маңдайында кармаңыз."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Кыймылдап жибердиңиз. Телефонду түз кармаңыз."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Жүзүңүздү кайра таанытыңыз."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Жүз таанылган жок. Кайра аракет кылыңыз."</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index dcbf4f224be0..17b015486e62 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ຍ້າຍໂທລະສັບໄປທາງຊ້າຍ."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ຍ້າຍໂທລະສັບໄປທາງຂວາ."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ກະລຸນາເບິ່ງອຸປະກອນຂອງທ່ານໃຫ້ຊື່ໆ."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ບໍ່ສາມາດເບິ່ງເຫັນໜ້າຂອງທ່ານໄດ້. ກະລຸນາເບິ່ງໂທລະສັບ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ຫັນໜ້າຂອງທ່ານໄປໃສ່ໜ້າໂທລະສັບໂດຍກົງ."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ເຄື່ອນໄຫວຫຼາຍເກີນໄປ. ກະລຸນາຖືໂທລະສັບໄວ້ຊື່ໆ."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ກະລຸນາລົງທະບຽນອຸປະກອນຂອງທ່ານອີກເທື່ອໜຶ່ງ."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ບໍ່ສາມາດຈຳແນກໃບໜ້າໄດ້ອີກຕໍ່ໄປ. ກະລຸນາລອງໃໝ່."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 3984b49e3e9c..caf8e4fce3b3 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -573,7 +573,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pasukite telefoną kairėn."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pasukite telefoną dešinėn."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Žiūrėkite tiesiai į įrenginį."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nematau jūsų veido. Žiūrėkite į telefoną."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Veidas turi būti prieš telefoną."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Įrenginys per daug judinamas. Nejudink. telefono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Užregistruokite veidą iš naujo."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nebegalima atpažinti veido. Bandykite dar kartą."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 93a9cc69ed4c..d71234ce1b66 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -570,7 +570,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pārvietojiet tālruni pa kreisi."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pārvietojiet tālruni pa labi."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Lūdzu, tiešāk skatieties uz savu ierīci."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Jūsu seja nav redzama. Paskatieties uz tālruni."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Novietojiet savu seju tieši pretī tālrunim."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Pārāk daudz kustību. Nekustīgi turiet tālruni."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Lūdzu, atkārtoti reģistrējiet savu seju."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Seju vairs nevar atpazīt. Mēģiniet vēlreiz."</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index a31dac582476..d89fa9c03de0 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Поместете го телефонот налево."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Поместете го телефонот надесно."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Погледнете подиректно во уредот."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Не ви се гледа ликот. Гледајте во телефонот."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Наместете го лицето директно пред телефонот."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Премногу движење. Држете го телефонот стабилно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторно регистрирајте го лицето."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ликот не се препознава. Обидете се повторно."</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 8fe7e40cfa33..819d3f7e93ea 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ഫോൺ ഇടത്തോട്ട് നീക്കുക."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ഫോൺ വലത്തോട്ട് നീക്കുക."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"നിങ്ങളുടെ ഉപകരണത്തിന് നേരെ കൂടുതൽ നന്നായി നോക്കുക."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"നിങ്ങളുടെ മുഖം കാണാനാവുന്നില്ല. ഫോണിലേക്ക് നോക്കൂ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"നിങ്ങളുടെ മുഖം ക്യാമറയ്ക്ക് നേരെയാക്കുക."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"വളരെയധികം ചലനം. ഫോൺ അനക്കാതെ നേരെ പിടിക്കുക."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യുക."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ഇനി മുഖം തിരിച്ചറിയാനാവില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index ff9732ad748e..dd5dc11118b9 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Утсаа зүүн тийш болгоно уу."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Утсаа баруун тийш болгоно уу."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Төхөөрөмж рүүгээ аль болох эгц харна уу."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Таны царайг харахгүй байна. Утас руу харна уу."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Царайгаа утасны урд эгц байрлуулна уу"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Хэт их хөдөлгөөнтэй байна. Утсаа хөдөлгөөнгүй барина уу."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Нүүрээ дахин бүртгүүлнэ үү."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Царайг таних боломжгүй боллоо. Дахин оролдоно уу."</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 2eb50763d7d2..f5cf1f576bab 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"फोन डावीकडे हलवा."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"फोन उजवीकडे हलवा."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"कृपया तुमच्या डिव्हाइसकडे थेट पाहा"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"तुमचा चेहरा दिसत नाही. फोनकडे पहा."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"तुमचा चेहरा थेट फोन समोर आणा."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"खूप हलत आहे. फोन स्थिर धरून ठेवा."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"चेहरा ओळखू शकत नाही. पुन्हा प्रयत्न करा."</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 0161f7cb1cc1..b5f0ef58c634 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Alihkan telefon ke kiri."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Alihkan telefon ke kanan."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Sila lihat terus pada peranti anda."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Gagal mengesan wajah anda. Lihat telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Letakkan wajah anda betul-betul di depan telefon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Terlalu bnyk gerakan. Pegang telefon dgn stabil."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Sila daftarkan semula wajah anda."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Tidak lagi dapat mengecam wajah. Cuba lagi."</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index c2b6c394741b..1387725c50c6 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ဖုန်းကို ဘယ်ဘက်သို့ရွှေ့ပါ။"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ဖုန်းကို ညာဘက်သို့ ရွှေ့ပါ။"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"သင့်စက်ပစ္စည်းကို တည့်တည့်ကြည့်ပါ။"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"သင့်မျက်နှာကို မမြင်ရပါ။ ဖုန်းကိုကြည့်ပါ။"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"မျက်နှာကို ဖုန်းရှေ့တွင် တည့်အောင်ထားပါ။"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"လှုပ်လွန်းသည်။ ဖုန်းကို ငြိမ်ငြိမ်ကိုင်ပါ။"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"သင့်မျက်နှာကို ပြန်စာရင်းသွင်းပါ။"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"မျက်နှာ မမှတ်သားနိုင်တော့ပါ။ ထပ်စမ်းကြည့်ပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 4b1d82a6cf14..3a3a999b7bc2 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Flytt telefonen til venstre."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Flytt telefonen til høyre."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Se mer direkte på enheten din."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Kan ikke se ansiktet ditt. Se på telefonen."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hold ansiktet ditt rett foran telefonen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"For mye bevegelse. Hold telefonen stødig."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrer ansiktet ditt på nytt."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Kan ikke gjenkjenne ansiktet lenger. Prøv igjen."</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index c5df803bfbc9..7b0fbfc890d9 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"फोन बायाँतिर सार्नुहोस्।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"फोन दायाँतिर सार्नुहोस्।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"कृपया अझ सीधा गरी आफ्नो स्क्रिनमा हेर्नुहोस्।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"तपाईंको अनुहार देखिएन। फोनमा हेर्नुहोस्।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"आफ्नो अनुहार फोनको सीधा अगाडि पार्नुहोस्।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"अत्यधिक हल्लियो। फोन स्थिर राख्नुहोस्।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"अब उप्रान्त अनुहार पहिचान गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> @@ -1134,14 +1134,10 @@ <!-- no translation found for whichViewApplicationNamed (2286418824011249620) --> <skip /> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"खोल्नुहोस्"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"निम्नमार्फत <xliff:g id="HOST">%1$s</xliff:g> का लिंकहरू खोल्नुहोस्"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"निम्नमार्फत लिंकहरू खोल्नुहोस्"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> मार्फत लिंकहरू खोल्नुहोस्"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> मार्फत <xliff:g id="HOST">%1$s</xliff:g> का लिंकहरू खोल्नुहोस्"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"पहुँच दिनुहोस्"</string> <string name="whichEditApplication" msgid="144727838241402655">"सँग सम्पादन गर्नुहोस्"</string> <!-- String.format failed for translation --> @@ -1595,8 +1591,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउजर सुरु गर्ने हो?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"कल स्वीकार गर्नुहुन्छ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"सधैँ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"सधैँ खुला राख्ने गरी सेट गर्नुहोस्"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"एक पटक मात्र"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिङहरू"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s कार्य प्रोफाइल समर्थन गर्दैन"</string> @@ -1974,7 +1969,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"तटीय क्षेत्र र नदीछेउका ठाउँहरू छाडी उच्च सतहमा अवस्थित कुनै अझ सुरक्षित ठाउँमा जानुहोस्।"</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"शान्त रहनुहोस् र नजिकै आश्रयस्थल खोज्नुहोस्।"</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"आपतकालीन सन्देशहरूको परीक्षण"</string> - <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"जवाफ दिनुहोस्"</string> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"जवाफ दिनु…"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="5767701075994754356">"SIM मार्फत भ्वाइस कल गर्न मिल्दैन"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM मार्फत भ्वाइस कल गर्ने प्रावधान छैन"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index f7686949d2d0..cadbbfecbec0 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Beweeg je telefoon meer naar links."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Beweeg je telefoon meer naar rechts."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Kijk rechter naar je apparaat."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Je gezicht is niet te zien. Kijk naar de telefoon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Houd je gezicht recht voor de telefoon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Te veel beweging. Houd je telefoon stil."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registreer je gezicht opnieuw."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Herkent gezicht niet meer. Probeer het nog eens."</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 400d7ab12564..176d01c0273a 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ବାମ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ଡାହାଣ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ଦୟାକରି ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ସିଧାସଳଖ ଦେଖନ୍ତୁ।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ଆପଣଙ୍କର ମୁହଁ ଦେଖି ପାରୁନାହିଁ। ଫୋନ୍କୁ ଦେଖନ୍ତୁ।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ଆପଣଙ୍କ ମୁହଁକୁ ଫୋନ୍ ସାମ୍ନାରେ ସିଧାସଳଖ ରଖନ୍ତୁ।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ଅତ୍ୟଧିକ ଅସ୍ଥିର। ଫୋନ୍କୁ ସ୍ଥିର ଭାବେ ଧରନ୍ତୁ।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ଆଉ ମୁହଁ ଚିହ୍ନଟ କରିହେଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 33af22433379..7262dddbc92b 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ਫ਼ੋਨ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਲਿਜਾਓ।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ਫ਼ੋਨ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਲਿਜਾਓ।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ਕਿਰਪਾ ਕਰਕੇ ਸਿੱਧਾ ਆਪਣੇ ਡੀਵਾਈਸ ਵੱਲ ਦੇਖੋ।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ਤੁਹਾਡਾ ਚਿਹਰਾ ਨਹੀਂ ਦਿਸ ਰਿਹਾ। ਫ਼ੋਨ ਵੱਲ ਦੇਖੋ।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ਆਪਣਾ ਚਿਹਰਾ ਫ਼ੋਨ ਦੇ ਬਿਲਕੁਲ ਸਾਹਮਣੇ ਰੱਖੋ।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਹਿਲਜੁਲ। ਫ਼ੋਨ ਨੂੰ ਸਥਿਰ ਰੱਖੋ।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਚਿਹਰਾ ਦੁਬਾਰਾ ਦਰਜ ਕਰੋ।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ਹੁਣ ਚਿਹਰਾ ਪਛਾਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> @@ -1130,14 +1130,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ਨਾਲ ਖੋਲ੍ਹੋ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ਨਾਲ ਖੋਲ੍ਹੋ"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ਖੋਲ੍ਹੋ"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> ਲਿੰਕਾਂ ਨੂੰ ਇਸ ਨਾਲ ਖੋਲ੍ਹੋ"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"ਲਿੰਕਾਂ ਨੂੰ ਇਸ ਨਾਲ ਖੋਲ੍ਹੋ"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"ਲਿੰਕਾਂ ਨੂੰ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਖੋਲ੍ਹੋ"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> ਲਿੰਕਾਂ ਨੂੰ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਖੋਲ੍ਹੋ"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ਪਹੁੰਚ ਦਿਓ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ਇਸ ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ਕੀ ਬ੍ਰਾਊਜ਼ਰ ਲਾਂਚ ਕਰਨਾ ਹੈ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ਕੀ ਕਾਲ ਸਵੀਕਾਰ ਕਰਨੀ ਹੈ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ਹਮੇਸ਼ਾਂ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ਹਮੇਸ਼ਾਂ ਖੁੱਲ੍ਹਾ \'ਤੇ ਸੈੱਟ ਕਰੋ"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ਕੇਵਲ ਇੱਕ ਵਾਰ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ਸੈਟਿੰਗਾਂ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 2162471950cb..962ad514c27b 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -573,7 +573,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Przesuń telefon w lewo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Przesuń telefon w prawo."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Patrz prosto na urządzenie."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nie widzę Twojej twarzy. Spójrz na telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ustaw twarz dokładnie na wprost telefonu."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Telefon się porusza. Trzymaj go nieruchomo."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Zarejestruj swoją twarz ponownie."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nie można już rozpoznać twarzy. Spróbuj ponownie."</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 69b159907374..a5068390066e 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mova o smartphone para a esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mova o smartphone para a direita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Olhe mais diretamente para o dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Não é possível ver o rosto. Olhe para o telefone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Deixe o rosto diretamente na frente do smartphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Muito movimento. Não mova o smartphone."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registre seu rosto novamente."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"O rosto não é mais reconhecido. Tente novamente."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 62b3f32d71d1..26f92c98f0d0 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mova o telemóvel para a esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mova o telemóvel para a direita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Olhe mais diretamente para o dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Não consigo ver o rosto. Olhe para o telemóvel."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posicione o rosto em frente ao telemóvel."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Demasiado movimento. Mantenha o telemóvel firme."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Volte a inscrever o rosto."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Impossível reconhecer o rosto. Tente novamente."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 69b159907374..a5068390066e 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mova o smartphone para a esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mova o smartphone para a direita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Olhe mais diretamente para o dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Não é possível ver o rosto. Olhe para o telefone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Deixe o rosto diretamente na frente do smartphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Muito movimento. Não mova o smartphone."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registre seu rosto novamente."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"O rosto não é mais reconhecido. Tente novamente."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 2738b4980954..b29367f100f6 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -570,7 +570,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mutați telefonul spre stânga."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mutați telefonul spre dreapta."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Priviți mai direct spre dispozitiv."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nu vi se vede fața. Uitați-vă la telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Stați cu capul direct în fața telefonului."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Prea multă mișcare. Țineți telefonul nemișcat."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Reînregistrați-vă chipul."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nu se mai poate recunoaște fața. Încercați din nou."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 53327a8c2fee..b363b33f59a9 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -573,7 +573,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Переместите телефон влево."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Переместите телефон вправо."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Смотрите прямо на устройство."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Вашего лица не видно. Смотрите на телефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Держите телефон прямо перед лицом."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Не перемещайте устройство. Держите его неподвижно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторите попытку."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Не удалось распознать лицо. Повторите попытку."</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index fcacac916107..18a3158815ec 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"දුරකථනය වමට ගෙන යන්න."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"දුරකථනය දකුණට ගෙන යන්න."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ඔබේ උපාංගය වෙත තවත් ඍජුව බලන්න."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ඔබේ මුහුණ දැකිය නොහැක. දුරකථනය වෙත බලන්න."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ඔබේ මුහුණ දුරකථනයට සෘජුවම ඉදිරියෙන් ස්ථානගත කරන්න."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"චලනය ඉතා වැඩියි. දුරකථනය ස්ථිරව අල්ලා සිටින්න."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"තවදුරටත් මුහුණ හඳුනාගත නොහැක. නැවත උත්සාහ කරන්න."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 7c46f81f881e..50b591aa1385 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -573,7 +573,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Posuňte telefón doľava."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Posuňte telefón doprava."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Pozrite sa priamejšie na zariadenie."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nie je vidieť vašu tvár. Pozrite sa na telefón."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Umiestnite svoju tvár priamo pred telefón."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Priveľa pohybu. Nehýbte telefónom."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Znova zaregistrujte svoju tvár."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Tvár už nie je možné rozpoznať. Skúste to znova."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 95dbe8a4c2a6..af26aae6404c 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -573,7 +573,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefon premaknite v levo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefon premaknite v desno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Glejte bolj naravnost v napravo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Obraz ni viden. Poglejte v telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Obraz nastavite naravnost pred telefon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Preveč se premikate. Držite telefon pri miru."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Znova prijavite svoj obraz."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Obraza ni več mogoče prepoznati. Poskusite znova."</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 05c85666132f..fc4fd4fa13b3 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Lëvize telefonin majtas."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Lëvize telefonin djathtas"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Shiko më drejt në pajisjen tënde."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Fytyra jote nuk shfaqet. Shiko te telefoni."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Pozicionoje fytyrën tënde direkt përpara telefonit."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Ka shumë lëvizje. Mbaje telefonin të palëvizur."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Regjistroje përsëri fytyrën tënde."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Fytyra nuk mund të njihet më. Provo përsëri."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index b7c546b77ada..a8dc15e40856 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -570,7 +570,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Померите телефон улево."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Померите телефон удесно."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Гледајте право у уређај."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Не види се лице. Гледајте у телефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Поставите лице директно испред телефона"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Много се померате. Држите телефон мирно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Поново региструјте лице."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Више не може да се препозна лице. Пробајте поново."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 0daf6696d9fc..c728bcc580f2 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Flytta mobilen åt vänster."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Flytta mobilen åt höger."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Titta rakt på enheten."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ansiktet syns inte. Titta på mobilen."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ha ansiktet direkt framför telefonen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"För mycket rörelse. Håll mobilen stilla."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrera ansiktet på nytt."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ansiktet kan inte längre kännas igen. Försök igen."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index aed07c5faa6a..9f18c45a3b2c 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Sogeza simu upande wa kushoto."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Sogeza simu upande wa kulia."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Tafadhali angalia kifaa chako moja kwa moja."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Uso wako hauonekani. Angalia simu."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Weka uso wako moja kwa moja mbele ya simu."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Inatikisika sana. Ishike simu iwe thabiti."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Tafadhali sajili uso wako tena."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Haiwezi tena kutambua uso. Jaribu tena."</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 0089f8400938..5c0156e33291 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"மொபைலை இடப்புறம் நகர்த்தவும்."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"மொபைலை வலப்புறம் நகர்த்தவும்."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"முழுமுகம் தெரியுமாறு நேராகப் பார்க்கவும்."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"முகம் சரியாகத் தெரியவில்லை. மொபைலைப் பார்க்கவும்."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"முகத்தை மொபைலுக்கு நேராக வைக்கவும்."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"அதிகமாக அசைகிறது. மொபைலை அசைக்காமல் பிடிக்கவும்."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"உங்கள் முகத்தை மீண்டும் பதிவுசெய்யுங்கள்."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"முகத்தைக் கண்டறிய இயலவில்லை. மீண்டும் முயலவும்."</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 63115cd34565..6a1f34c95fcb 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ఫోన్ను ఎడమవైపునకు జరపండి."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ఫోన్ను కుడివైపునకు జరపండి."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"దయచేసి మీ పరికరం వైపు మరింత నేరుగా చూడండి."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"మీ ముఖం కనిపించడం లేదు. ఫోన్ వైపు చూడండి."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"మీ ముఖాన్ని ఫోన్కు ఎదురుగా ఉంచండి."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"బాగా కదుపుతున్నారు. ఫోన్ను స్థిరంగా పట్టుకోండి"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"దయచేసి మీ ముఖాన్ని మళ్లీ నమోదు చేయండి."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ఇక ముఖం గుర్తించలేదు. మళ్లీ ప్రయత్నించండి."</string> @@ -1130,14 +1130,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"దీనితో తెరువు"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sతో తెరువు"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"తెరువు"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"దీనితో <xliff:g id="HOST">%1$s</xliff:g> లింక్లను తెరవండి"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"దీనితో లింక్లను తెరవండి"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g>తో లింక్లను తెరవండి"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> లింక్లను <xliff:g id="APPLICATION">%2$s</xliff:g>తో తెరవండి"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"యాక్సెస్ ఇవ్వండి"</string> <string name="whichEditApplication" msgid="144727838241402655">"దీనితో సవరించు"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sతో సవరించు"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"బ్రౌజర్ను ప్రారంభించాలా?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"కాల్ను ఆమోదించాలా?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ఎల్లప్పుడూ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ఎల్లప్పుడూ తెరవడానికి సెట్ చేయి"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ఒకసారి మాత్రమే"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"సెట్టింగ్లు"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s కార్యాలయ ప్రొఫైల్కు మద్దతు ఇవ్వదు"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 3107799ad94d..3132529bea42 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"เลื่อนโทรศัพท์ไปทางซ้าย"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"เลื่อนโทรศัพท์ไปทางขวา"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"โปรดมองตรงมาที่อุปกรณ์"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ไม่เห็นหน้าเลย ลองมองที่โทรศัพท์"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"หันหน้าให้ตรงกับโทรศัพท์"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"มีการเคลื่อนไหวมากเกินไป ถือโทรศัพท์นิ่งๆ"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"โปรดลงทะเบียนใบหน้าอีกครั้ง"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"จำใบหน้าไม่ได้แล้ว ลองอีกครั้ง"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 9cbdcb12277a..a56a12282505 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Igalaw ang telepono pakaliwa."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Igalaw ang telepono pakanan."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Tumingin nang mas direkta sa iyong device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Hindi makita ang mukha mo. Tumingin sa telepono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Itapat ang mukha mo sa mismong harap ng telepono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Masyadong magalaw. Hawakang mabuti ang telepono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Paki-enroll muli ang iyong mukha."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Hindi na makilala ang mukha. Subukang muli."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 77c3758e6318..34b6e5a011d2 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefonu sola hareket ettirin."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefonu sağa hareket ettirin."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Lütfen cihazınıza daha doğrudan bakın."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Yüzünüz görülmüyor. Telefona bakın."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Yüzünüz telefonun tam karşısına gelmelidir."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Çok fazla hareket ediyorsunuz. Telefonu sabit tutun."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Lütfen yüzünüzü yeniden kaydedin."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Yüz artık tanınamıyor. Tekrar deneyin."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 346b085aed03..44058f51663c 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -573,7 +573,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Тримайте телефон лівіше."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Тримайте телефон правіше."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Дивіться просто на пристрій."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Обличчя не видно. Дивіться на телефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Тримайте телефон просто перед обличчям."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Забагато рухів. Тримайте телефон нерухомо."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторно проскануйте обличчя."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Розпізнати обличчя вже не вдається. Повторіть спробу."</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index b28a56c75312..7766c76f3443 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"فون کو بائیں جانب لے جائيں۔"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"فون کو دائیں جانب لے جائیں۔"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"براہ کرم اپنے آلہ کی طرف چہرے کو سیدھا رکھیں۔"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"آپ کا چہرہ دکھائی نہیں دے رہا۔ فون کی طرف دیکھیں۔"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"اپنے چہرے کو براہ راست فون کے سامنے رکھیں۔"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"کافی حرکت ہو رہی ہے۔ فون کو مضبوطی سے پکڑیں۔"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"براہ کرم اپنے چہرے کو دوبارہ مندرج کریں۔"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"اب چہرے کی شناخت نہیں کر سکتے۔ پھر آزمائيں۔"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index cad348276645..ac2c83740b7b 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefonni chapga suring."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefonni oʻngga suring."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Qurilmaga tik qarang."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Yuzingiz koʻrinmayapti. Telefonga qarang."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Telefoningizga yuzingizni tik tuting."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Ortiqcha harakatlanmoqda. Qimirlatmasdan ushlang."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Yuzingizni qaytadan qayd qildiring."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Yuz tanilmadi. Qaytadan urining."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index b3b60a669bee..305dca0ba549 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Đưa điện thoại sang bên trái."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Đưa điện thoại sang bên phải."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Vui lòng nhìn thẳng vào thiết bị."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Hệ thống không phát hiện được khuôn mặt bạn. Hãy nhìn vào điện thoại."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hướng thẳng khuôn mặt về phía trước điện thoại."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Thiết bị di chuyển quá nhiều. Giữ yên thiết bị."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vui lòng đăng ký lại khuôn mặt của bạn."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Không nhận ra khuôn mặt. Hãy thử lại."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index e9707ee31588..85d5cf9c7f95 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"请将手机向左移动。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"请将手机向右移动。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"请直视您的设备。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"看不到您的脸部,请直视手机。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"请将你的面部正对手机。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"摄像头过于晃动。请将手机拿稳。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"请重新注册您的面孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"已无法识别人脸,请重试。"</string> @@ -660,8 +660,8 @@ <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"监控在解锁屏幕时输错密码的次数,并在输错次数过多时锁定平板电脑或清空此用户的所有数据。"</string> <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"监控在解锁屏幕时输错密码的次数,并在输错次数过多时锁定电视或清空此用户的所有数据。"</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"监控在解锁屏幕时输错密码的次数,并在输错次数过多时锁定手机或清空此用户的所有数据。"</string> - <string name="policylab_resetPassword" msgid="4934707632423915395">"更改锁屏密码"</string> - <string name="policydesc_resetPassword" msgid="1278323891710619128">"更改锁屏密码。"</string> + <string name="policylab_resetPassword" msgid="4934707632423915395">"更改锁屏方式"</string> + <string name="policydesc_resetPassword" msgid="1278323891710619128">"更改锁屏方式。"</string> <string name="policylab_forceLock" msgid="2274085384704248431">"锁定屏幕"</string> <string name="policydesc_forceLock" msgid="1141797588403827138">"控制屏幕锁定的方式和时间。"</string> <string name="policylab_wipeData" msgid="3910545446758639713">"清除所有数据"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 6f66d1623cc6..42b790087e1d 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"請將手機向左移。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"請將手機向右移。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"請以更直視的角度看著裝置。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"看不到您的臉。請看著手機。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"將手機對準您的臉孔正面。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"裝置不夠穩定。請拿穩手機。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"請重新註冊臉孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"無法再識別臉孔。請再試一次。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 5afe0aff26fa..da7bc7fc2347 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"請將手機向左移動。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"請將手機向右移動。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"請儘可能直視裝置正面。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"無法偵測你的臉孔,請直視手機。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"將你的臉孔正對手機。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"鏡頭過度晃動,請拿穩手機。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"請重新註冊你的臉孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"已無法辨識臉孔,請再試一次。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 1f37d03b41f8..2af33203bb62 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -567,7 +567,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Hambisa ifoni ngakwesokunxele."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Hambisa ifoni ngakwesokudla."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Sicela ubheke ngokuqondile kakhulu kudivayisi yakho."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ayikwazi ukubona ubuso bakho. Bheka ifoni"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Beka ubuso bakho ngqo phambi kwefoni."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Ukunyakaza okuningi kakhulu. Bamba ifoni iqine."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Sicela uphinde ubhalise ubuso bakho."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ayisakwazi ukubona ubuso. Zama futhi."</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 305c1a6d5657..e44c5f720a97 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4208,4 +4208,8 @@ <!-- Sharesheet: define a max number of targets per application for new shortcuts-based direct share introduced in Q --> <integer name="config_maxShortcutTargetsPerApp">3</integer> + + <!-- The list of packages to automatically opt out of refresh rates higher than 60hz because + of known compatibility issues. --> + <string-array name="config_highRefreshRateBlacklist"></string-array> </resources> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 5363ef920886..039bc4d925a1 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -90,6 +90,24 @@ orientation. If zero, the value of rounded_corner_radius is used. --> <dimen name="rounded_corner_radius_bottom">0dp</dimen> + <!-- Default adjustment for the software rounded corners since corners are not perfectly + round. This value is used when retrieving the "radius" of the rounded corner in cases + where the exact bezier curve cannot be retrieved. This value will be subtracted from + rounded_corner_radius to more accurately provide a "radius" for the rounded corner. --> + <dimen name="rounded_corner_radius_adjustment">0px</dimen> + <!-- Top adjustment for the software rounded corners since corners are not perfectly + round. This value is used when retrieving the "radius" of the top rounded corner in cases + where the exact bezier curve cannot be retrieved. This value will be subtracted from + rounded_corner_radius_top to more accurately provide a "radius" for the top rounded corners. + --> + <dimen name="rounded_corner_radius_top_adjustment">0px</dimen> + <!-- Bottom adjustment for the software rounded corners since corners are not perfectly + round. This value is used when retrieving the "radius" of the bottom rounded corner in + cases where the exact bezier curve cannot be retrieved. This value will be subtracted from + rounded_corner_radius_bottom to more accurately provide a "radius" for the bottom rounded + corners. --> + <dimen name="rounded_corner_radius_bottom_adjustment">0px</dimen> + <!-- Width of the window of the divider bar used to resize docked stacks. --> <dimen name="docked_stack_divider_thickness">48dp</dimen> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6e03f5e8e018..e19d16970506 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3703,6 +3703,9 @@ <java-symbol type="dimen" name="rounded_corner_radius" /> <java-symbol type="dimen" name="rounded_corner_radius_top" /> <java-symbol type="dimen" name="rounded_corner_radius_bottom" /> + <java-symbol type="dimen" name="rounded_corner_radius_adjustment" /> + <java-symbol type="dimen" name="rounded_corner_radius_top_adjustment" /> + <java-symbol type="dimen" name="rounded_corner_radius_bottom_adjustment" /> <java-symbol type="bool" name="config_supportsRoundedCornersOnWindows" /> <java-symbol type="string" name="config_defaultModuleMetadataProvider" /> @@ -3818,4 +3821,10 @@ <java-symbol type="string" name="config_defaultSupervisionProfileOwnerComponent" /> <java-symbol type="bool" name="config_inflateSignalStrength" /> + + <java-symbol type="array" name="config_highRefreshRateBlacklist" /> + + <java-symbol type="drawable" name="android_logotype" /> + <java-symbol type="layout" name="platlogo_layout" /> + </resources> diff --git a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java index d5163e193510..eff4826040f4 100644 --- a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java +++ b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java @@ -64,7 +64,7 @@ public class RedactingFileDescriptorTest { @Test public void testSingleByte() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, - new long[] { 10, 11 }).getFileDescriptor(); + new long[] { 10, 11 }, new long[] {}).getFileDescriptor(); final byte[] buf = new byte[1_000]; assertEquals(buf.length, Os.read(fd, buf, 0, buf.length)); @@ -80,7 +80,7 @@ public class RedactingFileDescriptorTest { @Test public void testRanges() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, - new long[] { 100, 200, 300, 400 }).getFileDescriptor(); + new long[] { 100, 200, 300, 400 }, new long[] {}).getFileDescriptor(); final byte[] buf = new byte[10]; assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 90)); @@ -102,7 +102,7 @@ public class RedactingFileDescriptorTest { @Test public void testEntireFile() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, - new long[] { 0, 5_000_000 }).getFileDescriptor(); + new long[] { 0, 5_000_000 }, new long[] {}).getFileDescriptor(); try (FileInputStream in = new FileInputStream(fd)) { int val; @@ -115,7 +115,7 @@ public class RedactingFileDescriptorTest { @Test public void testReadWrite() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, - new long[] { 100, 200, 300, 400 }).getFileDescriptor(); + new long[] { 100, 200, 300, 400 }, new long[] {}).getFileDescriptor(); // Redacted at first final byte[] buf = new byte[10]; @@ -168,4 +168,76 @@ public class RedactingFileDescriptorTest { assertArrayEquals(new long[] { 100, 200 }, removeRange(new long[] { 100, 200 }, 150, 150)); } + + @Test + public void testFreeAtStart() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 10 }, new long[] {1}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, (byte) 'f', (byte) 'r', (byte) 'e', (byte) 'e', 0, 0, 0, 0, 0 }, + buf); + } + + @Test + public void testFreeAtOffset() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 10 }, new long[] {3}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, 0, 0, (byte) 'f', (byte) 'r', (byte) 'e', (byte) 'e', 0, 0, 0 }, + buf); + } + + @Test + public void testFreeAcrossRedactionStart() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 10 }, new long[] {0}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, (byte) 'r', (byte) 'e', (byte) 'e', 0, 0, 0, 0, 0, 0 }, + buf); + } + + @Test + public void testFreeAcrossRedactionEnd() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 3 }, new long[] {2}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, 0, (byte) 'f', 64, 64, 64, 64, 64, 64, 64 }, + buf); + } + + @Test + public void testFreeOutsideRedaction() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 8 }, new long[] { 8 }).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, 0, 0, 0, 0, 0, 0, 0, 64, 64 }, + buf); + } + + @Test + public void testFreeMultipleRedactions() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 2, 3, 4 }, new long[] { 0 }).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, (byte) 'r', 64, (byte) 'e', 64, 64, 64, 64, 64, 64 }, + buf); + } } diff --git a/packages/EasterEgg/AndroidManifest.xml b/packages/EasterEgg/AndroidManifest.xml index c7dd40d7afdb..7f76a4529963 100644 --- a/packages/EasterEgg/AndroidManifest.xml +++ b/packages/EasterEgg/AndroidManifest.xml @@ -1,40 +1,38 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2018 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.egg" android:versionCode="1" android:versionName="1.0"> - <uses-sdk android:minSdkVersion="28" /> + <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <application - android:icon="@drawable/icon" + android:icon="@drawable/q_icon" android:label="@string/app_name"> + <activity android:name=".quares.QuaresActivity" + android:icon="@drawable/q_icon" + android:label="@string/q_egg_name" + android:theme="@style/QuaresTheme"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.DEFAULT" /> + <!-- <category android:name="android.intent.category.LAUNCHER" /> --> + <category android:name="com.android.internal.category.PLATLOGO" /> + </intent-filter> + </activity> <activity android:name=".paint.PaintActivity" android:configChanges="orientation|keyboardHidden|screenSize|uiMode" - android:label="@string/app_name" + android:icon="@drawable/p_icon" + android:label="@string/p_egg_name" android:theme="@style/AppTheme"> <intent-filter> <action android:name="android.intent.action.MAIN" /> - <category android:name="android.intent.category.DEFAULT" /> - <!--<category android:name="android.intent.category.LAUNCHER" />--> - <category android:name="com.android.internal.category.PLATLOGO" /> + + <!-- <category android:name="android.intent.category.DEFAULT" /> --> + <!-- <category android:name="android.intent.category.LAUNCHER" /> --> + <!-- <category android:name="com.android.internal.category.PLATLOGO" /> --> </intent-filter> </activity> </application> diff --git a/packages/EasterEgg/res/drawable/icon_bg.xml b/packages/EasterEgg/res/drawable/icon_bg.xml index c1553ce50946..659f98be4f43 100644 --- a/packages/EasterEgg/res/drawable/icon_bg.xml +++ b/packages/EasterEgg/res/drawable/icon_bg.xml @@ -15,4 +15,4 @@ limitations under the License. --> <color xmlns:android="http://schemas.android.com/apk/res/android" - android:color="#C5E1A5" />
\ No newline at end of file + android:color="@color/q_clue_text" /> diff --git a/packages/EasterEgg/res/drawable/icon.xml b/packages/EasterEgg/res/drawable/p_icon.xml index 2306b7b554c5..2306b7b554c5 100644 --- a/packages/EasterEgg/res/drawable/icon.xml +++ b/packages/EasterEgg/res/drawable/p_icon.xml diff --git a/packages/EasterEgg/res/drawable/pixel_bg.xml b/packages/EasterEgg/res/drawable/pixel_bg.xml new file mode 100644 index 000000000000..4d4a113cce53 --- /dev/null +++ b/packages/EasterEgg/res/drawable/pixel_bg.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android" + android:exitFadeDuration="100"> + <item android:state_pressed="true"> + <shape><solid android:color="@color/red"/></shape> + </item> + <item android:state_checked="true"> + <shape><solid android:color="@color/pixel_on"/></shape> + </item> + <item> + <shape><solid android:color="@color/pixel_off"/></shape> + </item> +</selector>
\ No newline at end of file diff --git a/packages/EasterEgg/res/drawable/q.xml b/packages/EasterEgg/res/drawable/q.xml new file mode 100644 index 000000000000..75baa47e3aa6 --- /dev/null +++ b/packages/EasterEgg/res/drawable/q.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="@color/q_icon_fg" + android:pathData="M19.45,22.89l-10.250001,-10.249999l-2.6599998,2.6599998l-1.77,-1.7600002l4.43,-4.4300003l12.0199995,12.0199995l-1.7699986,1.7600002z"/> + <path + android:fillColor="@color/q_icon_fg" + android:pathData="M12,6a6,6 0,1 1,-6 6,6 6,0 0,1 6,-6m0,-2.5A8.5,8.5 0,1 0,20.5 12,8.51 8.51,0 0,0 12,3.5Z"/> +</vector> diff --git a/packages/EasterEgg/res/drawable/q_icon.xml b/packages/EasterEgg/res/drawable/q_icon.xml new file mode 100644 index 000000000000..ef4b0a362043 --- /dev/null +++ b/packages/EasterEgg/res/drawable/q_icon.xml @@ -0,0 +1,19 @@ +<!-- + 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. +--> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/icon_bg"/> + <foreground android:drawable="@drawable/q_smaller"/> +</adaptive-icon> diff --git a/packages/EasterEgg/res/drawable/q_smaller.xml b/packages/EasterEgg/res/drawable/q_smaller.xml new file mode 100644 index 000000000000..c71dff094235 --- /dev/null +++ b/packages/EasterEgg/res/drawable/q_smaller.xml @@ -0,0 +1,23 @@ +<!-- +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. +--> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:insetBottom="5dp" + android:insetLeft="5dp" + android:insetRight="5dp" + android:insetTop="5dp" + android:drawable="@drawable/q" /> diff --git a/packages/EasterEgg/res/layout/activity_quares.xml b/packages/EasterEgg/res/layout/activity_quares.xml new file mode 100644 index 000000000000..dcc90f6f77ae --- /dev/null +++ b/packages/EasterEgg/res/layout/activity_quares.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:animateLayoutChanges="true" + tools:context="com.android.egg.quares.QuaresActivity"> + + <GridLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:alignmentMode="alignBounds" + android:id="@+id/grid" + /> + + <Button + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/label" + android:layout_gravity="center_horizontal|bottom" + android:gravity="center" + android:textSize="18dp" + android:visibility="gone" + android:drawablePadding="8dp" + android:padding="12dp" + android:backgroundTint="@color/q_clue_bg_correct" + android:textColor="@color/q_clue_text" + android:layout_marginBottom="48dp" + android:elevation="30dp" + /> +</FrameLayout> diff --git a/packages/EasterEgg/res/values-night/q_colors.xml b/packages/EasterEgg/res/values-night/q_colors.xml new file mode 100644 index 000000000000..191bd944b7dc --- /dev/null +++ b/packages/EasterEgg/res/values-night/q_colors.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <color name="pixel_off">#000000</color> + <color name="pixel_on">#FFFFFF</color> + + <color name="q_clue_bg">@color/navy</color> + <color name="q_clue_text">@color/tan</color> +</resources>
\ No newline at end of file diff --git a/packages/EasterEgg/res/values/q_colors.xml b/packages/EasterEgg/res/values/q_colors.xml new file mode 100644 index 000000000000..5e92c84fd97d --- /dev/null +++ b/packages/EasterEgg/res/values/q_colors.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <color name="emerald">#3ddc84</color> + <color name="red">#f8c734</color> + <color name="navy">#073042</color> + <color name="vapor">#d7effe</color> + <color name="tan">#eff7cf</color> + + <color name="pixel_off">#FFFFFF</color> + <color name="pixel_on">#000000</color> + + <color name="q_clue_bg">@color/tan</color> + <color name="q_clue_text">@color/navy</color> + <color name="q_clue_bg_correct">@color/emerald</color> + + <color name="q_icon_fg">@color/emerald</color> +</resources> diff --git a/packages/EasterEgg/res/values/q_puzzles.xml b/packages/EasterEgg/res/values/q_puzzles.xml new file mode 100644 index 000000000000..7c2eff152ffe --- /dev/null +++ b/packages/EasterEgg/res/values/q_puzzles.xml @@ -0,0 +1,214 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string-array name="puzzles"> + + <item>q</item> + <item>q</item> + <item>q</item> + <item>q</item> + <item>q</item> + + <item>android:drawable/ic_info</item> + + <item>android:drawable/stat_sys_adb</item> + <item>android:drawable/stat_sys_battery</item> + <item>android:drawable/stat_sys_phone_call</item> + <item>android:drawable/stat_sys_certificate_info</item> + <item>android:drawable/stat_sys_data_bluetooth</item> + <item>android:drawable/stat_sys_data_usb</item> + <item>android:drawable/stat_sys_download</item> + <item>android:drawable/stat_sys_gps_on</item> + <item>android:drawable/stat_sys_phone_call</item> + <item>android:drawable/stat_sys_tether_wifi</item> + <item>android:drawable/stat_sys_throttled</item> + <item>android:drawable/stat_sys_upload</item> + + <item>android:drawable/stat_notify_car_mode</item> + <item>android:drawable/stat_notify_chat</item> + <item>android:drawable/stat_notify_disk_full</item> + <item>android:drawable/stat_notify_email_generic</item> + <item>android:drawable/stat_notify_error</item> + <item>android:drawable/stat_notify_gmail</item> + <item>android:drawable/stat_notify_missed_call</item> + <item>android:drawable/stat_notify_mmcc_indication_icn</item> + <item>android:drawable/stat_notify_more</item> + <item>android:drawable/stat_notify_rssi_in_range</item> + <item>android:drawable/stat_notify_sdcard</item> + <item>android:drawable/stat_notify_sdcard_prepare</item> + <item>android:drawable/stat_notify_sdcard_usb</item> + <item>android:drawable/stat_notify_sim_toolkit</item> + <item>android:drawable/stat_notify_sync</item> + <item>android:drawable/stat_notify_sync_anim0</item> + <item>android:drawable/stat_notify_sync_error</item> + <item>android:drawable/stat_notify_voicemail</item> + + <item>android:drawable/ic_audio_alarm</item> + <item>android:drawable/ic_audio_alarm_mute</item> + <item>android:drawable/ic_bluetooth_share_icon</item> + <item>android:drawable/ic_bt_headphones_a2dp</item> + <item>android:drawable/ic_bt_headset_hfp</item> + <item>android:drawable/ic_bt_hearing_aid</item> + <item>android:drawable/ic_bt_laptop</item> + <item>android:drawable/ic_bt_misc_hid</item> + <item>android:drawable/ic_bt_network_pan</item> + <item>android:drawable/ic_bt_pointing_hid</item> + <item>android:drawable/ic_corp_badge</item> + <item>android:drawable/ic_expand_more</item> + <item>android:drawable/ic_faster_emergency</item> + <item>android:drawable/ic_file_copy</item> + <item>android:drawable/ic_info_outline_24</item> + <item>android:drawable/ic_lock</item> + <item>android:drawable/ic_lock_bugreport</item> + <item>android:drawable/ic_lock_open</item> + <item>android:drawable/ic_lock_power_off</item> + <item>android:drawable/ic_lockscreen_ime</item> + <item>android:drawable/ic_mode_edit</item> + <item>android:drawable/ic_phone</item> + <item>android:drawable/ic_qs_airplane</item> + <item>android:drawable/ic_qs_auto_rotate</item> + <item>android:drawable/ic_qs_battery_saver</item> + <item>android:drawable/ic_qs_bluetooth</item> + <item>android:drawable/ic_qs_dnd</item> + <item>android:drawable/ic_qs_flashlight</item> + <item>android:drawable/ic_qs_night_display_on</item> + <item>android:drawable/ic_restart</item> + <item>android:drawable/ic_screenshot</item> + <item>android:drawable/ic_settings_bluetooth</item> + <item>android:drawable/ic_signal_cellular_0_4_bar</item> + <item>android:drawable/ic_signal_cellular_0_5_bar</item> + <item>android:drawable/ic_signal_cellular_1_4_bar</item> + <item>android:drawable/ic_signal_cellular_1_5_bar</item> + <item>android:drawable/ic_signal_cellular_2_4_bar</item> + <item>android:drawable/ic_signal_cellular_2_5_bar</item> + <item>android:drawable/ic_signal_cellular_3_4_bar</item> + <item>android:drawable/ic_signal_cellular_3_5_bar</item> + <item>android:drawable/ic_signal_cellular_4_4_bar</item> + <item>android:drawable/ic_signal_cellular_4_5_bar</item> + <item>android:drawable/ic_signal_cellular_5_5_bar</item> + <item>android:drawable/ic_signal_location</item> + <item>android:drawable/ic_wifi_signal_0</item> + <item>android:drawable/ic_wifi_signal_1</item> + <item>android:drawable/ic_wifi_signal_2</item> + <item>android:drawable/ic_wifi_signal_3</item> + <item>android:drawable/ic_wifi_signal_4</item> + <item>android:drawable/perm_group_activity_recognition</item> + <item>android:drawable/perm_group_calendar</item> + <item>android:drawable/perm_group_call_log</item> + <item>android:drawable/perm_group_camera</item> + <item>android:drawable/perm_group_contacts</item> + <item>android:drawable/perm_group_location</item> + <item>android:drawable/perm_group_microphone</item> + <item>android:drawable/perm_group_phone_calls</item> + <item>android:drawable/perm_group_sensors</item> + <item>android:drawable/perm_group_sms</item> + <item>android:drawable/perm_group_storage</item> + <item>android:drawable/perm_group_visual</item> + + <item>com.android.settings:drawable/ic_add_24dp</item> + <item>com.android.settings:drawable/ic_airplanemode_active</item> + <item>com.android.settings:drawable/ic_android</item> + <item>com.android.settings:drawable/ic_apps</item> + <item>com.android.settings:drawable/ic_arrow_back</item> + <item>com.android.settings:drawable/ic_arrow_down_24dp</item> + <item>com.android.settings:drawable/ic_battery_charging_full</item> + <item>com.android.settings:drawable/ic_battery_status_bad_24dp</item> + <item>com.android.settings:drawable/ic_battery_status_good_24dp</item> + <item>com.android.settings:drawable/ic_battery_status_maybe_24dp</item> + <item>com.android.settings:drawable/ic_call_24dp</item> + <item>com.android.settings:drawable/ic_cancel</item> + <item>com.android.settings:drawable/ic_cast_24dp</item> + <item>com.android.settings:drawable/ic_chevron_right_24dp</item> + <item>com.android.settings:drawable/ic_data_saver</item> + <item>com.android.settings:drawable/ic_delete</item> + <item>com.android.settings:drawable/ic_devices_other</item> + <item>com.android.settings:drawable/ic_devices_other_opaque_black</item> + <item>com.android.settings:drawable/ic_do_not_disturb_on_24dp</item> + <item>com.android.settings:drawable/ic_eject_24dp</item> + <item>com.android.settings:drawable/ic_expand_less</item> + <item>com.android.settings:drawable/ic_expand_more_inverse</item> + <item>com.android.settings:drawable/ic_folder_vd_theme_24</item> + <item>com.android.settings:drawable/ic_friction_lock_closed</item> + <item>com.android.settings:drawable/ic_gray_scale_24dp</item> + <item>com.android.settings:drawable/ic_headset_24dp</item> + <item>com.android.settings:drawable/ic_help</item> + <item>com.android.settings:drawable/ic_local_movies</item> + <item>com.android.settings:drawable/ic_lock</item> + <item>com.android.settings:drawable/ic_media_stream</item> + <item>com.android.settings:drawable/ic_network_cell</item> + <item>com.android.settings:drawable/ic_notifications</item> + <item>com.android.settings:drawable/ic_notifications_off_24dp</item> + <item>com.android.settings:drawable/ic_phone_info</item> + <item>com.android.settings:drawable/ic_photo_library</item> + <item>com.android.settings:drawable/ic_settings_accessibility</item> + <item>com.android.settings:drawable/ic_settings_accounts</item> + <item>com.android.settings:drawable/ic_settings_backup</item> + <item>com.android.settings:drawable/ic_settings_battery_white</item> + <item>com.android.settings:drawable/ic_settings_data_usage</item> + <item>com.android.settings:drawable/ic_settings_date_time</item> + <item>com.android.settings:drawable/ic_settings_delete</item> + <item>com.android.settings:drawable/ic_settings_display_white</item> + <item>com.android.settings:drawable/ic_settings_home</item> + <item>com.android.settings:drawable/ic_settings_location</item> + <item>com.android.settings:drawable/ic_settings_night_display</item> + <item>com.android.settings:drawable/ic_settings_open</item> + <item>com.android.settings:drawable/ic_settings_print</item> + <item>com.android.settings:drawable/ic_settings_privacy</item> + <item>com.android.settings:drawable/ic_settings_security_white</item> + <item>com.android.settings:drawable/ic_settings_sim</item> + <item>com.android.settings:drawable/ic_settings_wireless</item> + <item>com.android.settings:drawable/ic_storage</item> + <item>com.android.settings:drawable/ic_storage_white</item> + <item>com.android.settings:drawable/ic_suggestion_night_display</item> + <item>com.android.settings:drawable/ic_sync</item> + <item>com.android.settings:drawable/ic_system_update</item> + <item>com.android.settings:drawable/ic_videogame_vd_theme_24</item> + <item>com.android.settings:drawable/ic_volume_ringer_vibrate</item> + <item>com.android.settings:drawable/ic_volume_up_24dp</item> + <item>com.android.settings:drawable/ic_vpn_key</item> + <item>com.android.settings:drawable/ic_wifi_tethering</item> + + <item>com.android.systemui:drawable/ic_alarm</item> + <item>com.android.systemui:drawable/ic_alarm_dim</item> + <item>com.android.systemui:drawable/ic_arrow_back</item> + <item>com.android.systemui:drawable/ic_bluetooth_connected</item> + <item>com.android.systemui:drawable/ic_brightness_thumb</item> + <item>com.android.systemui:drawable/ic_camera</item> + <item>com.android.systemui:drawable/ic_cast</item> + <item>com.android.systemui:drawable/ic_cast_connected</item> + <item>com.android.systemui:drawable/ic_cast_connected_fill</item> + <item>com.android.systemui:drawable/ic_close_white</item> + <item>com.android.systemui:drawable/ic_data_saver</item> + <item>com.android.systemui:drawable/ic_data_saver_off</item> + <item>com.android.systemui:drawable/ic_drag_handle</item> + <item>com.android.systemui:drawable/ic_headset</item> + <item>com.android.systemui:drawable/ic_headset_mic</item> + <item>com.android.systemui:drawable/ic_hotspot</item> + <item>com.android.systemui:drawable/ic_invert_colors</item> + <item>com.android.systemui:drawable/ic_location</item> + <item>com.android.systemui:drawable/ic_lockscreen_ime</item> + <item>com.android.systemui:drawable/ic_notifications_alert</item> + <item>com.android.systemui:drawable/ic_notifications_silence</item> + <item>com.android.systemui:drawable/ic_power_low</item> + <item>com.android.systemui:drawable/ic_power_saver</item> + <item>com.android.systemui:drawable/ic_qs_bluetooth_connecting</item> + <item>com.android.systemui:drawable/ic_qs_bluetooth_on</item> + <item>com.android.systemui:drawable/ic_qs_cancel</item> + <item>com.android.systemui:drawable/ic_qs_no_sim</item> + <item>com.android.systemui:drawable/ic_screenshot_delete</item> + <item>com.android.systemui:drawable/ic_settings</item> + <item>com.android.systemui:drawable/ic_swap_vert</item> + <item>com.android.systemui:drawable/ic_volume_alarm</item> + <item>com.android.systemui:drawable/ic_volume_alarm_mute</item> + <item>com.android.systemui:drawable/ic_volume_media</item> + <item>com.android.systemui:drawable/ic_volume_media_mute</item> + <item>com.android.systemui:drawable/ic_volume_ringer</item> + <item>com.android.systemui:drawable/ic_volume_ringer_mute</item> + <item>com.android.systemui:drawable/ic_volume_ringer_vibrate</item> + <item>com.android.systemui:drawable/ic_volume_voice</item> + <item>com.android.systemui:drawable/stat_sys_camera</item> + <item>com.android.systemui:drawable/stat_sys_managed_profile_status</item> + <item>com.android.systemui:drawable/stat_sys_mic_none</item> + <item>com.android.systemui:drawable/stat_sys_vpn_ic</item> + + </string-array> +</resources> diff --git a/packages/EasterEgg/res/values/strings.xml b/packages/EasterEgg/res/values/strings.xml index 32dbc97a00fb..b95ec6be4c84 100644 --- a/packages/EasterEgg/res/values/strings.xml +++ b/packages/EasterEgg/res/values/strings.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2018 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,5 +14,11 @@ Copyright (C) 2018 The Android Open Source Project limitations under the License. --> <resources xmlns:android="http://schemas.android.com/apk/res/android"> - <string name="app_name" translatable="false">PAINT.APK</string> + <string name="app_name" translatable="false">Android Q Easter Egg</string> + + <!-- name of the Q easter egg, a nonogram-style icon puzzle --> + <string name="q_egg_name" translatable="false">Icon Quiz</string> + + <!-- name of the P easter egg, a humble paint program --> + <string name="p_egg_name" translatable="false">PAINT.APK</string> </resources> diff --git a/packages/EasterEgg/res/values/styles.xml b/packages/EasterEgg/res/values/styles.xml index 44e2ce52aab8..e576526f49b7 100644 --- a/packages/EasterEgg/res/values/styles.xml +++ b/packages/EasterEgg/res/values/styles.xml @@ -20,4 +20,16 @@ <item name="android:windowLightNavigationBar">true</item> </style> + <style name="QuaresTheme" parent="@android:style/Theme.DeviceDefault.DayNight"> + <item name="android:windowIsTranslucent">true</item> + <item name="android:windowBackground">@android:color/transparent</item> + <item name="android:colorBackgroundCacheHint">@null</item> + <item name="android:windowShowWallpaper">true</item> + <item name="android:windowContentOverlay">@null</item> + <item name="android:windowNoTitle">true</item> + <item name="android:windowFullscreen">true</item> + <item name="android:statusBarColor">@android:color/transparent</item> + <item name="android:navigationBarColor">@android:color/transparent</item> + </style> + </resources> diff --git a/packages/EasterEgg/src/com/android/egg/quares/Quare.kt b/packages/EasterEgg/src/com/android/egg/quares/Quare.kt new file mode 100644 index 000000000000..eb77362a0be2 --- /dev/null +++ b/packages/EasterEgg/src/com/android/egg/quares/Quare.kt @@ -0,0 +1,168 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.egg.quares + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.drawable.Drawable +import android.graphics.drawable.Icon +import android.os.Parcel +import android.os.Parcelable +import java.util.ArrayList +import kotlin.math.abs +import kotlin.math.round + +class Quare(val width: Int, val height: Int, val depth: Int) : Parcelable { + private val data: IntArray = IntArray(width * height) + private val user: IntArray = data.copyOf() + + private fun loadAndQuantize(bitmap8bpp: Bitmap) { + bitmap8bpp.getPixels(data, 0, width, 0, 0, width, height) + if (depth == 8) return + val s = (255f / depth) + for (i in 0 until data.size) { + var f = (data[i] ushr 24).toFloat() / s + // f = f.pow(0.75f) // gamma adjust for bolder lines + f *= 1.25f // brightness adjust for bolder lines + f.coerceAtMost(1f) + data[i] = (round(f) * s).toInt() shl 24 + } + } + + fun isBlank(): Boolean { + return data.sum() == 0 + } + + fun load(drawable: Drawable) { + val resized = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8) + val canvas = Canvas(resized) + drawable.setBounds(0, 0, width, height) + drawable.setTint(0xFF000000.toInt()) + drawable.draw(canvas) + loadAndQuantize(resized) + resized.recycle() + } + + fun load(context: Context, icon: Icon) { + icon.loadDrawable(context)?.let { + load(it) + } + } + + fun bitmap(): Bitmap { + return Bitmap.createBitmap(data, width, height, Bitmap.Config.ALPHA_8) + } + + fun getUserMark(x: Int, y: Int): Int { + return user[y * width + x] ushr 24 + } + + fun setUserMark(x: Int, y: Int, v: Int) { + user[y * width + x] = v shl 24 + } + + fun getDataAt(x: Int, y: Int): Int { + return data[y * width + x] ushr 24 + } + + fun check(): Boolean { + return data.contentEquals(user) + } + + fun check(xSel: Int, ySel: Int): Boolean { + val xStart = if (xSel < 0) 0 else xSel + val xEnd = if (xSel < 0) width - 1 else xSel + val yStart = if (ySel < 0) 0 else ySel + val yEnd = if (ySel < 0) height - 1 else ySel + for (y in yStart..yEnd) + for (x in xStart..xEnd) + if (getDataAt(x, y) != getUserMark(x, y)) return false + return true + } + + fun errors(): IntArray { + return IntArray(width * height) { + abs(data[it] - user[it]) + } + } + + fun getRowClue(y: Int): IntArray { + return getClue(-1, y) + } + fun getColumnClue(x: Int): IntArray { + return getClue(x, -1) + } + fun getClue(xSel: Int, ySel: Int): IntArray { + val arr = ArrayList<Int>() + var len = 0 + val xStart = if (xSel < 0) 0 else xSel + val xEnd = if (xSel < 0) width - 1 else xSel + val yStart = if (ySel < 0) 0 else ySel + val yEnd = if (ySel < 0) height - 1 else ySel + for (y in yStart..yEnd) + for (x in xStart..xEnd) + if (getDataAt(x, y) != 0) { + len++ + } else if (len > 0) { + arr.add(len) + len = 0 + } + if (len > 0) arr.add(len) + else if (arr.size == 0) arr.add(0) + return arr.toIntArray() + } + + fun resetUserMarks() { + user.forEachIndexed { index, _ -> user[index] = 0 } + } + + // Parcelable interface + + override fun describeContents(): Int { + return 0 + } + + override fun writeToParcel(p: Parcel?, flags: Int) { + p?.let { + p.writeInt(width) + p.writeInt(height) + p.writeInt(depth) + p.writeIntArray(data) + p.writeIntArray(user) + } + } + + companion object CREATOR : Parcelable.Creator<Quare> { + override fun createFromParcel(p: Parcel?): Quare { + return p!!.let { + Quare( + p.readInt(), // width + p.readInt(), // height + p.readInt() // depth + ).also { + p.readIntArray(it.data) + p.readIntArray(it.user) + } + } + } + + override fun newArray(size: Int): Array<Quare?> { + return arrayOfNulls(size) + } + } +} diff --git a/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt b/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt new file mode 100644 index 000000000000..ce439a9a663c --- /dev/null +++ b/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt @@ -0,0 +1,312 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.egg.quares + +import android.app.Activity +import android.content.Context +import android.content.res.Configuration +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Typeface +import android.graphics.drawable.Icon +import android.os.Bundle +import android.text.StaticLayout +import android.text.TextPaint +import android.util.Log +import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE +import android.widget.Button +import android.widget.CompoundButton +import android.widget.GridLayout + +import java.util.Random + +import com.android.egg.R + +const val TAG = "Quares" + +class QuaresActivity : Activity() { + private var q: Quare = Quare(16, 16, 1) + private var resId = 0 + private var resName = "" + private var icon: Icon? = null + + private lateinit var label: Button + private lateinit var grid: GridLayout + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE + + actionBar?.hide() + + setContentView(R.layout.activity_quares) + + grid = findViewById(R.id.grid) + label = findViewById(R.id.label) + + if (savedInstanceState != null) { + Log.v(TAG, "restoring puzzle from state") + q = savedInstanceState.getParcelable("q") ?: q + resId = savedInstanceState.getInt("resId") + resName = savedInstanceState.getString("resName", "") + loadPuzzle() + } + + label.setOnClickListener { newPuzzle() } + } + + override fun onResume() { + super.onResume() + if (resId == 0) { + // lazy init from onCreate + newPuzzle() + } + checkVictory() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + + outState.putParcelable("q", q) + outState.putInt("resId", resId) + outState.putString("resName", resName) + } + + fun newPuzzle() { + Log.v(TAG, "new puzzle...") + + q.resetUserMarks() + val oldResId = resId + resId = android.R.drawable.stat_sys_warning + try { + for (tries in 0..3) { + val ar = resources.obtainTypedArray(R.array.puzzles) + val newName = ar.getString(Random().nextInt(ar.length())) + if (newName == null) continue + + Log.v(TAG, "Looking for icon " + newName) + + val pkg = getPackageNameForResourceName(newName) + val newId = packageManager.getResourcesForApplication(pkg) + .getIdentifier(newName, "drawable", pkg) + if (newId == 0) { + Log.v(TAG, "oops, " + newName + " doesn't resolve from pkg " + pkg) + } else if (newId != oldResId) { + // got a good one + resId = newId + resName = newName + break + } + } + } catch (e: RuntimeException) { + Log.v(TAG, "problem loading puzzle, using fallback", e) + } + loadPuzzle() + } + + fun getPackageNameForResourceName(name: String): String { + return if (name.contains(":") && !name.startsWith("android:")) { + name.substring(0, name.indexOf(":")) + } else { + packageName + } + } + + fun checkVictory() { + if (q.check()) { + val dp = resources.displayMetrics.density + + val label: Button = findViewById(R.id.label) + label.text = resName.replace(Regex("^.*/"), "") + val drawable = icon?.loadDrawable(this)?.also { + it.setBounds(0, 0, (32 * dp).toInt(), (32 * dp).toInt()) + it.setTint(label.currentTextColor) + } + label.setCompoundDrawables(drawable, null, null, null) + + label.visibility = VISIBLE + } else { + label.visibility = GONE + } + } + + fun loadPuzzle() { + Log.v(TAG, "loading " + resName + " at " + q.width + "x" + q.height) + + val dp = resources.displayMetrics.density + + icon = Icon.createWithResource(getPackageNameForResourceName(resName), resId) + q.load(this, icon!!) + + if (q.isBlank()) { + // this is a really boring puzzle, let's try again + resId = 0 + resName = "" + recreate() + return + } + + grid.removeAllViews() + grid.columnCount = q.width + 1 + grid.rowCount = q.height + 1 + + label.visibility = GONE + + val orientation = resources.configuration.orientation + + // clean this up a bit + val minSide = resources.configuration.smallestScreenWidthDp - 25 // ish + val size = (minSide / (q.height + 0.5) * dp).toInt() + + val sb = StringBuffer() + + for (j in 0 until grid.rowCount) { + for (i in 0 until grid.columnCount) { + val tv: View + val params = GridLayout.LayoutParams().also { + it.width = size + it.height = size + it.setMargins(1, 1, 1, 1) + it.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, GridLayout.TOP) // UGH + } + val x = i - 1 + val y = j - 1 + if (i > 0 && j > 0) { + if (i == 1 && j > 1) sb.append("\n") + sb.append(if (q.getDataAt(x, y) == 0) " " else "X") + tv = PixelButton(this) + tv.isChecked = q.getUserMark(x, y) != 0 + tv.setOnClickListener { + q.setUserMark(x, y, if (tv.isChecked) 0xFF else 0) + val columnCorrect = (grid.getChildAt(i) as? ClueView)?.check(q) ?: false + val rowCorrect = (grid.getChildAt(j*(grid.columnCount)) as? ClueView) + ?.check(q) ?: false + if (columnCorrect && rowCorrect) { + checkVictory() + } else { + label.visibility = GONE + } + } + } else if (i == j) { // 0,0 + tv = View(this) + tv.visibility = GONE + } else { + tv = ClueView(this) + if (j == 0) { + tv.textRotation = 90f + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + params.height /= 2 + tv.showText = false + } else { + params.height = (96 * dp).toInt() + } + if (x >= 0) { + tv.setColumn(q, x) + } + } + if (i == 0) { + if (orientation == Configuration.ORIENTATION_PORTRAIT) { + params.width /= 2 + tv.showText = false + } else { + params.width = (96 * dp).toInt() + } + if (y >= 0) { + tv.setRow(q, y) + } + } + } + grid.addView(tv, params) + } + } + + Log.v(TAG, "icon: \n" + sb) + } +} + +class PixelButton(context: Context) : CompoundButton(context) { + init { + setBackgroundResource(R.drawable.pixel_bg) + isClickable = true + isEnabled = true + } +} + +class ClueView(context: Context) : View(context) { + var row: Int = -1 + var column: Int = -1 + var textRotation: Float = 0f + var text: CharSequence = "" + var showText = true + val paint: TextPaint + val incorrectColor: Int + val correctColor: Int + + init { + setBackgroundColor(0) + paint = TextPaint().also { + it.textSize = 14f * context.resources.displayMetrics.density + it.color = context.getColor(R.color.q_clue_text) + it.typeface = Typeface.DEFAULT_BOLD + it.textAlign = Paint.Align.CENTER + } + incorrectColor = context.getColor(R.color.q_clue_bg) + correctColor = context.getColor(R.color.q_clue_bg_correct) + } + + fun setRow(q: Quare, row: Int): Boolean { + this.row = row + this.column = -1 + this.textRotation = 0f + text = q.getRowClue(row).joinToString("-") + return check(q) + } + fun setColumn(q: Quare, column: Int): Boolean { + this.column = column + this.row = -1 + this.textRotation = 90f + text = q.getColumnClue(column).joinToString("-") + return check(q) + } + fun check(q: Quare): Boolean { + val correct = q.check(column, row) + setBackgroundColor(if (correct) correctColor else incorrectColor) + return correct + } + + override fun onDraw(canvas: Canvas?) { + super.onDraw(canvas) + if (!showText) return + canvas?.let { + val x = canvas.width / 2f + val y = canvas.height / 2f + var textWidth = canvas.width + if (textRotation != 0f) { + canvas.rotate(textRotation, x, y) + textWidth = canvas.height + } + val textLayout = StaticLayout.Builder.obtain( + text, 0, text.length, paint, textWidth).build() + canvas.translate(x, y - textLayout.height / 2) + textLayout.draw(canvas) + } + } +} diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 57f5d5a5f614..63463b1b31f1 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -408,7 +408,7 @@ <string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Not charging"</string> - <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge right now"</string> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge at the moment"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Full"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlled by admin"</string> <string name="disabled" msgid="9206776641295849915">"Disabled"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 57f5d5a5f614..63463b1b31f1 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -408,7 +408,7 @@ <string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Not charging"</string> - <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge right now"</string> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge at the moment"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Full"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlled by admin"</string> <string name="disabled" msgid="9206776641295849915">"Disabled"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 57f5d5a5f614..63463b1b31f1 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -408,7 +408,7 @@ <string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Not charging"</string> - <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge right now"</string> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge at the moment"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Full"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlled by admin"</string> <string name="disabled" msgid="9206776641295849915">"Disabled"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 57f5d5a5f614..63463b1b31f1 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -408,7 +408,7 @@ <string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Not charging"</string> - <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge right now"</string> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge at the moment"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Full"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlled by admin"</string> <string name="disabled" msgid="9206776641295849915">"Disabled"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 798ea3c80cb0..7fe1ef9213ed 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -293,8 +293,8 @@ <string name="strict_mode_summary" msgid="142834318897332338">"Kedipkan layar saat apl beroperasi lama pada utas utama"</string> <string name="pointer_location" msgid="6084434787496938001">"Lokasi penunjuk"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Hamparan layar menampilkan data sentuhan saat ini"</string> - <string name="show_touches" msgid="2642976305235070316">"Tampilkan tap"</string> - <string name="show_touches_summary" msgid="6101183132903926324">"Tampilkan masukan visual untuk tap"</string> + <string name="show_touches" msgid="2642976305235070316">"Tampilkan ketukan"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Tampilkan masukan untuk ketukan"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Lihat pembaruan permukaan"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Sorot seluruh permukaan jendela saat diperbarui"</string> <string name="show_hw_screen_updates" msgid="4117270979975470789">"Tampilkan update tampilan"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 4b38383545e5..7a054bbec646 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -307,7 +307,7 @@ <string name="simulate_color_space" msgid="6745847141353345872">"Simulo hapësirën e ngjyrës"</string> <string name="enable_opengl_traces_title" msgid="6790444011053219871">"Aktivizo gjurmët e OpenGL-së"</string> <string name="usb_audio_disable_routing" msgid="8114498436003102671">"Çaktivizo rrugëzuezin e audios përmes USB-së"</string> - <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"Çaktivizo rrugëzuesin automatik për te kufjet ose altoparlantët"</string> + <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"Çaktivizo router-in automatik për te kufjet ose altoparlantët"</string> <string name="debug_layout" msgid="5981361776594526155">"Shfaq konturet e kuadrit"</string> <string name="debug_layout_summary" msgid="2001775315258637682">"Shfaq konturet e klipit, hapësirat etj."</string> <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Detyro drejtimin e shkrimit nga e djathta në të majtë"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java index 7f906f6c5b06..6d874ab2be9b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java @@ -117,7 +117,7 @@ public class HidProfile implements LocalBluetoothProfile { public boolean isPreferred(BluetoothDevice device) { if (mService == null) return false; - return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF; + return mService.getPriority(device) != BluetoothProfile.PRIORITY_OFF; } public int getPreferred(BluetoothDevice device) { diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java index de38e8a366b4..23e2949372aa 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java @@ -18,15 +18,11 @@ package com.android.settingslib.net; import android.content.Context; import android.net.NetworkTemplate; -import android.os.ParcelUuid; -import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; -import java.util.ArrayList; -import java.util.List; - +import com.android.internal.util.ArrayUtils; /** * Utils class for data usage */ @@ -41,31 +37,22 @@ public class DataUsageUtils { TelephonyManager.class); final SubscriptionManager subscriptionManager = context.getSystemService( SubscriptionManager.class); - final SubscriptionInfo info = subscriptionManager.getActiveSubscriptionInfo(subId); final NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll( telephonyManager.getSubscriberId(subId)); - if (info == null) { + if (!subscriptionManager.isActiveSubId(subId)) { Log.i(TAG, "Subscription is not active: " + subId); return mobileAll; } - final ParcelUuid groupUuid = info.getGroupUuid(); - if (groupUuid == null) { - Log.i(TAG, "Subscription doesn't have valid group uuid: " + subId); + + final String[] mergedSubscriberIds = telephonyManager.createForSubscriptionId(subId) + .getMergedSubscriberIdsFromGroup(); + + if (ArrayUtils.isEmpty(mergedSubscriberIds)) { + Log.i(TAG, "mergedSubscriberIds is null."); return mobileAll; } - // Otherwise merge other subscriberId to create new NetworkTemplate - final List<SubscriptionInfo> groupInfos = subscriptionManager.getSubscriptionsInGroup( - groupUuid); - final List<String> mergedSubscriberIds = new ArrayList<>(); - for (SubscriptionInfo subInfo : groupInfos) { - final String subscriberId = telephonyManager.getSubscriberId( - subInfo.getSubscriptionId()); - if (subscriberId != null) { - mergedSubscriberIds.add(subscriberId); - } - } - return NetworkTemplate.normalize(mobileAll, mergedSubscriberIds.toArray(new String[0])); + return NetworkTemplate.normalize(mobileAll, mergedSubscriberIds); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java index dc33cfe4b2f8..5cae6116a59c 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java @@ -18,6 +18,7 @@ package com.android.settingslib.net; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -37,7 +38,6 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) @@ -70,18 +70,13 @@ public class DataUsageUtilsTest { when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); when(mTelephonyManager.getSubscriberId(SUB_ID)).thenReturn(SUBSCRIBER_ID); when(mTelephonyManager.getSubscriberId(SUB_ID_2)).thenReturn(SUBSCRIBER_ID_2); - when(mInfo1.getSubscriptionId()).thenReturn(SUB_ID); - when(mInfo2.getSubscriptionId()).thenReturn(SUB_ID_2); - - mInfos = new ArrayList<>(); - mInfos.add(mInfo1); - mInfos.add(mInfo2); - when(mSubscriptionManager.getSubscriptionsInGroup(mParcelUuid)).thenReturn(mInfos); + when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); + when(mSubscriptionManager.isActiveSubId(anyInt())).thenReturn(true); } @Test public void getMobileTemplate_infoNull_returnMobileAll() { - when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(null); + when(mSubscriptionManager.isActiveSubId(SUB_ID)).thenReturn(false); final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); @@ -92,6 +87,8 @@ public class DataUsageUtilsTest { public void getMobileTemplate_groupUuidNull_returnMobileAll() { when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1); when(mInfo1.getGroupUuid()).thenReturn(null); + when(mTelephonyManager.getMergedSubscriberIdsFromGroup()) + .thenReturn(new String[] {SUBSCRIBER_ID}); final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); @@ -102,6 +99,8 @@ public class DataUsageUtilsTest { public void getMobileTemplate_groupUuidExist_returnMobileMerged() { when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1); when(mInfo1.getGroupUuid()).thenReturn(mParcelUuid); + when(mTelephonyManager.getMergedSubscriberIdsFromGroup()) + .thenReturn(new String[] {SUBSCRIBER_ID, SUBSCRIBER_ID_2}); final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index b23824e3f8ef..8547bc87a5d3 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="3171996292755059205">"Zaključavanje tastature"</string> <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"Upišite PIN"</string> - <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Upišite PUK kôd za SIM karticu i novi PIN"</string> + <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"Upišite PUK za SIM i novi PIN kôd"</string> <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"PUK kôd za SIM karticu"</string> <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"Novi PIN za SIM karticu"</string> <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"Dodirnite da upišete lozinku"</font></string> @@ -54,7 +54,7 @@ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"Prostor za PIN"</string> <string name="keyguard_accessibility_password" msgid="7695303207740941101">"Lozinka uređaja"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"Prostor za PIN za SIM karticu"</string> - <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Prostor za PUK kôd za SIM karticu"</string> + <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"Prostor za PUK za SIM"</string> <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Naredni alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogući eSIM karticu"</string> @@ -116,7 +116,7 @@ <item quantity="other">PUK kôd za SIM karticu je netačan. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva.</item> </plurals> <string name="kg_password_pin_failed" msgid="8769990811451236223">"Korištenje PIN-a za SIM karticu nije uspjelo!"</string> - <string name="kg_password_puk_failed" msgid="1331621440873439974">"Korištenje PUK koda za SIM karticu nije uspjelo!"</string> + <string name="kg_password_puk_failed" msgid="1331621440873439974">"Korištenje PUK-a za SIM nije uspjelo!"</string> <string name="kg_pin_accepted" msgid="7637293533973802143">"Kôd je prihvaćen"</string> <string name="keyguard_carrier_default" msgid="4274828292998453695">"Nema mreže."</string> <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Promjena načina unosa"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 7f85ec0dee6e..3d297aee1cc2 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -464,7 +464,7 @@ <string name="battery_saver_notification_title" msgid="8614079794522291840">"تم تفعيل ميزة توفير شحن البطارية"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"لخفض مستوى الأداء وبيانات الخلفية"</string> <string name="battery_saver_notification_action_text" msgid="132118784269455533">"إيقاف ميزة توفير شحن البطارية"</string> - <string name="media_projection_dialog_text" msgid="8585357687598538511">"أثناء التسجيل أو الإرسال، يمكن لتطبيق <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> تسجيل أي معلومات حساسة يتم عرضها على الشاشة أو تشغيلها من جهازك، بما فيها المعلومات الحساسة مثل الصوت الذي تشغّله وكلمات المرور ومعلومات الدفع والصور والرسائل."</string> + <string name="media_projection_dialog_text" msgid="8585357687598538511">"أثناء التسجيل أو البث، يمكن لتطبيق <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> تسجيل أي معلومات حسّاسة يتم عرضها على الشاشة أو تشغيلها من جهازك، بما فيها المعلومات الحسّاسة مثل المقاطع الصوتية وكلمات المرور ومعلومات الدفع والصور والرسائل."</string> <string name="media_projection_dialog_service_text" msgid="3075544489835858258">"أثناء التسجيل أو الإرسال، يمكن للخدمة التي تقدّم هذه الوظيفة تسجيل أي معلومات حساسة يتم عرضها على الشاشة أو تشغيلها من جهازك، بما فيها المعلومات الحساسة مثل الصوت الذي تشغّله وكلمات المرور ومعلومات الدفع والصور والرسائل."</string> <string name="media_projection_dialog_title" msgid="8124184308671641248">"عرض معلومات حسّاسة أثناء الإرسال/التسجيل"</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"عدم الإظهار مرة أخرى"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index a8c684c8ae7d..bf7dd0bc1676 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -779,7 +779,7 @@ <string name="drag_to_add_tiles" msgid="230586591689084925">"টাইল যোগ করতে ধরে থেকে টেনে আনুন"</string> <string name="drag_to_rearrange_tiles" msgid="4566074720193667473">"টাইলগুলি আবার সাজানোর জন্য ধরে থেকে টেনে আনুন"</string> <string name="drag_to_remove_tiles" msgid="3361212377437088062">"সরানোর জন্য এখানে টেনে আনুন"</string> - <string name="drag_to_remove_disabled" msgid="2390968976638993382">"অন্তত ৬টি টাইল রাখতে হবে"</string> + <string name="drag_to_remove_disabled" msgid="4785920129548299268">"আপনাকে কমপক্ষে <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g>টি টাইল রাখতে হবে"</string> <string name="qs_edit" msgid="2232596095725105230">"সম্পাদনা করুন"</string> <string name="tuner_time" msgid="6572217313285536011">"সময়"</string> <string-array name="clock_options"> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index a5f998914cec..7b2d7936d5ef 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -871,7 +871,7 @@ <string name="notification_channel_storage" msgid="3077205683020695313">"Memoria"</string> <string name="notification_channel_hints" msgid="7323870212489152689">"Aholkuak"</string> <string name="instant_apps" msgid="6647570248119804907">"Zuzeneko aplikazioak"</string> - <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> exekutatzen ari da"</string> + <string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> abian da"</string> <string name="instant_apps_message" msgid="1183313016396018086">"Ezer instalatu gabe ireki da aplikazioa."</string> <string name="instant_apps_message_with_help" msgid="6179830437630729747">"Ezer instalatu gabe ireki da aplikazioa. Sakatu informazio gehiago lortzeko."</string> <string name="app_info" msgid="6856026610594615344">"Aplikazioari buruzko informazioa"</string> @@ -888,7 +888,7 @@ <string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> arte"</string> <string name="qs_dnd_keep" msgid="1825009164681928736">"Utzi bere horretan"</string> <string name="qs_dnd_replace" msgid="8019520786644276623">"Ordeztu"</string> - <string name="running_foreground_services_title" msgid="381024150898615683">"Aplikazioak exekutatzen ari dira atzeko planoan"</string> + <string name="running_foreground_services_title" msgid="381024150898615683">"Aplikazioak abian dira atzeko planoan"</string> <string name="running_foreground_services_msg" msgid="6326247670075574355">"Sakatu bateria eta datuen erabilerari buruzko xehetasunak ikusteko"</string> <string name="mobile_data_disable_title" msgid="1068272097382942231">"Datu-konexioa desaktibatu nahi duzu?"</string> <string name="mobile_data_disable_message" msgid="4756541658791493506">"<xliff:g id="CARRIER">%s</xliff:g> erabilita ezingo dituzu erabili datuak edo Internet. Wifi-sare baten bidez soilik konektatu ahal izango zara Internetera."</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index ef29f9bfd0a4..263fe8a31a9a 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -484,7 +484,7 @@ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"डिवाइस प्रबंधन"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"प्रोफ़ाइल को मॉनीटर करना"</string> <string name="monitoring_title" msgid="169206259253048106">"नेटवर्क को मॉनीटर करना"</string> - <string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string> + <string name="monitoring_subtitle_vpn" msgid="876537538087857300">"वीपीएन"</string> <string name="monitoring_subtitle_network_logging" msgid="3341264304793193386">"नेटवर्क लॉगिंग"</string> <string name="monitoring_subtitle_ca_certificate" msgid="3874151893894355988">"CA प्रमाणपत्र"</string> <string name="disable_vpn" msgid="4435534311510272506">"VPN अक्षम करें"</string> @@ -513,7 +513,7 @@ <string name="monitoring_description_network_logging" msgid="7223505523384076027">"आपके एडमिन ने नेटवर्क लॉग करना चालू कर दिया है, जो आपके डिवाइस पर ट्रैफ़िक की निगरानी करता है.\n\nज़्यादा जानकारी के लिए अपने एडमिन से संपर्क करें."</string> <string name="monitoring_description_vpn" msgid="4445150119515393526">"आपने किसी ऐप को VPN कनेक्शन सेट करने की अनुमति दी है.\n\nयह ऐप ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित आपके डिवाइस और नेटवर्क की गतिविधि की निगरानी कर सकता है."</string> <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> आपकी वर्क प्रोफ़ाइल को प्रबंधित करता है.\n\n आपका एडमिन ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nऔर जानकारी के लिए अपने एडमिन से संपर्क करें.\n\nआप ऐसे VPN से भी कनेक्ट हैं, जो आपकी नेटवर्क गतिविधि की निगरानी कर सकता है."</string> - <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"वीपीएन"</string> <string name="monitoring_description_app" msgid="1828472472674709532">"आप <xliff:g id="APPLICATION">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"आप <xliff:g id="APPLICATION">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी व्यक्तिगत नेटवर्क गतिविधि की निगरानी कर सकता है."</string> <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"आप <xliff:g id="APPLICATION">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइट सहित आपकी व्यक्तिगत नेटवर्क गतिविधि को मॉनिटर कर सकता है."</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 6d614b1e3f45..3156a6f6fda2 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -130,7 +130,7 @@ <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Դեմքի ճանաչում…"</string> <string name="accessibility_face_dialog_face_icon" msgid="2658119009870383490">"Դեմքի պատկերակ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Համատեղելիության խոշորացման կոճակը:"</string> - <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Դիտափոխել փոքրից ավելի մեծ էկրան:"</string> + <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Մասշտաբը մեծացնել փոքրից ավելի մեծ էկրան:"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-ը միացված է:"</string> <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth-ն անջատված է:"</string> <string name="accessibility_no_battery" msgid="358343022352820946">"Մարտկոց չկա:"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index cb77ac438b4d..70ebfd8ee60c 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -779,7 +779,7 @@ <string name="drag_to_add_tiles" msgid="230586591689084925">"टाइलहरू थप्न होल्ड गरी ड्र्याग गर्नुहोस्"</string> <string name="drag_to_rearrange_tiles" msgid="4566074720193667473">"टाइलहरू पुनः क्रमबद्ध गर्न होल्ड गरी ड्र्याग गर्नुहोस्"</string> <string name="drag_to_remove_tiles" msgid="3361212377437088062">"हटाउनका लागि यहाँ तान्नुहोस्"</string> - <string name="drag_to_remove_disabled" msgid="2390968976638993382">"तपाईंलाई कम्तीमा ६ वटा टाइलहरू चाहिन्छ"</string> + <string name="drag_to_remove_disabled" msgid="4785920129548299268">"तपाईंलाई कम्तीमा <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> वटा टाइल चाहिन्छ"</string> <string name="qs_edit" msgid="2232596095725105230">"सम्पादन गर्नुहोस्"</string> <string name="tuner_time" msgid="6572217313285536011">"समय"</string> <string-array name="clock_options"> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 34f5235b8a52..64e2d098c598 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -779,7 +779,7 @@ <string name="drag_to_add_tiles" msgid="230586591689084925">"ਟਾਇਲਾਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਫੜ੍ਹ ਕੇ ਰੱਖੋ ਅਤੇ ਘਸੀਟੋ"</string> <string name="drag_to_rearrange_tiles" msgid="4566074720193667473">"ਟਾਇਲਾਂ ਨੂੰ ਮੁੜ-ਵਿਵਸਥਿਤ ਕਰਨ ਲਈ ਫੜ੍ਹ ਕੇ ਘਸੀਟੋ"</string> <string name="drag_to_remove_tiles" msgid="3361212377437088062">"ਹਟਾਉਣ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string> - <string name="drag_to_remove_disabled" msgid="2390968976638993382">"ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ 6 ਟਾਇਲਾਂ ਦੀ ਲੋੜ ਪਵੇਗੀ"</string> + <string name="drag_to_remove_disabled" msgid="4785920129548299268">"ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> ਟਾਇਲਾਂ ਦੀ ਲੋੜ ਪਵੇਗੀ"</string> <string name="qs_edit" msgid="2232596095725105230">"ਸੰਪਾਦਨ ਕਰੋ"</string> <string name="tuner_time" msgid="6572217313285536011">"ਸਮਾਂ"</string> <string-array name="clock_options"> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index a549870ec780..7c2413039ae4 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -480,4 +480,10 @@ <!-- ThemePicker package name for overlaying icons. --> <string name="themepicker_overlayable_package" translatable="false">com.android.wallpaper</string> + <!-- Default rounded corner curve (a Bezier). Must match (the curved path in) rounded.xml. + Note that while rounded.xml includes the entire path (including the horizontal and vertical + corner edges), this pulls out just the curve. + --> + <string name="config_rounded_mask" translatable="false">"M8,0C3.6,0,0,3.6,0,8"</string> + </resources> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 2e2666ec3c8d..66f19495dfa6 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -98,6 +98,12 @@ <item type="id" name="keyguard_hun_animator_start_tag"/> <item type="id" name="keyguard_hun_animator_end_tag"/> + <item type="id" name="view_group_fade_helper_modified_views"/> + <item type="id" name="view_group_fade_helper_animator"/> + <item type="id" name="view_group_fade_helper_previous_value_tag"/> + <item type="id" name="view_group_fade_helper_restore_tag"/> + <item type="id" name="view_group_fade_helper_hardware_layer"/> + <!-- Accessibility actions for the notification menu --> <item type="id" name="action_snooze_undo"/> <item type="id" name="action_snooze_shorter"/> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java index 5b9ee1c47e87..dcb134ec933e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java @@ -20,6 +20,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import android.app.ActivityManager; import android.app.ActivityManager.TaskDescription; +import android.app.TaskInfo; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -75,7 +76,7 @@ public class Task { private int mHashCode; - public TaskKey(ActivityManager.RecentTaskInfo t) { + public TaskKey(TaskInfo t) { ComponentName sourceComponent = t.origActivity != null // Activity alias if there is one ? t.origActivity @@ -226,6 +227,17 @@ public class Task { // Do nothing } + /** + * Creates a task object from the provided task info + */ + public static Task from(TaskKey taskKey, TaskInfo taskInfo, boolean isLocked) { + ActivityManager.TaskDescription td = taskInfo.taskDescription; + return new Task(taskKey, + td != null ? td.getPrimaryColor() : 0, + td != null ? td.getBackgroundColor() : 0, + taskInfo.supportsSplitScreenMultiWindow, isLocked, td, taskInfo.topActivity); + } + public Task(TaskKey key) { this.key = key; this.taskDescription = new TaskDescription(); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index a2abb4b1695c..328116dc3c1b 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -30,10 +30,12 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import android.annotation.NonNull; import android.app.ActivityManager; import android.app.ActivityManager.RecentTaskInfo; +import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.app.AppGlobals; import android.app.IAssistDataReceiver; +import android.app.WindowConfiguration; import android.app.WindowConfiguration.ActivityType; import android.content.ContentResolver; import android.content.Context; @@ -307,28 +309,22 @@ public class ActivityManagerWrapper { } final ActivityOptions finalOptions = options; - // Execute this from another thread such that we can do other things (like caching the - // bitmap for the thumbnail) while AM is busy starting our activity. - mBackgroundExecutor.submit(new Runnable() { - @Override - public void run() { - boolean result = false; - try { - result = startActivityFromRecents(taskKey.id, finalOptions); - } catch (Exception e) { - // Fall through - } - final boolean finalResult = result; - if (resultCallback != null) { - resultCallbackHandler.post(new Runnable() { - @Override - public void run() { - resultCallback.accept(finalResult); - } - }); + + boolean result = false; + try { + result = startActivityFromRecents(taskKey.id, finalOptions); + } catch (Exception e) { + // Fall through + } + final boolean finalResult = result; + if (resultCallback != null) { + resultCallbackHandler.post(new Runnable() { + @Override + public void run() { + resultCallback.accept(finalResult); } - } - }); + }); + } } /** @@ -506,4 +502,12 @@ public class ActivityManagerWrapper { PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT) || freeformDevOption); } + + /** + * Returns true if the running task represents the home task + */ + public static boolean isHomeTask(RunningTaskInfo info) { + return info.configuration.windowConfiguration.getActivityType() + == WindowConfiguration.ACTIVITY_TYPE_HOME; + } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index 7fbe5db99569..cc7863c0113b 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -49,6 +49,15 @@ public class QuickStepContract { public static final String NAV_BAR_MODE_GESTURAL_OVERLAY = WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY; + // Action sent by a system app to switch to gesture nav + public static final String ACTION_ENABLE_GESTURE_NAV = + "com.android.systemui.ENABLE_GESTURE_NAV"; + // Action for the intent to receive the result + public static final String ACTION_ENABLE_GESTURE_NAV_RESULT = + "com.android.systemui.action.ENABLE_GESTURE_NAV_RESULT"; + // Extra containing the pending intent to receive the result + public static final String EXTRA_RESULT_INTENT = "com.android.systemui.EXTRA_RESULT_INTENT"; + // Overview is disabled, either because the device is in lock task mode, or because the device // policy has disabled the feature public static final int SYSUI_STATE_SCREEN_PINNING = 1 << 0; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 05e14a779a17..2eb93d3a6075 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -2203,6 +2203,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { if (DEBUG) Log.d(TAG, "handleKeyguardBouncerChanged(" + bouncer + ")"); boolean isBouncer = (bouncer == 1); mBouncer = isBouncer; + + if (isBouncer) { + // If the bouncer is shown, always clear this flag. This can happen in the following + // situations: 1) Default camera with SHOW_WHEN_LOCKED is not chosen yet. 2) Secure + // camera requests dismiss keyguard (tapping on photos for example). When these happen, + // face auth should resume. + mSecureCameraLaunched = false; + } + for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -2649,6 +2658,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { pw.println(" strongAuthFlags=" + Integer.toHexString(strongAuthFlags)); pw.println(" trustManaged=" + getUserTrustIsManaged(userId)); pw.println(" enabledByUser=" + mFaceSettingEnabledForUser); + pw.println(" mSecureCameraLaunched=" + mSecureCameraLaunched); } } } diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 9a0e9fc92af6..c9d4957494e4 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -46,6 +46,8 @@ public class ImageWallpaper extends WallpaperService { // We delayed destroy render context that subsequent render requests have chance to cancel it. // This is to avoid destroying then recreating render context in a very short time. private static final int DELAY_FINISH_RENDERING = 1000; + private static final int INTERVAL_WAIT_FOR_RENDERING = 100; + private static final int PATIENCE_WAIT_FOR_RENDERING = 5; private HandlerThread mWorker; @Override @@ -80,7 +82,10 @@ public class ImageWallpaper extends WallpaperService { private StatusBarStateController mController; private final Runnable mFinishRenderingTask = this::finishRendering; private final boolean mNeedTransition; + private final Object mMonitor = new Object(); private boolean mNeedRedraw; + // This variable can only be accessed in synchronized block. + private boolean mWaitingForRendering; GLEngine(Context context) { mNeedTransition = ActivityManager.isHighEndGfx() @@ -122,6 +127,27 @@ public class ImageWallpaper extends WallpaperService { long duration = mNeedTransition || animationDuration != 0 ? animationDuration : 0; mWorker.getThreadHandler().post( () -> mRenderer.updateAmbientMode(inAmbientMode, duration)); + if (inAmbientMode && duration == 0) { + // This means that we are transiting from home to aod, to avoid + // race condition between window visibility and transition, + // we don't return until the transition is finished. See b/136643341. + waitForBackgroundRendering(); + } + } + + private void waitForBackgroundRendering() { + synchronized (mMonitor) { + try { + mWaitingForRendering = true; + for (int patience = 1; mWaitingForRendering; patience++) { + mMonitor.wait(INTERVAL_WAIT_FOR_RENDERING); + mWaitingForRendering &= patience < PATIENCE_WAIT_FOR_RENDERING; + } + } catch (InterruptedException ex) { + } finally { + mWaitingForRendering = false; + } + } } @Override @@ -178,7 +204,8 @@ public class ImageWallpaper extends WallpaperService { @Override public void preRender() { - mWorker.getThreadHandler().post(this::preRenderInternal); + // This method should only be invoked from worker thread. + preRenderInternal(); } private void preRenderInternal() { @@ -212,7 +239,8 @@ public class ImageWallpaper extends WallpaperService { @Override public void requestRender() { - mWorker.getThreadHandler().post(this::requestRenderInternal); + // This method should only be invoked from worker thread. + requestRenderInternal(); } private void requestRenderInternal() { @@ -234,7 +262,21 @@ public class ImageWallpaper extends WallpaperService { @Override public void postRender() { - mWorker.getThreadHandler().post(this::scheduleFinishRendering); + // This method should only be invoked from worker thread. + notifyWaitingThread(); + scheduleFinishRendering(); + } + + private void notifyWaitingThread() { + synchronized (mMonitor) { + if (mWaitingForRendering) { + try { + mWaitingForRendering = false; + mMonitor.notify(); + } catch (IllegalMonitorStateException ex) { + } + } + } } private void cancelFinishRenderingTask() { diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/CircularCornerPathRenderer.java b/packages/SystemUI/src/com/android/systemui/assist/ui/CircularCornerPathRenderer.java index 00346a36d3f1..e61e47a2201f 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/CircularCornerPathRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/CircularCornerPathRenderer.java @@ -16,6 +16,7 @@ package com.android.systemui.assist.ui; +import android.content.Context; import android.graphics.Path; /** @@ -29,12 +30,11 @@ public final class CircularCornerPathRenderer extends CornerPathRenderer { private final int mWidth; private final Path mPath = new Path(); - public CircularCornerPathRenderer(int cornerRadiusBottom, int cornerRadiusTop, - int width, int height) { - mCornerRadiusBottom = cornerRadiusBottom; - mCornerRadiusTop = cornerRadiusTop; - mHeight = height; - mWidth = width; + public CircularCornerPathRenderer(Context context) { + mCornerRadiusBottom = DisplayUtils.getCornerRadiusBottom(context); + mCornerRadiusTop = DisplayUtils.getCornerRadiusTop(context); + mHeight = DisplayUtils.getHeight(context); + mWidth = DisplayUtils.getWidth(context); } @Override // CornerPathRenderer diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java index 43e7045511c5..bc782a7d62eb 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java @@ -247,13 +247,9 @@ public class InvocationLightsView extends View * To render corners that aren't circular, override this method in a subclass. */ protected CornerPathRenderer createCornerPathRenderer(Context context) { - int displayWidth = DisplayUtils.getWidth(context); - int displayHeight = DisplayUtils.getHeight(context); - int cornerRadiusBottom = DisplayUtils.getCornerRadiusBottom(context); - int cornerRadiusTop = DisplayUtils.getCornerRadiusTop(context); - return new CircularCornerPathRenderer( - cornerRadiusBottom, cornerRadiusTop, displayWidth, displayHeight); + return new CircularCornerPathRenderer(context); } + /** * Receives an intensity from 0 (lightest) to 1 (darkest) and sets the handle color * appropriately. Intention is to match the home handle color. diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/PathSpecCornerPathRenderer.java b/packages/SystemUI/src/com/android/systemui/assist/ui/PathSpecCornerPathRenderer.java new file mode 100644 index 000000000000..2bad7fc9583a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/PathSpecCornerPathRenderer.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.assist.ui; + +import android.content.Context; +import android.graphics.Matrix; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.Log; +import android.util.PathParser; + +import com.android.systemui.R; + +/** + * Parses a path describing rounded corners from a string. + */ +public final class PathSpecCornerPathRenderer extends CornerPathRenderer { + private static final String TAG = "PathSpecCornerPathRenderer"; + + private final int mHeight; + private final int mWidth; + private final float mPathScale; + private final int mBottomCornerRadius; + private final int mTopCornerRadius; + + private final Path mPath = new Path(); + private final Path mRoundedPath; + private final Matrix mMatrix = new Matrix(); + + public PathSpecCornerPathRenderer(Context context) { + mWidth = DisplayUtils.getWidth(context); + mHeight = DisplayUtils.getHeight(context); + + mBottomCornerRadius = DisplayUtils.getCornerRadiusBottom(context); + mTopCornerRadius = DisplayUtils.getCornerRadiusTop(context); + + String pathData = context.getResources().getString(R.string.config_rounded_mask); + Path path = PathParser.createPathFromPathData(pathData); + if (path == null) { + Log.e(TAG, "No rounded corner path found!"); + mRoundedPath = new Path(); + } else { + mRoundedPath = path; + + } + + RectF bounds = new RectF(); + mRoundedPath.computeBounds(bounds, true); + + // we use this to scale the path such that the larger of its [width, height] is scaled to + // the corner radius (to account for asymmetric paths) + mPathScale = Math.min( + Math.abs(bounds.right - bounds.left), + Math.abs(bounds.top - bounds.bottom)); + } + + /** + * Scales and rotates each corner from the path specification to its correct position. + * + * Note: the rounded corners are passed in as the full shape (a curved triangle), but we only + * want the actual corner curve. Therefore we call getSegment to jump past the horizontal and + * vertical lines. + */ + @Override + public Path getCornerPath(Corner corner) { + if (mRoundedPath.isEmpty()) { + return mRoundedPath; + } + int cornerRadius; + int rotateDegrees; + int translateX; + int translateY; + switch (corner) { + case TOP_LEFT: + cornerRadius = mTopCornerRadius; + rotateDegrees = 0; + translateX = 0; + translateY = 0; + break; + case TOP_RIGHT: + cornerRadius = mTopCornerRadius; + rotateDegrees = 90; + translateX = mWidth; + translateY = 0; + break; + case BOTTOM_RIGHT: + cornerRadius = mBottomCornerRadius; + rotateDegrees = 180; + translateX = mWidth; + translateY = mHeight; + break; + case BOTTOM_LEFT: + default: + cornerRadius = mBottomCornerRadius; + rotateDegrees = 270; + translateX = 0; + translateY = mHeight; + break; + } + mPath.reset(); + mMatrix.reset(); + mPath.addPath(mRoundedPath); + + mMatrix.preScale(cornerRadius / mPathScale, cornerRadius / mPathScale); + mMatrix.postRotate(rotateDegrees); + mMatrix.postTranslate(translateX, translateY); + mPath.transform(mMatrix); + return mPath; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/PerimeterPathGuide.java b/packages/SystemUI/src/com/android/systemui/assist/ui/PerimeterPathGuide.java index 65a9fcc3a955..fb41b1c4715f 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/PerimeterPathGuide.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/PerimeterPathGuide.java @@ -102,7 +102,7 @@ public class PerimeterPathGuide { * Sets the rotation. * * @param rotation one of Surface.ROTATION_0, Surface.ROTATION_90, Surface.ROTATION_180, - * Surface.ROTATION_270 + * Surface.ROTATION_270 */ public void setRotation(int rotation) { if (rotation != mRotation) { @@ -229,14 +229,14 @@ public class PerimeterPathGuide { - mDeviceWidthPx) / 2, (mDeviceWidthPx - mDeviceHeightPx) / 2); } - CircularCornerPathRenderer.Corner screenBottomLeft = getRotatedCorner( - CircularCornerPathRenderer.Corner.BOTTOM_LEFT); - CircularCornerPathRenderer.Corner screenBottomRight = getRotatedCorner( - CircularCornerPathRenderer.Corner.BOTTOM_RIGHT); - CircularCornerPathRenderer.Corner screenTopLeft = getRotatedCorner( - CircularCornerPathRenderer.Corner.TOP_LEFT); - CircularCornerPathRenderer.Corner screenTopRight = getRotatedCorner( - CircularCornerPathRenderer.Corner.TOP_RIGHT); + CornerPathRenderer.Corner screenBottomLeft = getRotatedCorner( + CornerPathRenderer.Corner.BOTTOM_LEFT); + CornerPathRenderer.Corner screenBottomRight = getRotatedCorner( + CornerPathRenderer.Corner.BOTTOM_RIGHT); + CornerPathRenderer.Corner screenTopLeft = getRotatedCorner( + CornerPathRenderer.Corner.TOP_LEFT); + CornerPathRenderer.Corner screenTopRight = getRotatedCorner( + CornerPathRenderer.Corner.TOP_RIGHT); mRegions[Region.BOTTOM_LEFT.ordinal()].path = mCornerPathRenderer.getInsetPath(screenBottomLeft, mEdgeInset); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index 932e40c77af0..a5857df8ba5a 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -282,6 +282,7 @@ public abstract class BiometricDialogView extends LinearLayout { if (mRestoredState == null) { updateState(STATE_AUTHENTICATING); + mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); final int hint = getHintStringResourceId(); if (hint != 0) { mErrorText.setText(hint); @@ -319,8 +320,6 @@ public abstract class BiometricDialogView extends LinearLayout { mDescriptionText.setText(descriptionText); } - mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); - if (requiresConfirmation() && mRestoredState == null) { mPositiveButton.setVisibility(View.VISIBLE); mPositiveButton.setEnabled(false); @@ -474,6 +473,8 @@ public abstract class BiometricDialogView extends LinearLayout { mHandler.removeMessages(MSG_RESET_MESSAGE); mErrorText.setTextColor(mTextColor); mErrorText.setText(R.string.biometric_dialog_tap_confirm); + mErrorText.setContentDescription( + getResources().getString(R.string.biometric_dialog_tap_confirm)); mErrorText.setVisibility(View.VISIBLE); announceAccessibilityEvent(); mPositiveButton.setVisibility(View.VISIBLE); @@ -487,6 +488,7 @@ public abstract class BiometricDialogView extends LinearLayout { if (newState == STATE_PENDING_CONFIRMATION || newState == STATE_AUTHENTICATED) { mNegativeButton.setText(R.string.cancel); + mNegativeButton.setContentDescription(getResources().getString(R.string.cancel)); } updateIcon(mState, newState); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java index 6fb6467d07b2..67dfdcac4b22 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java @@ -67,8 +67,8 @@ public class FalsingManagerImpl implements FalsingManager { Sensor.TYPE_LIGHT, Sensor.TYPE_ROTATION_VECTOR, }; - private static final String FALSING_REMAIN_LOCKED = "falsing_failure_after_attempts"; - private static final String FALSING_SUCCESS = "falsing_success_after_attempts"; + public static final String FALSING_REMAIN_LOCKED = "falsing_failure_after_attempts"; + public static final String FALSING_SUCCESS = "falsing_success_after_attempts"; private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Context mContext; diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index 19c46e40f604..00f35aa4276c 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -16,6 +16,9 @@ package com.android.systemui.classifier.brightline; +import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_REMAIN_LOCKED; +import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_SUCCESS; + import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; @@ -24,6 +27,7 @@ import android.net.Uri; import android.util.Log; import android.view.MotionEvent; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.classifier.Classifier; import com.android.systemui.plugins.FalsingManager; @@ -44,6 +48,8 @@ public class BrightLineFalsingManager implements FalsingManager { private final SensorManager mSensorManager; private final FalsingDataProvider mDataProvider; private boolean mSessionStarted; + private MetricsLogger mMetricsLogger; + private int mIsFalseTouchCalls; private final ExecutorService mBackgroundExecutor = Executors.newSingleThreadExecutor(); @@ -64,6 +70,7 @@ public class BrightLineFalsingManager implements FalsingManager { SensorManager sensorManager) { mDataProvider = falsingDataProvider; mSensorManager = sensorManager; + mMetricsLogger = new MetricsLogger(); mClassifiers = new ArrayList<>(); DistanceClassifier distanceClassifier = new DistanceClassifier(mDataProvider); ProximityClassifier proximityClassifier = new ProximityClassifier(distanceClassifier, @@ -111,6 +118,10 @@ public class BrightLineFalsingManager implements FalsingManager { unregisterSensors(); mDataProvider.onSessionEnd(); mClassifiers.forEach(FalsingClassifier::onSessionEnded); + if (mIsFalseTouchCalls != 0) { + mMetricsLogger.histogram(FALSING_REMAIN_LOCKED, mIsFalseTouchCalls); + mIsFalseTouchCalls = 0; + } } } @@ -157,6 +168,10 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void onSucccessfulUnlock() { + if (mIsFalseTouchCalls != 0) { + mMetricsLogger.histogram(FALSING_SUCCESS, mIsFalseTouchCalls); + mIsFalseTouchCalls = 0; + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java index 6a1f24afe620..45e97b38d87e 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java @@ -84,7 +84,17 @@ class ImageRevealHelper { void updateAwake(boolean awake, long duration) { mAwake = awake; mAnimator.setDuration(duration); - animate(); + if (!mAwake && duration == 0) { + // We are transiting from home to aod, + // since main thread is waiting for rendering finished, we only need draw + // the last state directly, which is a black screen. + mReveal = MIN_REVEAL; + mRevealListener.onRevealStart(); + mRevealListener.onRevealStateChanged(); + mRevealListener.onRevealEnd(); + } else { + animate(); + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index d7ca4d006082..57bf53676a4a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -61,6 +61,7 @@ import android.util.EventLog; import android.util.Log; import android.util.Slog; import android.util.SparseArray; +import android.view.View; import android.view.ViewGroup; import android.view.WindowManagerPolicyConstants; import android.view.animation.Animation; @@ -85,6 +86,7 @@ import com.android.systemui.SystemUIFactory; import com.android.systemui.UiOffloadThread; import com.android.systemui.classifier.FalsingManagerFactory; import com.android.systemui.statusbar.phone.BiometricUnlockController; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationPanelView; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; @@ -208,6 +210,7 @@ public class KeyguardViewMediator extends SystemUI { private boolean mBootCompleted; private boolean mBootSendUserPresent; private boolean mShuttingDown; + private boolean mDozing; /** High level access to the power manager for WakeLocks */ private PowerManager mPM; @@ -711,11 +714,10 @@ public class KeyguardViewMediator extends SystemUI { com.android.keyguard.R.bool.config_enableKeyguardService)) { setShowingLocked(!shouldWaitForProvisioning() && !mLockPatternUtils.isLockScreenDisabled( - KeyguardUpdateMonitor.getCurrentUser()), - mAodShowing, true /* forceCallbacks */); + KeyguardUpdateMonitor.getCurrentUser()), true /* forceCallbacks */); } else { // The system's keyguard is disabled or missing. - setShowingLocked(false, mAodShowing, true); + setShowingLocked(false /* showing */, true /* forceCallbacks */); } mStatusBarKeyguardViewManager = @@ -1324,7 +1326,7 @@ public class KeyguardViewMediator extends SystemUI { if (mLockPatternUtils.checkVoldPassword(KeyguardUpdateMonitor.getCurrentUser())) { if (DEBUG) Log.d(TAG, "Not showing lock screen since just decrypted"); // Without this, settings is not enabled until the lock screen first appears - setShowingLocked(false, mAodShowing); + setShowingLocked(false); hideLocked(); return; } @@ -1740,6 +1742,9 @@ public class KeyguardViewMediator extends SystemUI { private void updateActivityLockScreenState(boolean showing, boolean aodShowing) { mUiOffloadThread.submit(() -> { + if (DEBUG) { + Log.d(TAG, "updateActivityLockScreenState(" + showing + ", " + aodShowing + ")"); + } try { ActivityTaskManager.getService().setLockScreenShown(showing, aodShowing); } catch (RemoteException e) { @@ -1765,10 +1770,10 @@ public class KeyguardViewMediator extends SystemUI { if (DEBUG) Log.d(TAG, "handleShow"); } - setShowingLocked(true, mAodShowing); - mStatusBarKeyguardViewManager.show(options); mHiding = false; mWakeAndUnlocking = false; + setShowingLocked(true); + mStatusBarKeyguardViewManager.show(options); resetKeyguardDonePendingLocked(); mHideAnimationRun = false; adjustStatusBarLocked(); @@ -1875,7 +1880,7 @@ public class KeyguardViewMediator extends SystemUI { if (!mHiding) { // Tell ActivityManager that we canceled the keyguardExitAnimation. - setShowingLocked(mShowing, mAodShowing, true /* force */); + setShowingLocked(mShowing, true /* force */); return; } mHiding = false; @@ -1896,8 +1901,8 @@ public class KeyguardViewMediator extends SystemUI { playSounds(false); } + setShowingLocked(false); mWakeAndUnlocking = false; - setShowingLocked(false, mAodShowing); mDismissCallbackRegistry.notifyDismissSucceeded(); mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration); resetKeyguardDonePendingLocked(); @@ -1957,7 +1962,7 @@ public class KeyguardViewMediator extends SystemUI { Trace.beginSection("KeyguardViewMediator#handleVerifyUnlock"); synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); - setShowingLocked(true, mAodShowing); + setShowingLocked(true); mStatusBarKeyguardViewManager.dismissAndCollapse(); } Trace.endSection(); @@ -2060,9 +2065,11 @@ public class KeyguardViewMediator extends SystemUI { public StatusBarKeyguardViewManager registerStatusBar(StatusBar statusBar, ViewGroup container, NotificationPanelView panelView, - BiometricUnlockController biometricUnlockController, ViewGroup lockIconContainer) { + BiometricUnlockController biometricUnlockController, ViewGroup lockIconContainer, + View notificationContainer, KeyguardBypassController bypassController) { mStatusBarKeyguardViewManager.registerStatusBar(statusBar, container, panelView, - biometricUnlockController, mDismissCallbackRegistry, lockIconContainer); + biometricUnlockController, mDismissCallbackRegistry, lockIconContainer, + notificationContainer, bypassController); return mStatusBarKeyguardViewManager; } @@ -2102,6 +2109,8 @@ public class KeyguardViewMediator extends SystemUI { pw.print(" mDeviceInteractive: "); pw.println(mDeviceInteractive); pw.print(" mGoingToSleep: "); pw.println(mGoingToSleep); pw.print(" mHiding: "); pw.println(mHiding); + pw.print(" mDozing: "); pw.println(mDozing); + pw.print(" mAodShowing: "); pw.println(mAodShowing); pw.print(" mWaitingUntilKeyguardVisible: "); pw.println(mWaitingUntilKeyguardVisible); pw.print(" mKeyguardDonePending: "); pw.println(mKeyguardDonePending); pw.print(" mHideAnimationRun: "); pw.println(mHideAnimationRun); @@ -2112,10 +2121,14 @@ public class KeyguardViewMediator extends SystemUI { } /** - * @param aodShowing true when AOD - or ambient mode - is showing. + * @param dozing true when AOD - or ambient mode - is showing. */ - public void setAodShowing(boolean aodShowing) { - setShowingLocked(mShowing, aodShowing); + public void setDozing(boolean dozing) { + if (dozing == mDozing) { + return; + } + mDozing = dozing; + setShowingLocked(mShowing); } /** @@ -2136,19 +2149,18 @@ public class KeyguardViewMediator extends SystemUI { } } - private void setShowingLocked(boolean showing, boolean aodShowing) { - setShowingLocked(showing, aodShowing, false /* forceCallbacks */); + private void setShowingLocked(boolean showing) { + setShowingLocked(showing, false /* forceCallbacks */); } - private void setShowingLocked(boolean showing, boolean aodShowing, boolean forceCallbacks) { + private void setShowingLocked(boolean showing, boolean forceCallbacks) { + final boolean aodShowing = mDozing && !mWakeAndUnlocking; final boolean notifyDefaultDisplayCallbacks = showing != mShowing || aodShowing != mAodShowing || forceCallbacks; + mShowing = showing; + mAodShowing = aodShowing; if (notifyDefaultDisplayCallbacks) { - mShowing = showing; - mAodShowing = aodShowing; - if (notifyDefaultDisplayCallbacks) { - notifyDefaultDisplayCallbacks(showing); - } + notifyDefaultDisplayCallbacks(showing); updateActivityLockScreenState(showing, aodShowing); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index ed6f599b69a6..19edc94a3871 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -120,6 +120,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private int mCurrentBoundedUserId = -1; private float mNavBarButtonAlpha; private boolean mInputFocusTransferStarted; + private float mInputFocusTransferStartY; + private long mInputFocusTransferStartMillis; private float mWindowCornerRadius; private boolean mSupportsRoundedCornersOnWindows; private int mNavBarMode = NAV_BAR_MODE_3BUTTON; @@ -180,12 +182,16 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis int action = event.getActionMasked(); if (action == ACTION_DOWN) { mInputFocusTransferStarted = true; - + mInputFocusTransferStartY = event.getY(); + mInputFocusTransferStartMillis = event.getEventTime(); + bar.onInputFocusTransfer(mInputFocusTransferStarted, 0 /* velocity */); } if (action == ACTION_UP || action == ACTION_CANCEL) { mInputFocusTransferStarted = false; + bar.onInputFocusTransfer(mInputFocusTransferStarted, + (event.getY() - mInputFocusTransferStartY) + / (event.getEventTime() - mInputFocusTransferStartMillis)); } - bar.onInputFocusTransfer(mInputFocusTransferStarted); event.recycle(); } }); @@ -596,7 +602,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); if (bar != null) { mInputFocusTransferStarted = false; - bar.onInputFocusTransfer(false); + bar.onInputFocusTransfer(false, 0 /* velocity */); } }); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index aeb85748fd1a..22c91647d7f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -468,14 +468,14 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle private void beginUpdate() { if (mPerformingUpdate) { - throw new IllegalStateException("Re-entrant code during update."); + Log.wtf(TAG, "Re-entrant code during update", new Exception()); } mPerformingUpdate = true; } private void endUpdate() { if (!mPerformingUpdate) { - throw new IllegalStateException("Manager state has become desynced."); + Log.wtf(TAG, "Manager state has become desynced", new Exception()); } mPerformingUpdate = false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt new file mode 100644 index 000000000000..847d1ccddddf --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.notification + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ValueAnimator +import android.view.View +import android.view.ViewGroup +import com.android.systemui.Interpolators +import com.android.systemui.R + +/** + * Class to help with fading of view groups without fading one subview + */ +class ViewGroupFadeHelper { + companion object { + private val visibilityIncluder = { + view: View -> view.visibility == View.VISIBLE + } + + /** + * Fade out all views of a root except a single child. This will iterate over all children + * of the view and make sure that the animation works smoothly. + * @param root the view root to fade the children away + * @param excludedView which view should remain + * @param duration the duration of the animation + */ + @JvmStatic + fun fadeOutAllChildrenExcept(root: ViewGroup, excludedView: View, duration: Long, + endRunnable: Runnable?) { + // starting from the view going up, we are adding the siblings of the child to the set + // of views that need to be faded. + val viewsToFadeOut = gatherViews(root, excludedView, visibilityIncluder) + + // Applying the right layertypes for the animation + for (viewToFade in viewsToFadeOut) { + if (viewToFade.hasOverlappingRendering + && viewToFade.layerType == View.LAYER_TYPE_NONE) { + viewToFade.setLayerType(View.LAYER_TYPE_HARDWARE, null) + viewToFade.setTag(R.id.view_group_fade_helper_hardware_layer, true) + } + } + + val animator = ValueAnimator.ofFloat(1.0f, 0.0f).apply { + this.duration = duration + interpolator = Interpolators.ALPHA_OUT + addUpdateListener { animation -> + val previousSetAlpha = root.getTag( + R.id.view_group_fade_helper_previous_value_tag) as Float? + val newAlpha = animation.animatedValue as Float + for (viewToFade in viewsToFadeOut) { + if (viewToFade.alpha != previousSetAlpha) { + // A value was set that wasn't set from our view, let's store it and restore + // it at the end + viewToFade.setTag(R.id.view_group_fade_helper_restore_tag, viewToFade.alpha) + } + viewToFade.alpha = newAlpha + } + root.setTag(R.id.view_group_fade_helper_previous_value_tag, newAlpha) + } + addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + endRunnable?.run() + } + }) + start() + } + root.setTag(R.id.view_group_fade_helper_modified_views, viewsToFadeOut) + root.setTag(R.id.view_group_fade_helper_animator, animator) + } + + private fun gatherViews(root: ViewGroup, excludedView: View, + shouldInclude: (View) -> Boolean): MutableSet<View> { + val viewsToFadeOut = mutableSetOf<View>() + var parent = excludedView.parent as ViewGroup? + var viewContainingExcludedView = excludedView; + while (parent != null) { + for (i in 0 until parent.childCount) { + val child = parent.getChildAt(i) + if (shouldInclude.invoke(child) && viewContainingExcludedView != child) { + viewsToFadeOut.add(child) + } + } + if (parent == root) { + break; + } + viewContainingExcludedView = parent + parent = parent.parent as ViewGroup? + } + return viewsToFadeOut + } + + /** + * Reset all view alphas for views previously transformed away. + */ + @JvmStatic + fun reset(root: ViewGroup) { + @Suppress("UNCHECKED_CAST") + val modifiedViews = root.getTag(R.id.view_group_fade_helper_modified_views) + as MutableSet<View>? + val animator = root.getTag(R.id.view_group_fade_helper_animator) as Animator? + if (modifiedViews == null || animator == null) { + // nothing to restore + return + } + animator.cancel() + val lastSetValue = root.getTag( + R.id.view_group_fade_helper_previous_value_tag) as Float? + for (viewToFade in modifiedViews) { + val restoreAlpha = viewToFade.getTag( + R.id.view_group_fade_helper_restore_tag) as Float? + if (restoreAlpha == null) { + continue + } + if (lastSetValue == viewToFade.alpha) { + // it was modified after the transition! + viewToFade.alpha = restoreAlpha + } + val needsLayerReset = viewToFade.getTag( + R.id.view_group_fade_helper_hardware_layer) as Boolean? + if (needsLayerReset == true) { + viewToFade.setLayerType(View.LAYER_TYPE_NONE, null) + viewToFade.setTag(R.id.view_group_fade_helper_hardware_layer, null) + } + viewToFade.setTag(R.id.view_group_fade_helper_restore_tag, null) + } + root.setTag(R.id.view_group_fade_helper_modified_views, null) + root.setTag(R.id.view_group_fade_helper_previous_value_tag, null) + root.setTag(R.id.view_group_fade_helper_animator, null) + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 05d26b0a6a17..bc7174d33b13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -261,6 +261,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { biometricSourceType); if (unlockAllowed) { startWakeAndUnlock(biometricSourceType); + } else { + Log.d(TAG, "onBiometricAuthenticated aborted by bypass controller"); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index c44f953615e3..cbaf85c511dd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Rect; +import android.graphics.Region; import android.util.Log; import android.util.Pools; import android.view.DisplayCutout; @@ -88,7 +89,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, private int[] mTmpTwoArray = new int[2]; private boolean mHeadsUpGoingAway; private int mStatusBarState; - private Rect mTouchableRegion = new Rect(); + private Region mTouchableRegion = new Region(); private AnimationStateHandler mAnimationStateHandler; @@ -365,10 +366,11 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, info.touchableRegion.set(calculateTouchableRegion()); } - public Rect calculateTouchableRegion() { + public Region calculateTouchableRegion() { if (!hasPinnedHeadsUp()) { mTouchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight); updateRegionForNotch(mTouchableRegion); + } else { NotificationEntry topEntry = getTopEntry(); if (topEntry.isChildInGroup()) { @@ -388,7 +390,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, return mTouchableRegion; } - private void updateRegionForNotch(Rect region) { + private void updateRegionForNotch(Region region) { DisplayCutout cutout = mStatusBarWindowView.getRootWindowInsets().getDisplayCutout(); if (cutout == null) { return; @@ -460,6 +462,8 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, super.dumpInternal(fd, pw, args); pw.print(" mBarState="); pw.println(mStatusBarState); + pw.print(" mTouchableRegion="); + pw.println(mTouchableRegion); } /////////////////////////////////////////////////////////////////////////////////////////////// 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 21a22eccf509..d6f8a606af55 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -346,10 +346,10 @@ public class KeyguardBouncer { } /** - * {@link #show(boolean)} was called but we're not showing yet. + * {@link #show(boolean)} was called but we're not showing yet, or being dragged. */ - public boolean willShowSoon() { - return mShowingSoon; + public boolean inTransit() { + return mShowingSoon || mExpansion != EXPANSION_HIDDEN; } /** 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 d7deedce3c2f..c88b22bbbced 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -21,11 +21,11 @@ import android.content.pm.PackageManager import android.hardware.biometrics.BiometricSourceType import android.hardware.face.FaceManager import android.provider.Settings -import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.StatusBarState import com.android.systemui.tuner.TunerService +import java.io.PrintWriter import javax.inject.Inject import javax.inject.Singleton @@ -62,18 +62,15 @@ class KeyguardBypassController { } @Inject - constructor(context: Context, tunerService: TunerService, - statusBarStateController: StatusBarStateController, - lockscreenUserManager: NotificationLockscreenUserManager) { + constructor( + context: Context, + tunerService: TunerService, + statusBarStateController: StatusBarStateController, + lockscreenUserManager: NotificationLockscreenUserManager + ) { unlockMethodCache = UnlockMethodCache.getInstance(context) this.statusBarStateController = statusBarStateController - statusBarStateController.addCallback(object : StatusBarStateController.StateListener { - override fun onStateChanged(newState: Int) { - if (newState != StatusBarState.KEYGUARD) { - pendingUnlockType = null; - } - } - }) + if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { return } @@ -82,16 +79,19 @@ class KeyguardBypassController { return } + statusBarStateController.addCallback(object : StatusBarStateController.StateListener { + override fun onStateChanged(newState: Int) { + if (newState != StatusBarState.KEYGUARD) { + pendingUnlockType = null + } + } + }) + val dismissByDefault = if (context.resources.getBoolean( - com.android.internal.R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 - tunerService.addTunable( - object : TunerService.Tunable { - override fun onTuningChanged(key: String?, newValue: String?) { - bypassEnabled = Settings.Secure.getIntForUser( - context.contentResolver, - Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, - dismissByDefault, - KeyguardUpdateMonitor.getCurrentUser()) != 0 + com.android.internal.R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 + tunerService.addTunable(object : TunerService.Tunable { + override fun onTuningChanged(key: String?, newValue: String?) { + bypassEnabled = tunerService.getValue(key, dismissByDefault) != 0 } }, Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD) lockscreenUserManager.addUserChangedListener { pendingUnlockType = null } @@ -155,4 +155,16 @@ class KeyguardBypassController { fun onStartedGoingToSleep() { pendingUnlockType = null } + + fun dump(pw: PrintWriter) { + pw.println("KeyguardBypassController:") + pw.print(" pendingUnlockType: "); pw.println(pendingUnlockType) + pw.print(" bypassEnabled: "); pw.println(bypassEnabled) + pw.print(" canBypass: "); pw.println(canBypass()) + pw.print(" bouncerShowing: "); pw.println(bouncerShowing) + pw.print(" isPulseExpanding: "); pw.println(isPulseExpanding) + pw.print(" launchingAffordance: "); pw.println(launchingAffordance) + pw.print(" qSExpanded: "); pw.println(qSExpanded) + pw.print(" bouncerShowing: "); pw.println(bouncerShowing) + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java index 4d7cf2715f9c..64fef55a21d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java @@ -16,17 +16,26 @@ package com.android.systemui.statusbar.phone; +import static android.app.Activity.RESULT_CANCELED; +import static android.app.Activity.RESULT_OK; +import static android.app.admin.DevicePolicyManager.STATE_USER_UNMANAGED; import static android.content.Intent.ACTION_OVERLAY_CHANGED; import static android.content.Intent.ACTION_PREFERRED_ACTIVITY_CHANGED; +import static android.content.pm.PackageManager.FEATURE_DEVICE_ADMIN; import static android.os.UserHandle.USER_CURRENT; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY; +import static com.android.systemui.shared.system.QuickStepContract.ACTION_ENABLE_GESTURE_NAV; +import static com.android.systemui.shared.system.QuickStepContract.ACTION_ENABLE_GESTURE_NAV_RESULT; +import static com.android.systemui.shared.system.QuickStepContract.EXTRA_RESULT_INTENT; + import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -40,6 +49,7 @@ import android.os.PatternMatcher; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.provider.Settings.Secure; import android.text.TextUtils; @@ -157,6 +167,8 @@ public class NavigationModeController implements Dumpable { } }; + private BroadcastReceiver mEnableGestureNavReceiver; + @Inject public NavigationModeController(Context context, DeviceProvisionedController deviceProvisionedController, @@ -177,6 +189,7 @@ public class NavigationModeController implements Dumpable { IntentFilter preferredActivityFilter = new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED); mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, preferredActivityFilter, null, null); + // We are only interested in launcher changes, so keeping track of the current default. mLastDefaultLauncher = getDefaultLauncherPackageName(mContext); @@ -187,6 +200,82 @@ public class NavigationModeController implements Dumpable { deferGesturalNavOverlayIfNecessary(); } + private void removeEnableGestureNavListener() { + if (mEnableGestureNavReceiver != null) { + if (DEBUG) { + Log.d(TAG, "mEnableGestureNavReceiver unregistered"); + } + mContext.unregisterReceiver(mEnableGestureNavReceiver); + mEnableGestureNavReceiver = null; + } + } + + private boolean setGestureModeOverlayForMainLauncher() { + removeEnableGestureNavListener(); + if (getCurrentInteractionMode(mCurrentUserContext) == NAV_BAR_MODE_GESTURAL) { + // Already in gesture mode + return true; + } + final Boolean supported = isGestureNavSupportedByDefaultLauncher(mCurrentUserContext); + if (supported == null || supported) { + Log.d(TAG, "Switching system navigation to full-gesture mode:" + + " defaultLauncher=" + + getDefaultLauncherPackageName(mCurrentUserContext) + + " contextUser=" + + mCurrentUserContext.getUserId()); + + setModeOverlay(NAV_BAR_MODE_GESTURAL_OVERLAY, USER_CURRENT); + return true; + } else { + Log.e(TAG, "Gesture nav is not supported for defaultLauncher=" + + getDefaultLauncherPackageName(mCurrentUserContext)); + return false; + } + } + + private boolean enableGestureNav(Intent intent) { + if (!(intent.getParcelableExtra(EXTRA_RESULT_INTENT) instanceof PendingIntent)) { + Log.e(TAG, "No callback pending intent was attached"); + return false; + } + + PendingIntent callback = intent.getParcelableExtra(EXTRA_RESULT_INTENT); + Intent callbackIntent = callback.getIntent(); + if (callbackIntent == null + || !ACTION_ENABLE_GESTURE_NAV_RESULT.equals(callbackIntent.getAction())) { + Log.e(TAG, "Invalid callback intent"); + return false; + } + String callerPackage = callback.getCreatorPackage(); + UserHandle callerUser = callback.getCreatorUserHandle(); + + DevicePolicyManager dpm = mCurrentUserContext.getSystemService(DevicePolicyManager.class); + ComponentName ownerComponent = dpm.getDeviceOwnerComponentOnCallingUser(); + + if (ownerComponent != null) { + // Verify that the caller is the owner component + if (!ownerComponent.getPackageName().equals(callerPackage) + || !mCurrentUserContext.getUser().equals(callerUser)) { + Log.e(TAG, "Callback must be from the device owner"); + return false; + } + } else { + UserHandle callerParent = mCurrentUserContext.getSystemService(UserManager.class) + .getProfileParent(callerUser); + if (callerParent == null || !callerParent.equals(mCurrentUserContext.getUser())) { + Log.e(TAG, "Callback must be from a managed user"); + return false; + } + ComponentName profileOwner = dpm.getProfileOwnerAsUser(callerUser); + if (profileOwner == null || !profileOwner.getPackageName().equals(callerPackage)) { + Log.e(TAG, "Callback must be from the profile owner"); + return false; + } + } + + return setGestureModeOverlayForMainLauncher(); + } + public void updateCurrentInteractionMode(boolean notify) { mCurrentUserContext = getCurrentUserContext(); int mode = getCurrentInteractionMode(mCurrentUserContext); @@ -245,6 +334,10 @@ public class NavigationModeController implements Dumpable { } } + private boolean supportsDeviceAdmin() { + return mContext.getPackageManager().hasSystemFeature(FEATURE_DEVICE_ADMIN); + } + private void deferGesturalNavOverlayIfNecessary() { final int userId = mDeviceProvisionedController.getCurrentUser(); mRestoreGesturalNavBarMode.put(userId, false); @@ -255,6 +348,7 @@ public class NavigationModeController implements Dumpable { Log.d(TAG, "deferGesturalNavOverlayIfNecessary: device is provisioned and user is " + "setup"); } + removeEnableGestureNavListener(); return; } @@ -270,6 +364,7 @@ public class NavigationModeController implements Dumpable { Log.d(TAG, "deferGesturalNavOverlayIfNecessary: no default gestural overlay, " + "default=" + defaultOverlays); } + removeEnableGestureNavListener(); return; } @@ -277,6 +372,24 @@ public class NavigationModeController implements Dumpable { // provisioned setModeOverlay(NAV_BAR_MODE_3BUTTON_OVERLAY, USER_CURRENT); mRestoreGesturalNavBarMode.put(userId, true); + + if (supportsDeviceAdmin() && mEnableGestureNavReceiver == null) { + mEnableGestureNavReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (DEBUG) { + Log.d(TAG, "ACTION_ENABLE_GESTURE_NAV"); + } + setResultCode(enableGestureNav(intent) ? RESULT_OK : RESULT_CANCELED); + } + }; + // Register for all users so that we can get managed users as well + mContext.registerReceiverAsUser(mEnableGestureNavReceiver, UserHandle.ALL, + new IntentFilter(ACTION_ENABLE_GESTURE_NAV), null, null); + if (DEBUG) { + Log.d(TAG, "mEnableGestureNavReceiver registered"); + } + } if (DEBUG) { Log.d(TAG, "deferGesturalNavOverlayIfNecessary: setting to 3 button mode"); } @@ -290,7 +403,15 @@ public class NavigationModeController implements Dumpable { final int userId = mDeviceProvisionedController.getCurrentUser(); if (mRestoreGesturalNavBarMode.get(userId)) { // Restore the gestural state if necessary - setModeOverlay(NAV_BAR_MODE_GESTURAL_OVERLAY, USER_CURRENT); + if (!supportsDeviceAdmin() + || mCurrentUserContext.getSystemService(DevicePolicyManager.class) + .getUserProvisioningState() == STATE_USER_UNMANAGED) { + setGestureModeOverlayForMainLauncher(); + } else { + if (DEBUG) { + Log.d(TAG, "Not restoring to gesture nav for managed user"); + } + } mRestoreGesturalNavBarMode.put(userId, false); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 6eeb96813c94..37855ae592a5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -38,6 +38,7 @@ import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; +import android.graphics.Region; import android.os.PowerManager; import android.util.AttributeSet; import android.util.Log; @@ -290,7 +291,11 @@ public class NotificationPanelView extends PanelView implements private boolean mIsFullWidth; private boolean mBlockingExpansionForCurrentTouch; - private boolean mExpectingOpenPanelGesture; + /** + * Following variables maintain state of events when input focus transfer may occur. + */ + private boolean mExpectingSynthesizedDown; // expecting to see synthesized DOWN event + private boolean mLastEventSynthesizedDown; // last event was synthesized DOWN event /** * Current dark amount that follows regular interpolation curve of animation. @@ -672,9 +677,10 @@ public class NotificationPanelView extends PanelView implements private Rect calculateGestureExclusionRect() { Rect exclusionRect = null; - if (isFullyCollapsed()) { + Region touchableRegion = mHeadsUpManager.calculateTouchableRegion(); + if (isFullyCollapsed() && touchableRegion != null) { // Note: The heads up manager also calculates the non-pinned touchable region - exclusionRect = mHeadsUpManager.calculateTouchableRegion(); + exclusionRect = touchableRegion.getBounds(); } return exclusionRect != null ? exclusionRect @@ -1059,6 +1065,15 @@ public class NotificationPanelView extends PanelView implements mDownY = event.getY(); mCollapsedOnDown = isFullyCollapsed(); mListenForHeadsUp = mCollapsedOnDown && mHeadsUpManager.hasPinnedHeadsUp(); + if (mExpectingSynthesizedDown) { + mLastEventSynthesizedDown = true; + } else { + // down but not synthesized motion event. + mLastEventSynthesizedDown = false; + } + } else { + // not down event at all. + mLastEventSynthesizedDown = false; } } @@ -1124,12 +1139,18 @@ public class NotificationPanelView extends PanelView implements return false; } - initDownStates(event); // Make sure the next touch won't the blocked after the current ends. if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { mBlockingExpansionForCurrentTouch = false; } + // When touch focus transfer happens, ACTION_DOWN->ACTION_UP may happen immediately + // without any ACTION_MOVE event. + // In such case, simply expand the panel instead of being stuck at the bottom bar. + if (mLastEventSynthesizedDown && event.getAction() == MotionEvent.ACTION_UP) { + expand(true /* animate */); + } + initDownStates(event); if (!mIsExpanding && !shouldQuickSettingsIntercept(mDownX, mDownY, 0) && mPulseExpansionHandler.onTouchEvent(event)) { // We're expanding all the other ones shouldn't get this anymore @@ -1255,17 +1276,28 @@ public class NotificationPanelView extends PanelView implements if (!isFullyCollapsed()) { return; } - mExpectingOpenPanelGesture = true; + mExpectingSynthesizedDown = true; onTrackingStarted(); } /** - * Input focus transfer has already happened as this view decided to intercept - * very first down event. + * Called when this view is no longer waiting for input focus transfer. + * + * There are two scenarios behind this function call. First, input focus transfer + * has successfully happened and this view already received synthetic DOWN event. + * (mExpectingSynthesizedDown == false). Do nothing. + * + * Second, before input focus transfer finished, user may have lifted finger + * in previous window and this window never received synthetic DOWN event. + * (mExpectingSynthesizedDown == true). + * In this case, we use the velocity to trigger fling event. + * + * @param velocity unit is in px / millis */ - public void stopWaitingForOpenPanelGesture() { - if (mExpectingOpenPanelGesture) { - mExpectingOpenPanelGesture = false; + public void stopWaitingForOpenPanelGesture(float velocity) { + if (mExpectingSynthesizedDown) { + mExpectingSynthesizedDown = false; + fling(velocity > 1f ? 1000f * velocity : 0, true /* animate */); onTrackingStopped(false); } } @@ -1283,8 +1315,8 @@ public class NotificationPanelView extends PanelView implements @Override protected boolean shouldGestureWaitForTouchSlop() { - if (mExpectingOpenPanelGesture) { - mExpectingOpenPanelGesture = false; + if (mExpectingSynthesizedDown) { + mExpectingSynthesizedDown = false; return false; } return isFullyCollapsed() || mBarState != StatusBarState.SHADE; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index ad13b28440bb..fb8eca15d7c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -80,7 +80,6 @@ import android.metrics.LogMaker; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; -import android.os.Debug; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -202,6 +201,7 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; import com.android.systemui.statusbar.notification.NotificationListController; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; +import com.android.systemui.statusbar.notification.ViewGroupFadeHelper; import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl; @@ -1232,7 +1232,8 @@ public class StatusBar extends SystemUI implements DemoMode, new Handler(), mKeyguardUpdateMonitor, mKeyguardBypassController); mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this, getBouncerContainer(), mNotificationPanel, mBiometricUnlockController, - mStatusBarWindow.findViewById(R.id.lock_icon_container)); + mStatusBarWindow.findViewById(R.id.lock_icon_container), mStackScroller, + mKeyguardBypassController); mKeyguardIndicationController .setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); @@ -1930,15 +1931,16 @@ public class StatusBar extends SystemUI implements DemoMode, /** * Called when another window is about to transfer it's input focus. */ - public void onInputFocusTransfer(boolean start) { + public void onInputFocusTransfer(boolean start, float velocity) { if (!mCommandQueue.panelsEnabled()) { return; } if (start) { mNotificationPanel.startWaitingForOpenPanelGesture(); + setPanelExpanded(true); } else { - mNotificationPanel.stopWaitingForOpenPanelGesture(); + mNotificationPanel.stopWaitingForOpenPanelGesture(velocity); } } @@ -2385,6 +2387,10 @@ public class StatusBar extends SystemUI implements DemoMode, mLightBarController.dump(fd, pw, args); } + if (mKeyguardBypassController != null) { + mKeyguardBypassController.dump(pw); + } + if (mKeyguardUpdateMonitor != null) { mKeyguardUpdateMonitor.dump(fd, pw, args); } @@ -3169,6 +3175,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanel.onAffordanceLaunchEnded(); mNotificationPanel.animate().cancel(); mNotificationPanel.setAlpha(1f); + ViewGroupFadeHelper.reset(mNotificationPanel); updateScrimController(); Trace.endSection(); return staying; @@ -3433,7 +3440,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanel.resetViews(dozingAnimated); updateQsExpansionEnabled(); - mKeyguardViewMediator.setAodShowing(mDozing); + mKeyguardViewMediator.setDozing(mDozing); mEntryManager.updateNotifications(); updateDozingState(); 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 20e8e773e91c..da85039039f2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.plugins.ActivityStarter.OnDismissAction; +import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_UNLOCK_FADING; import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK; import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING; @@ -51,6 +52,7 @@ import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.notification.ViewGroupFadeHelper; import com.android.systemui.statusbar.phone.KeyguardBouncer.BouncerExpansionCallback; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardMonitor; @@ -82,6 +84,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb // make everything a bit slower to bridge a gap until the user is unlocked and home screen has // dranw its first frame. private static final long KEYGUARD_DISMISS_DURATION_LOCKED = 2000; + private static final long BYPASS_PANEL_FADE_DURATION = 67; private static String TAG = "StatusBarKeyguardViewManager"; @@ -132,6 +135,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private ViewGroup mContainer; private ViewGroup mLockIconContainer; + private View mNotificationContainer; protected KeyguardBouncer mBouncer; protected boolean mShowing; @@ -165,9 +169,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb (KeyguardMonitorImpl) Dependency.get(KeyguardMonitor.class); private final NotificationMediaManager mMediaManager = Dependency.get(NotificationMediaManager.class); - private final StatusBarStateController mStatusBarStateController = - Dependency.get(StatusBarStateController.class); + private final SysuiStatusBarStateController mStatusBarStateController = + (SysuiStatusBarStateController) Dependency.get(StatusBarStateController.class); private final DockManager mDockManager; + private KeyguardBypassController mBypassController; private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @@ -205,7 +210,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb NotificationPanelView notificationPanelView, BiometricUnlockController biometricUnlockController, DismissCallbackRegistry dismissCallbackRegistry, - ViewGroup lockIconContainer) { + ViewGroup lockIconContainer, View notificationContainer, + KeyguardBypassController bypassController) { mStatusBar = statusBar; mContainer = container; mLockIconContainer = lockIconContainer; @@ -218,6 +224,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mExpansionCallback); mNotificationPanelView = notificationPanelView; notificationPanelView.setExpansionListener(this); + mBypassController = bypassController; + mNotificationContainer = notificationContainer; } @Override @@ -555,12 +563,32 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mBiometricUnlockController.startKeyguardFadingAway(); hideBouncer(true /* destroyView */); if (wakeUnlockPulsing) { - mStatusBar.fadeKeyguardWhilePulsing(); + if (needsBypassFading()) { + ViewGroupFadeHelper.fadeOutAllChildrenExcept(mNotificationPanelView, + mNotificationContainer, + BYPASS_PANEL_FADE_DURATION, + () -> { + mStatusBar.hideKeyguard(); + onKeyguardFadedAway(); + }); + } else { + mStatusBar.fadeKeyguardWhilePulsing(); + } wakeAndUnlockDejank(); } else { - boolean staying = mStatusBar.hideKeyguard(); + boolean staying = mStatusBarStateController.leaveOpenOnKeyguardHide(); if (!staying) { mStatusBarWindowController.setKeyguardFadingAway(true); + if (needsBypassFading()) { + ViewGroupFadeHelper.fadeOutAllChildrenExcept(mNotificationPanelView, + mNotificationContainer, + BYPASS_PANEL_FADE_DURATION, + () -> { + mStatusBar.hideKeyguard(); + }); + } else { + mStatusBar.hideKeyguard(); + } // hide() will happen asynchronously and might arrive after the scrims // were already hidden, this means that the transition callback won't // be triggered anymore and StatusBarWindowController will be forever in @@ -568,6 +596,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mStatusBar.updateScrimController(); wakeAndUnlockDejank(); } else { + mStatusBar.hideKeyguard(); mStatusBar.finishKeyguardFadingAway(); mBiometricUnlockController.finishKeyguardFadingAway(); } @@ -580,6 +609,13 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb StatsLog.KEYGUARD_STATE_CHANGED__STATE__HIDDEN); } + private boolean needsBypassFading() { + return (mBiometricUnlockController.getMode() == MODE_UNLOCK_FADING + || mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING + || mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK) + && mBypassController.getBypassEnabled(); + } + @Override public void onDensityOrFontScaleChanged() { hideBouncer(true /* destroyView */); @@ -602,6 +638,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public void onKeyguardFadedAway() { mContainer.postDelayed(() -> mStatusBarWindowController.setKeyguardFadingAway(false), 100); + ViewGroupFadeHelper.reset(mNotificationPanelView); mStatusBar.finishKeyguardFadingAway(); mBiometricUnlockController.finishKeyguardFadingAway(); WindowManagerGlobal.getInstance().trimMemory( @@ -682,7 +719,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * animation didn't finish yet. */ public boolean bouncerIsOrWillBeShowing() { - return mBouncer.isShowing() || mBouncer.willShowSoon(); + return mBouncer.isShowing() || mBouncer.inTransit(); } public boolean isFullscreenBouncer() { @@ -821,8 +858,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * @return Whether subtle animation should be used for unlocking the device. */ public boolean shouldSubtleWindowAnimationsForUnlock() { - return mStatusBar.mKeyguardBypassController.getBypassEnabled() - && mStatusBar.mState == StatusBarState.KEYGUARD && !mBouncer.isAnimatingAway(); + return needsBypassFading(); } public boolean isGoingToNotificationShade() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index b21ba096c361..45627631efe1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -163,7 +163,8 @@ public class MobileSignalController extends SignalController< | PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE | PhoneStateListener.LISTEN_DATA_ACTIVITY - | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE); + | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE + | PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE); mContext.getContentResolver().registerContentObserver(Global.getUriFor(Global.MOBILE_DATA), true, mObserver); mContext.getContentResolver().registerContentObserver(Global.getUriFor( @@ -636,6 +637,13 @@ public class MobileSignalController extends SignalController< updateTelephony(); } + + @Override + public void onActiveDataSubscriptionIdChanged(int subId) { + if (DEBUG) Log.d(mTag, "onActiveDataSubscriptionIdChanged: subId=" + subId); + updateDataSim(); + updateTelephony(); + } }; static class MobileIconGroup extends SignalController.IconGroup { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index f50cf5a70cdc..1b33aefd1634 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 @@ -29,6 +29,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.view.View; import android.view.ViewGroup; import androidx.test.filters.SmallTest; @@ -39,6 +40,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.SysuiStatusBarStateController; import org.junit.Before; import org.junit.Test; @@ -70,7 +72,11 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @Mock private ViewGroup mLockIconContainer; @Mock - private StatusBarStateController mStatusBarStateController; + private SysuiStatusBarStateController mStatusBarStateController; + @Mock + private View mNotificationContainer; + @Mock + private KeyguardBypassController mBypassController; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Before @@ -83,7 +89,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mViewMediatorCallback, mLockPatternUtils); mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer, mNotificationPanelView, mBiometrucUnlockController, mDismissCallbackRegistry, - mLockIconContainer); + mLockIconContainer, mNotificationContainer, mBypassController); mStatusBarKeyguardViewManager.show(null); } @@ -221,9 +227,11 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { NotificationPanelView notificationPanelView, BiometricUnlockController fingerprintUnlockController, DismissCallbackRegistry dismissCallbackRegistry, - ViewGroup lockIconContainer) { + ViewGroup lockIconContainer, View notificationContainer, + KeyguardBypassController bypassController) { super.registerStatusBar(statusBar, container, notificationPanelView, - fingerprintUnlockController, dismissCallbackRegistry, lockIconContainer); + fingerprintUnlockController, dismissCallbackRegistry, lockIconContainer, + notificationContainer, bypassController); mBouncer = StatusBarKeyguardViewManagerTest.this.mBouncer; } } diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java index b6fa1570cdb0..c0f10a3c86e1 100644 --- a/services/core/java/com/android/server/MmsServiceBroker.java +++ b/services/core/java/com/android/server/MmsServiceBroker.java @@ -37,6 +37,7 @@ import android.os.SystemClock; import android.os.UserHandle; import android.service.carrier.CarrierMessagingService; import android.telephony.SmsManager; +import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Slog; @@ -331,7 +332,7 @@ public class MmsServiceBroker extends SystemService { @Override public void sendMessage(int subId, String callingPkg, Uri contentUri, String locationUrl, Bundle configOverrides, PendingIntent sentIntent) - throws RemoteException { + throws RemoteException { Slog.d(TAG, "sendMessage() by " + callingPkg); mContext.enforceCallingPermission(Manifest.permission.SEND_SMS, "Send MMS message"); if (getAppOpsManager().noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(), @@ -341,7 +342,8 @@ public class MmsServiceBroker extends SystemService { } contentUri = adjustUriForUserAndGrantPermission(contentUri, CarrierMessagingService.SERVICE_INTERFACE, - Intent.FLAG_GRANT_READ_URI_PERMISSION); + Intent.FLAG_GRANT_READ_URI_PERMISSION, + subId); getServiceGuarded().sendMessage(subId, callingPkg, contentUri, locationUrl, configOverrides, sentIntent); } @@ -360,7 +362,8 @@ public class MmsServiceBroker extends SystemService { } contentUri = adjustUriForUserAndGrantPermission(contentUri, CarrierMessagingService.SERVICE_INTERFACE, - Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION, + subId); getServiceGuarded().downloadMessage(subId, callingPkg, locationUrl, contentUri, configOverrides, downloadedIntent); @@ -388,7 +391,7 @@ public class MmsServiceBroker extends SystemService { @Override public Uri importMultimediaMessage(String callingPkg, Uri contentUri, String messageId, long timestampSecs, boolean seen, boolean read) - throws RemoteException { + throws RemoteException { if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(), callingPkg) != AppOpsManager.MODE_ALLOWED) { // Silently fail AppOps failure due to not being the default SMS app @@ -496,12 +499,12 @@ public class MmsServiceBroker extends SystemService { * even if the caller is not in the primary user. * * @param contentUri The Uri to adjust - * @param action The intent action used to find the associated carrier app + * @param action The intent action used to find the associated carrier app * @param permission The permission to add * @return The adjusted Uri containing the calling userId. */ private Uri adjustUriForUserAndGrantPermission(Uri contentUri, String action, - int permission) { + int permission, int subId) { final Intent grantIntent = new Intent(); grantIntent.setData(contentUri); grantIntent.setFlags(permission); @@ -521,9 +524,10 @@ public class MmsServiceBroker extends SystemService { // Grant permission for the carrier app. Intent intent = new Intent(action); TelephonyManager telephonyManager = - (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); - List<String> carrierPackages = telephonyManager.getCarrierPackageNamesForIntent( - intent); + (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); + List<String> carrierPackages = + telephonyManager.getCarrierPackageNamesForIntentAndPhone( + intent, SubscriptionManager.getPhoneId(subId)); if (carrierPackages != null && carrierPackages.size() == 1) { LocalServices.getService(UriGrantsManagerInternal.class) .grantUriPermissionFromIntent(callingUid, carrierPackages.get(0), diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index e66e596d5038..f7e825eecc12 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -1027,7 +1027,12 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { log(str); } mLocalLog.log(str); - if (validatePhoneId(phoneId)) { + // for service state updates, don't notify clients when subId is invalid. This prevents + // us from sending incorrect notifications like b/133140128 + // In the future, we can remove this logic for every notification here and add a + // callback so listeners know when their PhoneStateListener's subId becomes invalid, but + // for now we use the simplest fix. + if (validatePhoneId(phoneId) && SubscriptionManager.isValidSubscriptionId(subId)) { mServiceState[phoneId] = state; for (Record r : mRecords) { @@ -1059,7 +1064,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } } else { - log("notifyServiceStateForSubscriber: INVALID phoneId=" + phoneId); + log("notifyServiceStateForSubscriber: INVALID phoneId=" + phoneId + + " or subId=" + subId); } handleRemoveListLocked(); } diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index bc7da3fe2edc..30a356325ada 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -413,15 +413,15 @@ final class UiModeManagerService extends SystemService { try { synchronized (mLock) { if (mNightMode != mode) { - if (UserManager.get(getContext()).isPrimaryUser()) { - SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, - Integer.toString(mode)); - } - // Only persist setting if not in car mode if (!mCarModeEnabled) { Secure.putIntForUser(getContext().getContentResolver(), Secure.UI_NIGHT_MODE, mode, user); + + if (UserManager.get(getContext()).isPrimaryUser()) { + SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, + Integer.toString(mode)); + } } mNightMode = mode; diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index 0c4f0bd0edc6..f08423eb2016 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -497,9 +497,9 @@ public abstract class BiometricServiceBase extends SystemService } } - private final class BiometricTaskStackListener extends TaskStackListener { + private final Runnable mOnTaskStackChangedRunnable = new Runnable() { @Override - public void onTaskStackChanged() { + public void run() { try { if (!(mCurrentClient instanceof AuthenticationClient)) { return; @@ -514,8 +514,8 @@ public abstract class BiometricServiceBase extends SystemService final String topPackage = runningTasks.get(0).topActivity.getPackageName(); if (!topPackage.contentEquals(currentClient) && !mCurrentClient.isAlreadyDone()) { - Slog.e(getTag(), "Stopping background authentication, top: " + topPackage - + " currentClient: " + currentClient); + Slog.e(getTag(), "Stopping background authentication, top: " + + topPackage + " currentClient: " + currentClient); mCurrentClient.stop(false /* initiatedByClient */); } } @@ -523,6 +523,13 @@ public abstract class BiometricServiceBase extends SystemService Slog.e(getTag(), "Unable to get running tasks", e); } } + }; + + private final class BiometricTaskStackListener extends TaskStackListener { + @Override + public void onTaskStackChanged() { + mHandler.post(mOnTaskStackChangedRunnable); + } } private final class ResetClientStateRunnable implements Runnable { diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index 72bac7494804..a38abdc1bed0 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -63,6 +63,7 @@ import com.android.server.SystemServerInitThreadPool; import com.android.server.biometrics.AuthenticationClient; import com.android.server.biometrics.BiometricServiceBase; import com.android.server.biometrics.BiometricUtils; +import com.android.server.biometrics.ClientMonitor; import com.android.server.biometrics.Constants; import com.android.server.biometrics.EnumerateClient; import com.android.server.biometrics.RemovalClient; @@ -342,7 +343,16 @@ public class FaceService extends BiometricServiceBase { @Override // Binder call public int revokeChallenge(IBinder token) { checkPermission(MANAGE_BIOMETRIC); - return startRevokeChallenge(token); + // TODO(b/137106905): Schedule binder calls in FaceService to avoid deadlocks. + if (getCurrentClient() == null) { + // if we aren't handling any other HIDL calls (mCurrentClient == null), revoke the + // challenge right away. + return startRevokeChallenge(token); + } else { + // postpone revoking the challenge until we finish processing the current HIDL call. + mRevokeChallengePending = true; + return Status.OK; + } } @Override // Binder call @@ -812,6 +822,7 @@ public class FaceService extends BiometricServiceBase { @GuardedBy("this") private IBiometricsFace mDaemon; private UsageStats mUsageStats; + private boolean mRevokeChallengePending = false; // One of the AuthenticationClient constants private int mCurrentUserLockoutMode; @@ -1041,6 +1052,15 @@ public class FaceService extends BiometricServiceBase { } @Override + protected void removeClient(ClientMonitor client) { + super.removeClient(client); + if (mRevokeChallengePending) { + startRevokeChallenge(null); + mRevokeChallengePending = false; + } + } + + @Override public void onStart() { super.onStart(); publishBinderService(Context.FACE_SERVICE, new FaceServiceWrapper()); @@ -1251,7 +1271,11 @@ public class FaceService extends BiometricServiceBase { return 0; } try { - return daemon.revokeChallenge(); + final int res = daemon.revokeChallenge(); + if (res != Status.OK) { + Slog.e(TAG, "revokeChallenge returned " + res); + } + return res; } catch (RemoteException e) { Slog.e(TAG, "startRevokeChallenge failed", e); } diff --git a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java index c52921ef344b..16cf7eef6a1e 100644 --- a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java +++ b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java @@ -75,6 +75,14 @@ public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSyst mMaster = master; mLock = lock; mUserId = userId; + updateIsSetupComplete(userId); + } + + /** Updates whether setup is complete for current user */ + private void updateIsSetupComplete(@UserIdInt int userId) { + final String setupComplete = Settings.Secure.getStringForUser( + getContext().getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, userId); + mSetupComplete = "1".equals(setupComplete); } /** @@ -143,9 +151,7 @@ public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSyst + ", disabled=" + disabled + ", mDisabled=" + mDisabled); } - final String setupComplete = Settings.Secure.getStringForUser( - getContext().getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, mUserId); - mSetupComplete = "1".equals(setupComplete); + updateIsSetupComplete(mUserId); mDisabled = disabled; updateServiceInfoLocked(); diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 6c34e1313f73..d3346cddf3d0 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -232,7 +232,6 @@ import com.android.server.ServiceThread; import com.android.server.SystemConfig; import libcore.io.IoUtils; -import libcore.util.EmptyArray; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; @@ -540,7 +539,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private final SparseArray<String> mSubIdToSubscriberId = new SparseArray<>(); /** Set of all merged subscriberId as of last update */ @GuardedBy("mNetworkPoliciesSecondLock") - private String[] mMergedSubscriberIds = EmptyArray.STRING; + private List<String[]> mMergedSubscriberIds = new ArrayList<>(); /** * Indicates the uids restricted by admin from accessing metered data. It's a mapping from @@ -1801,7 +1800,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class); final int[] subIds = ArrayUtils.defeatNullable(sm.getActiveSubscriptionIdList()); - final String[] mergedSubscriberIds = ArrayUtils.defeatNullable(tm.getMergedSubscriberIds()); + final List<String[]> mergedSubscriberIdsList = new ArrayList(); final SparseArray<String> subIdToSubscriberId = new SparseArray<>(subIds.length); for (int subId : subIds) { @@ -1811,6 +1810,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } else { Slog.wtf(TAG, "Missing subscriberId for subId " + subId); } + + String[] mergedSubscriberId = ArrayUtils.defeatNullable( + tm.createForSubscriptionId(subId).getMergedSubscriberIdsFromGroup()); + mergedSubscriberIdsList.add(mergedSubscriberId); } synchronized (mNetworkPoliciesSecondLock) { @@ -1820,7 +1823,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { subIdToSubscriberId.valueAt(i)); } - mMergedSubscriberIds = mergedSubscriberIds; + mMergedSubscriberIds = mergedSubscriberIdsList; } Trace.traceEnd(TRACE_TAG_NETWORK); @@ -3373,8 +3376,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { fout.decreaseIndent(); fout.println(); - fout.println("Merged subscriptions: " - + Arrays.toString(NetworkIdentity.scrubSubscriberId(mMergedSubscriberIds))); + for (String[] mergedSubscribers : mMergedSubscriberIds) { + fout.println("Merged subscriptions: " + Arrays.toString( + NetworkIdentity.scrubSubscriberId(mergedSubscribers))); + } fout.println(); fout.println("Policy for UIDs:"); diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index a7da3ec950f4..d3e5df5d62d1 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -2269,6 +2269,11 @@ public class PermissionManagerService { return; } + // Permission is already revoked, no need to do anything. + if (!permissionsState.hasRuntimePermission(permName, userId)) { + return; + } + if (permissionsState.revokeRuntimePermission(bp, userId) == PERMISSION_OPERATION_FAILURE) { return; diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 037293f9536c..a569bffef141 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -798,7 +798,7 @@ public final class PermissionPolicyService extends SystemService { @Override public boolean checkStartActivity(@NonNull Intent intent, int callingUid, @Nullable String callingPackage) { - if (callingPackage != null && isActionRemovedForCallingPackage(intent.getAction(), + if (callingPackage != null && isActionRemovedForCallingPackage(intent, callingUid, callingPackage)) { Slog.w(LOG_TAG, "Action Removed: starting " + intent.toString() + " from " + callingPackage + " (uid=" + callingUid + ")"); @@ -811,8 +811,9 @@ public final class PermissionPolicyService extends SystemService { * Check if the intent action is removed for the calling package (often based on target SDK * version). If the action is removed, we'll silently cancel the activity launch. */ - private boolean isActionRemovedForCallingPackage(@Nullable String action, + private boolean isActionRemovedForCallingPackage(@NonNull Intent intent, int callingUid, @NonNull String callingPackage) { + String action = intent.getAction(); if (action == null) { return false; } @@ -821,15 +822,19 @@ public final class PermissionPolicyService extends SystemService { case Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT: { ApplicationInfo applicationInfo; try { - applicationInfo = getContext().getPackageManager().getApplicationInfo( - callingPackage, 0); + applicationInfo = getContext().getPackageManager().getApplicationInfoAsUser( + callingPackage, 0, UserHandle.getUserId(callingUid)); + if (applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q) { + // Applications targeting Q or higher should use + // RoleManager.createRequestRoleIntent() instead. + return true; + } } catch (PackageManager.NameNotFoundException e) { Slog.i(LOG_TAG, "Cannot find application info for " + callingPackage); - return false; } - // Applications targeting Q should use RoleManager.createRequestRoleIntent() - // instead. - return applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q; + // Make sure RequestRoleActivity can know the calling package if we allow it. + intent.putExtra(Intent.EXTRA_CALLING_PACKAGE, callingPackage); + return false; } default: return false; diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index e107c9aedf38..08c1bb536211 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -86,9 +86,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { private static final String TAG = "RollbackManager"; - // Rollbacks expire after 48 hours. + // Rollbacks expire after 14 days. private static final long DEFAULT_ROLLBACK_LIFETIME_DURATION_MILLIS = - TimeUnit.HOURS.toMillis(48); + TimeUnit.DAYS.toMillis(14); // Lock used to synchronize accesses to in-memory rollback data // structures. By convention, methods with the suffix "Locked" require @@ -1289,7 +1289,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { private boolean packageVersionsEqual(VersionedPackage a, VersionedPackage b) { - return a.getPackageName().equals(b.getPackageName()) + return a != null && b != null + && a.getPackageName().equals(b.getPackageName()) && a.getLongVersionCode() == b.getLongVersionCode(); } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 9908b3657121..b0f1e5d69be4 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1172,8 +1172,16 @@ public class WallpaperManagerService extends IWallpaperManager.Stub return false; } final int displayId = display.getDisplayId(); - return displayId == DEFAULT_DISPLAY - || mWindowManagerInternal.shouldShowSystemDecorOnDisplay(displayId); + if (displayId == DEFAULT_DISPLAY) { + return true; + } + + final long ident = Binder.clearCallingIdentity(); + try { + return mWindowManagerInternal.shouldShowSystemDecorOnDisplay(displayId); + } finally { + Binder.restoreCallingIdentity(ident); + } } void forEachDisplayConnector(Consumer<DisplayConnector> action) { diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 03cae429904f..eab5e0dd270e 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -79,6 +79,7 @@ import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; import static com.android.server.wm.WindowManagerService.logWithStack; import static com.android.server.wm.WindowState.LEGACY_POLICY_VISIBILITY; +import static com.android.server.wm.WindowStateAnimator.HAS_DRAWN; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM; @@ -540,6 +541,18 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree // If the app was already visible, don't reset the waitingToShow state. if (isHidden()) { waitingToShow = true; + + // Let's reset the draw state in order to prevent the starting window to be + // immediately dismissed when the app still has the surface. + forAllWindows(w -> { + if (w.mWinAnimator.mDrawState == HAS_DRAWN) { + w.mWinAnimator.resetDrawState(); + + // Force add to mResizingWindows, so that we are guaranteed to get + // another reportDrawn callback. + w.resetLastContentInsets(); + } + }, true /* traverseTopToBottom */); } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 3c29e5d84bec..a1b87605ac1f 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -140,7 +140,7 @@ import static com.android.server.wm.WindowManagerService.logSurface; import static com.android.server.wm.WindowState.RESIZE_HANDLE_WIDTH_IN_DP; import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING; import static com.android.server.wm.WindowStateAnimator.READY_TO_SHOW; -import static com.android.server.wm.utils.RegionUtils.forEachRect; +import static com.android.server.wm.utils.RegionUtils.forEachRectReverse; import static com.android.server.wm.utils.RegionUtils.rectListToRegion; import android.animation.AnimationHandler; @@ -5172,7 +5172,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final int[] remainingLeftRight = {mSystemGestureExclusionLimit, mSystemGestureExclusionLimit}; - // Traverse all windows bottom up to assemble the gesture exclusion rects. + // Traverse all windows top down to assemble the gesture exclusion rects. // For each window, we only take the rects that fall within its touchable region. forAllWindows(w -> { if (w.cantReceiveTouchInput() || !w.isVisible() @@ -5180,23 +5180,25 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo || unhandled.isEmpty()) { return; } - final boolean modal = - (w.mAttrs.flags & (FLAG_NOT_TOUCH_MODAL | FLAG_NOT_FOCUSABLE)) == 0; // Get the touchable region of the window, and intersect with where the screen is still // touchable, i.e. touchable regions on top are not covering it yet. - w.getTouchableRegion(touchableRegion); + w.getEffectiveTouchableRegion(touchableRegion); touchableRegion.op(unhandled, Op.INTERSECT); - rectListToRegion(w.getSystemGestureExclusion(), local); + if (w.isImplicitlyExcludingAllSystemGestures()) { + local.set(touchableRegion); + } else { + rectListToRegion(w.getSystemGestureExclusion(), local); - // Transform to display coordinates - local.scale(w.mGlobalScale); - final Rect frame = w.getWindowFrames().mFrame; - local.translate(frame.left, frame.top); + // Transform to display coordinates + local.scale(w.mGlobalScale); + final Rect frame = w.getWindowFrames().mFrame; + local.translate(frame.left, frame.top); - // A window can only exclude system gestures where it is actually touchable - local.op(touchableRegion, Op.INTERSECT); + // A window can only exclude system gestures where it is actually touchable + local.op(touchableRegion, Op.INTERSECT); + } // Apply restriction if necessary. if (needsGestureExclusionRestrictions(w, mLastDispatchedSystemUiVisibility)) { @@ -5255,13 +5257,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo r.op(edge, Op.INTERSECT); final int[] remaining = {limit}; - forEachRect(r, rect -> { + forEachRectReverse(r, rect -> { if (remaining[0] <= 0) { return; } final int height = rect.height(); if (height > remaining[0]) { - rect.bottom = rect.top + remaining[0]; + rect.top = rect.bottom - remaining[0]; } remaining[0] -= height; global.op(rect, Op.UNION); diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 1d76a71aaea1..b1bc21977405 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -569,7 +569,6 @@ public class DockedStackDividerController { mMaximizeMeetFraction = getClipRevealMeetFraction(stack); animDuration = (long) (mAnimationDuration * mMaximizeMeetFraction); } - mService.mAtmInternal.notifyDockedStackMinimizedChanged(minimizedDock); final int size = mDockedStackListeners.beginBroadcast(); for (int i = 0; i < size; ++i) { final IDockedStackListener listener = mDockedStackListeners.getBroadcastItem(i); @@ -581,6 +580,9 @@ public class DockedStackDividerController { } } mDockedStackListeners.finishBroadcast(); + // Only notify ATM after we update the remote listeners, otherwise it may trigger another + // minimize change, which would lead to an inversion of states send to the listeners + mService.mAtmInternal.notifyDockedStackMinimizedChanged(minimizedDock); } void notifyDockSideChanged(int newDockSide) { diff --git a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java index c0f53b819125..5726cb2d87d4 100644 --- a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java +++ b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java @@ -16,60 +16,102 @@ package com.android.server.wm; +import static android.provider.DeviceConfig.WindowManager.KEY_HIGH_REFRESH_RATE_BLACKLIST; + import android.annotation.NonNull; -import android.os.SystemProperties; +import android.annotation.Nullable; +import android.content.res.Resources; +import android.provider.DeviceConfig; import android.util.ArraySet; +import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BackgroundThread; + +import java.io.PrintWriter; +import java.util.concurrent.Executor; /** * A Blacklist for packages that should force the display out of high refresh rate. */ class HighRefreshRateBlacklist { - private static final String SYSPROP_KEY = "ro.window_manager.high_refresh_rate_blacklist"; - private static final String SYSPROP_KEY_LENGTH_SUFFIX = "_length"; - private static final String SYSPROP_KEY_ENTRY_SUFFIX = "_entry"; - private static final int MAX_ENTRIES = 50; + private final ArraySet<String> mBlacklistedPackages = new ArraySet<>(); + @NonNull + private final String[] mDefaultBlacklist; + private final Object mLock = new Object(); - private ArraySet<String> mBlacklistedPackages = new ArraySet<>(); - - static HighRefreshRateBlacklist create() { - return new HighRefreshRateBlacklist(new SystemPropertyGetter() { + static HighRefreshRateBlacklist create(@NonNull Resources r) { + return new HighRefreshRateBlacklist(r, new DeviceConfigInterface() { @Override - public int getInt(String key, int def) { - return SystemProperties.getInt(key, def); + public @Nullable String getProperty(@NonNull String namespace, @NonNull String name) { + return DeviceConfig.getProperty(namespace, name); } - - @Override - public String get(String key) { - return SystemProperties.get(key); + public void addOnPropertyChangedListener(@NonNull String namespace, + @NonNull Executor executor, + @NonNull DeviceConfig.OnPropertyChangedListener listener) { + DeviceConfig.addOnPropertyChangedListener(namespace, executor, listener); } }); } @VisibleForTesting - HighRefreshRateBlacklist(SystemPropertyGetter propertyGetter) { + HighRefreshRateBlacklist(Resources r, DeviceConfigInterface deviceConfig) { + mDefaultBlacklist = r.getStringArray(R.array.config_highRefreshRateBlacklist); + deviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + BackgroundThread.getExecutor(), new OnPropertyChangedListener()); + final String property = deviceConfig.getProperty(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + KEY_HIGH_REFRESH_RATE_BLACKLIST); + updateBlacklist(property); + } - // Read and populate the blacklist - final int length = Math.min( - propertyGetter.getInt(SYSPROP_KEY + SYSPROP_KEY_LENGTH_SUFFIX, 0), - MAX_ENTRIES); - for (int i = 1; i <= length; i++) { - final String packageName = propertyGetter.get( - SYSPROP_KEY + SYSPROP_KEY_ENTRY_SUFFIX + i); - if (!packageName.isEmpty()) { - mBlacklistedPackages.add(packageName); + private void updateBlacklist(@Nullable String property) { + synchronized (mLock) { + mBlacklistedPackages.clear(); + if (property != null) { + String[] packages = property.split(","); + for (String pkg : packages) { + String pkgName = pkg.trim(); + if (!pkgName.isEmpty()) { + mBlacklistedPackages.add(pkgName); + } + } + } else { + // If there's no config, or the config has been deleted, fallback to the device's + // default blacklist + for (String pkg : mDefaultBlacklist) { + mBlacklistedPackages.add(pkg); + } } } } boolean isBlacklisted(String packageName) { - return mBlacklistedPackages.contains(packageName); + synchronized (mLock) { + return mBlacklistedPackages.contains(packageName); + } + } + void dump(PrintWriter pw) { + pw.println("High Refresh Rate Blacklist"); + pw.println(" Packages:"); + synchronized (mLock) { + for (String pkg : mBlacklistedPackages) { + pw.println(" " + pkg); + } + } } - interface SystemPropertyGetter { - int getInt(String key, int def); - @NonNull String get(String key); + interface DeviceConfigInterface { + @Nullable String getProperty(@NonNull String namespace, @NonNull String name); + void addOnPropertyChangedListener(@NonNull String namespace, @NonNull Executor executor, + @NonNull DeviceConfig.OnPropertyChangedListener listener); + } + + private class OnPropertyChangedListener implements DeviceConfig.OnPropertyChangedListener { + public void onPropertyChanged(@NonNull String namespace, @NonNull String name, + @Nullable String value) { + updateBlacklist(value); + } } } + diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 46a03efed810..f356b51ebb7b 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -32,6 +32,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Process.SYSTEM_UID; import static android.os.Process.myPid; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; +import static android.provider.DeviceConfig.WindowManager.KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE; import static android.provider.DeviceConfig.WindowManager.KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP; import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS; import static android.view.Display.DEFAULT_DISPLAY; @@ -844,6 +845,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean mWindowsChanged = false; int mSystemGestureExclusionLimitDp; + boolean mSystemGestureExcludedByPreQStickyImmersive; public interface WindowChangeListener { public void windowsChanged(); @@ -852,7 +854,7 @@ public class WindowManagerService extends IWindowManager.Stub final Configuration mTempConfiguration = new Configuration(); - final HighRefreshRateBlacklist mHighRefreshRateBlacklist = HighRefreshRateBlacklist.create(); + final HighRefreshRateBlacklist mHighRefreshRateBlacklist; // If true, only the core apps and services are being launched because the device // is in a special boot mode, such as being encrypted or waiting for a decryption password. @@ -1139,16 +1141,26 @@ public class WindowManagerService extends IWindowManager.Stub this, mInputManager, mActivityTaskManager, mH.getLooper()); mDragDropController = new DragDropController(this, mH.getLooper()); + mHighRefreshRateBlacklist = HighRefreshRateBlacklist.create(context.getResources()); + mSystemGestureExclusionLimitDp = Math.max(MIN_GESTURE_EXCLUSION_LIMIT_DP, DeviceConfig.getInt(DeviceConfig.NAMESPACE_WINDOW_MANAGER, KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP, 0)); + mSystemGestureExcludedByPreQStickyImmersive = + DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE, false); DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_WINDOW_MANAGER, new HandlerExecutor(mH), properties -> { synchronized (mGlobalLock) { final int exclusionLimitDp = Math.max(MIN_GESTURE_EXCLUSION_LIMIT_DP, properties.getInt(KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP, 0)); - if (mSystemGestureExclusionLimitDp != exclusionLimitDp) { + final boolean excludedByPreQSticky = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_WINDOW_MANAGER, + KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE, false); + if (mSystemGestureExcludedByPreQStickyImmersive != excludedByPreQSticky + || mSystemGestureExclusionLimitDp != exclusionLimitDp) { mSystemGestureExclusionLimitDp = exclusionLimitDp; + mSystemGestureExcludedByPreQStickyImmersive = excludedByPreQSticky; mRoot.forAllDisplays(DisplayContent::updateSystemGestureExclusionLimit); } } @@ -5912,6 +5924,12 @@ public class WindowManagerService extends IWindowManager.Stub mRoot.dumpTokens(pw, dumpAll); } + + private void dumpHighRefreshRateBlacklist(PrintWriter pw) { + pw.println("WINDOW MANAGER HIGH REFRESH RATE BLACKLIST (dumpsys window refresh)"); + mHighRefreshRateBlacklist.dump(pw); + } + private void dumpTraceStatus(PrintWriter pw) { pw.println("WINDOW MANAGER TRACE (dumpsys window trace)"); pw.print(mWindowTracing.getStatus() + "\n"); @@ -6311,6 +6329,9 @@ public class WindowManagerService extends IWindowManager.Stub } else if ("trace".equals(cmd)) { dumpTraceStatus(pw); return; + } else if ("refresh".equals(cmd)) { + dumpHighRefreshRateBlacklist(pw); + return; } else { // Dumping a single name? if (!dumpWindows(pw, cmd, args, opti, dumpAll)) { @@ -6366,6 +6387,10 @@ public class WindowManagerService extends IWindowManager.Stub pw.println(separator); } dumpTraceStatus(pw); + if (dumpAll) { + pw.println(separator); + } + dumpHighRefreshRateBlacklist(pw); } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 006c8939de93..9ea6e30ef89b 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -24,6 +24,8 @@ import static android.os.PowerManager.DRAW_WAKE_LOCK; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.SurfaceControl.Transaction; +import static android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; +import static android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; @@ -155,6 +157,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; import android.os.Binder; +import android.os.Build; import android.os.Debug; import android.os.IBinder; import android.os.PowerManager; @@ -667,6 +670,15 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return true; } + boolean isImplicitlyExcludingAllSystemGestures() { + final int immersiveStickyFlags = + SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + final boolean immersiveSticky = + (mSystemUiVisibility & immersiveStickyFlags) == immersiveStickyFlags; + return immersiveSticky && mWmService.mSystemGestureExcludedByPreQStickyImmersive + && mAppToken != null && mAppToken.mTargetSdk < Build.VERSION_CODES.Q; + } + interface PowerManagerWrapper { void wakeUp(long time, @WakeReason int reason, String details); @@ -3011,6 +3023,25 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP subtractTouchExcludeRegionIfNeeded(outRegion); } + /** + * Get the effective touchable region in global coordinates. + * + * In contrast to {@link #getTouchableRegion}, this takes into account + * {@link WindowManager.LayoutParams#FLAG_NOT_TOUCH_MODAL touch modality.} + */ + void getEffectiveTouchableRegion(Region outRegion) { + final boolean modal = (mAttrs.flags & (FLAG_NOT_TOUCH_MODAL | FLAG_NOT_FOCUSABLE)) == 0; + final DisplayContent dc = getDisplayContent(); + + if (modal && dc != null) { + outRegion.set(dc.getBounds()); + cropRegionToStackBoundsIfNeeded(outRegion); + subtractTouchExcludeRegionIfNeeded(outRegion); + } else { + getTouchableRegion(outRegion); + } + } + private void setTouchableRegionCropIfNeeded(InputWindowHandle handle) { final Task task = getTask(); if (task == null || !task.cropWindowsToStackBounds()) { diff --git a/services/core/java/com/android/server/wm/utils/RegionUtils.java b/services/core/java/com/android/server/wm/utils/RegionUtils.java index 8cd6f8826083..b1b30701df4f 100644 --- a/services/core/java/com/android/server/wm/utils/RegionUtils.java +++ b/services/core/java/com/android/server/wm/utils/RegionUtils.java @@ -20,6 +20,8 @@ import android.graphics.Rect; import android.graphics.Region; import android.graphics.RegionIterator; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.function.Consumer; @@ -48,14 +50,21 @@ public class RegionUtils { /** * Applies actions on each rect contained within a {@code Region}. * + * Order is bottom to top, then right to left. + * * @param region the given region. * @param rectConsumer the action holder. */ - public static void forEachRect(Region region, Consumer<Rect> rectConsumer) { + public static void forEachRectReverse(Region region, Consumer<Rect> rectConsumer) { final RegionIterator it = new RegionIterator(region); + final ArrayList<Rect> rects = new ArrayList<>(); final Rect rect = new Rect(); while (it.next(rect)) { - rectConsumer.accept(rect); + rects.add(new Rect(rect)); } + // TODO: instead of creating an array and reversing it, expose the reverse iterator through + // JNI. + Collections.reverse(rects); + rects.forEach(rectConsumer); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index f49a57534938..7cd097ebdc2b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -26,8 +26,13 @@ import static android.view.Display.DEFAULT_DISPLAY; import static android.view.DisplayCutout.BOUNDS_POSITION_LEFT; import static android.view.DisplayCutout.BOUNDS_POSITION_TOP; import static android.view.DisplayCutout.fromBoundingRect; +import static android.view.View.SYSTEM_UI_FLAG_FULLSCREEN; +import static android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; +import static android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; @@ -789,6 +794,58 @@ public class DisplayContentTests extends WindowTestsBase { } @Test + public void testCalculateSystemGestureExclusion_modal() throws Exception { + final DisplayContent dc = createNewDisplay(); + final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, dc, "base"); + win.getAttrs().flags |= FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR; + win.setSystemGestureExclusion(Collections.singletonList(new Rect(0, 0, 1000, 1000))); + + final WindowState win2 = createWindow(null, TYPE_APPLICATION, dc, "modal"); + win2.getAttrs().flags |= FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR; + win2.getAttrs().privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION; + win2.getAttrs().width = 10; + win2.getAttrs().height = 10; + win2.setSystemGestureExclusion(Collections.emptyList()); + + dc.setLayoutNeeded(); + dc.performLayout(true /* initial */, false /* updateImeWindows */); + + win.setHasSurface(true); + win2.setHasSurface(true); + + final Region expected = Region.obtain(); + assertEquals(expected, dc.calculateSystemGestureExclusion()); + } + + @Test + public void testCalculateSystemGestureExclusion_immersiveStickyLegacyWindow() throws Exception { + synchronized (mWm.mGlobalLock) { + mWm.mSystemGestureExcludedByPreQStickyImmersive = true; + + final DisplayContent dc = createNewDisplay(); + final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, dc, "win"); + win.getAttrs().flags |= FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR; + win.getAttrs().layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + win.getAttrs().privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION; + win.getAttrs().subtreeSystemUiVisibility = win.mSystemUiVisibility = + SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION + | SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + win.mAppToken.mTargetSdk = P; + + dc.setLayoutNeeded(); + dc.performLayout(true /* initial */, false /* updateImeWindows */); + + win.setHasSurface(true); + + final Region expected = Region.obtain(); + expected.set(dc.getBounds()); + assertEquals(expected, dc.calculateSystemGestureExclusion()); + + win.setHasSurface(false); + } + } + + @Test public void testOrientationChangeLogging() { MetricsLogger mockLogger = mock(MetricsLogger.class); Configuration oldConfig = new Configuration(); diff --git a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java index 558672609304..e02b69c4b058 100644 --- a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java @@ -16,71 +16,153 @@ package com.android.server.wm; +import static android.provider.DeviceConfig.WindowManager.KEY_HIGH_REFRESH_RATE_BLACKLIST; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import android.content.res.Resources; import android.platform.test.annotations.Presubmit; +import android.provider.DeviceConfig; +import android.util.Pair; -import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; -import com.android.server.wm.HighRefreshRateBlacklist.SystemPropertyGetter; +import com.android.internal.R; +import com.android.server.wm.HighRefreshRateBlacklist.DeviceConfigInterface; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + /** * Build/Install/Run: - * atest WmTests:HighRefreshRateBlacklistTest + * atest WmTests:HighRefreshRateBlacklistTest */ @SmallTest @Presubmit -@FlakyTest public class HighRefreshRateBlacklistTest { @Test - public void testBlacklist() { - HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist( - new SystemPropertyGetter() { - - @Override - public int getInt(String key, int def) { - if ("ro.window_manager.high_refresh_rate_blacklist_length".equals(key)) { - return 2; - } - return def; - } - - @Override - public String get(String key) { - if ("ro.window_manager.high_refresh_rate_blacklist_entry1".equals(key)) { - return "com.android.sample1"; - } - if ("ro.window_manager.high_refresh_rate_blacklist_entry2".equals(key)) { - return "com.android.sample2"; - } - return ""; - } - }); + public void testDefaultBlacklist() { + final Resources r = createResources("com.android.sample1", "com.android.sample2"); + HighRefreshRateBlacklist blacklist = + new HighRefreshRateBlacklist(r, new FakeDeviceConfigInterface()); assertTrue(blacklist.isBlacklisted("com.android.sample1")); assertTrue(blacklist.isBlacklisted("com.android.sample2")); assertFalse(blacklist.isBlacklisted("com.android.sample3")); } @Test - public void testNoBlacklist() { - HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist( - new SystemPropertyGetter() { - - @Override - public int getInt(String key, int def) { - return def; - } - - @Override - public String get(String key) { - return ""; - } - }); + public void testNoDefaultBlacklist() { + final Resources r = createResources(); + HighRefreshRateBlacklist blacklist = + new HighRefreshRateBlacklist(r, new FakeDeviceConfigInterface()); + assertFalse(blacklist.isBlacklisted("com.android.sample1")); + } + + @Test + public void testDefaultBlacklistIsOverriddenByDeviceConfig() { + final Resources r = createResources("com.android.sample1"); + final FakeDeviceConfigInterface config = new FakeDeviceConfigInterface(); + config.setBlacklist("com.android.sample2,com.android.sample3"); + HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist(r, config); + assertFalse(blacklist.isBlacklisted("com.android.sample1")); + assertTrue(blacklist.isBlacklisted("com.android.sample2")); + assertTrue(blacklist.isBlacklisted("com.android.sample3")); + } + + @Test + public void testDefaultBlacklistIsOverriddenByEmptyDeviceConfig() { + final Resources r = createResources("com.android.sample1"); + final FakeDeviceConfigInterface config = new FakeDeviceConfigInterface(); + config.setBlacklist(""); + HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist(r, config); assertFalse(blacklist.isBlacklisted("com.android.sample1")); } + + @Test + public void testDefaultBlacklistIsOverriddenByDeviceConfigUpdate() { + final Resources r = createResources("com.android.sample1"); + final FakeDeviceConfigInterface config = new FakeDeviceConfigInterface(); + HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist(r, config); + + // First check that the default blacklist is in effect + assertTrue(blacklist.isBlacklisted("com.android.sample1")); + assertFalse(blacklist.isBlacklisted("com.android.sample2")); + assertFalse(blacklist.isBlacklisted("com.android.sample3")); + + // Then confirm that the DeviceConfig list has propagated and taken effect. + config.setBlacklist("com.android.sample2,com.android.sample3"); + assertFalse(blacklist.isBlacklisted("com.android.sample1")); + assertTrue(blacklist.isBlacklisted("com.android.sample2")); + assertTrue(blacklist.isBlacklisted("com.android.sample3")); + + // Finally make sure we go back to the default list if the DeviceConfig gets deleted. + config.setBlacklist(null); + assertTrue(blacklist.isBlacklisted("com.android.sample1")); + assertFalse(blacklist.isBlacklisted("com.android.sample2")); + assertFalse(blacklist.isBlacklisted("com.android.sample3")); + } + + private Resources createResources(String... defaultBlacklist) { + Resources r = mock(Resources.class); + when(r.getStringArray(R.array.config_highRefreshRateBlacklist)) + .thenReturn(defaultBlacklist); + return r; + } + + + class FakeDeviceConfigInterface implements DeviceConfigInterface { + private List<Pair<DeviceConfig.OnPropertyChangedListener, Executor>> mListeners = + new ArrayList<>(); + private String mBlacklist; + + @Override + public String getProperty(String namespace, String name) { + if (!DeviceConfig.NAMESPACE_WINDOW_MANAGER.equals(namespace) + || !KEY_HIGH_REFRESH_RATE_BLACKLIST.equals(name)) { + throw new IllegalArgumentException("Only things in NAMESPACE_WINDOW_MANAGER " + + "supported."); + } + return mBlacklist; + } + + @Override + public void addOnPropertyChangedListener(String namespace, Executor executor, + DeviceConfig.OnPropertyChangedListener listener) { + + if (!DeviceConfig.NAMESPACE_WINDOW_MANAGER.equals(namespace)) { + throw new IllegalArgumentException("Only things in NAMESPACE_WINDOW_MANAGER " + + "supported."); + } + mListeners.add(new Pair<>(listener, executor)); + } + + void setBlacklist(String blacklist) { + mBlacklist = blacklist; + CountDownLatch latch = new CountDownLatch(mListeners.size()); + for (Pair<DeviceConfig.OnPropertyChangedListener, Executor> listenerInfo : + mListeners) { + final Executor executor = listenerInfo.second; + final DeviceConfig.OnPropertyChangedListener listener = listenerInfo.first; + executor.execute(() -> { + listener.onPropertyChanged(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + KEY_HIGH_REFRESH_RATE_BLACKLIST, blacklist); + latch.countDown(); + }); + } + try { + latch.await(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + throw new RuntimeException("Failed to notify all blacklist listeners in time.", e); + } + } + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java index 1c9e50425841..2e5ce69a8564 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -49,6 +49,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { int mRotationToReport = 0; boolean mKeyguardShowingAndNotOccluded = false; + boolean mOkToAnimate = true; private Runnable mRunnableWhenAddingSplashScreen; @@ -222,7 +223,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { @Override public boolean okToAnimate() { - return true; + return mOkToAnimate; } @Override diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 484fd3b17c02..2822fccdb398 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2116,29 +2116,36 @@ public class SubscriptionManager { } /** + * TODO(b/137102918) Make this static, tests use this as an instance method currently. + * * @return the list of subId's that are active, * is never null but the length maybe 0. * @hide */ @UnsupportedAppUsage public @NonNull int[] getActiveSubscriptionIdList() { - int[] subId = null; + return getActiveSubscriptionIdList(/* visibleOnly */ true); + } + /** + * TODO(b/137102918) Make this static, tests use this as an instance method currently. + * + * @return a non-null list of subId's that are active. + * + * @hide + */ + public @NonNull int[] getActiveSubscriptionIdList(boolean visibleOnly) { try { ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); if (iSub != null) { - subId = iSub.getActiveSubIdList(/*visibleOnly*/true); + int[] subId = iSub.getActiveSubIdList(visibleOnly); + if (subId != null) return subId; } } catch (RemoteException ex) { // ignore it } - if (subId == null) { - subId = new int[0]; - } - - return subId; - + return new int[0]; } /** diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 758cd286ac1b..976cd0c577e4 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -3972,9 +3972,14 @@ public class TelephonyManager { * The returned set of subscriber IDs will include the subscriber ID corresponding to this * TelephonyManager's subId. * + * This is deprecated and {@link #getMergedSubscriberIdsFromGroup()} should be used for data + * usage merging purpose. + * TODO: remove this API. + * * @hide */ @UnsupportedAppUsage + @Deprecated public @Nullable String[] getMergedSubscriberIds() { try { ITelephony telephony = getITelephony(); @@ -3987,6 +3992,28 @@ public class TelephonyManager { } /** + * Return the set of subscriber IDs that should be considered "merged together" for data usage + * purposes. Unlike {@link #getMergedSubscriberIds()} this API merge subscriberIds based on + * subscription grouping: subscriberId of those in the same group will all be returned. + * + * <p>Requires the calling app to have READ_PRIVILEGED_PHONE_STATE permission. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public @Nullable String[] getMergedSubscriberIdsFromGroup() { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getMergedSubscriberIdsFromGroup(getSubId(), getOpPackageName()); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + } + return null; + } + + /** * Returns the MSISDN string. * for a GSM phone. Return null if it is unavailable. * @@ -4890,7 +4917,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_ACTIVITY_NONE; - return telephony.getDataActivity(); + return telephony.getDataActivityForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_ACTIVITY_NONE; @@ -4938,7 +4966,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_DISCONNECTED; - return telephony.getDataState(); + return telephony.getDataStateForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_DISCONNECTED; @@ -10788,7 +10817,6 @@ public class TelephonyManager { * @param callback Callback will be triggered once it succeeds or failed. * See {@link TelephonyManager.SetOpportunisticSubscriptionResult} * for more details. Pass null if don't care about the result. - * */ public void setPreferredOpportunisticDataSubscription(int subId, boolean needValidation, @Nullable @CallbackExecutor Executor executor, @Nullable Consumer<Integer> callback) { @@ -10796,6 +10824,12 @@ public class TelephonyManager { try { IOns iOpportunisticNetworkService = getIOns(); if (iOpportunisticNetworkService == null) { + if (executor == null || callback == null) { + return; + } + Binder.withCleanCallingIdentity(() -> executor.execute(() -> { + callback.accept(SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION); + })); return; } ISetOpportunisticDataCallback callbackStub = new ISetOpportunisticDataCallback.Stub() { @@ -10877,9 +10911,16 @@ public class TelephonyManager { if (executor == null || callback == null) { return; } - Binder.withCleanCallingIdentity(() -> executor.execute(() -> { - callback.accept(UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS); - })); + if (iOpportunisticNetworkService == null) { + /* Todo<b/130595455> passing unknown due to lack of good error codes */ + Binder.withCleanCallingIdentity(() -> executor.execute(() -> { + callback.accept(UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE); + })); + } else { + Binder.withCleanCallingIdentity(() -> executor.execute(() -> { + callback.accept(UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS); + })); + } return; } IUpdateAvailableNetworksCallback callbackStub = diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 5a27a0fb42e4..dcfd193185cf 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -308,18 +308,46 @@ interface ITelephony { */ List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg); - @UnsupportedAppUsage - int getCallState(); + @UnsupportedAppUsage + int getCallState(); /** * Returns the call state for a slot. */ - int getCallStateForSlot(int slotIndex); + int getCallStateForSlot(int slotIndex); + + /** + * Replaced by getDataActivityForSubId. + */ + int getDataActivity(); + + /** + * Returns a constant indicating the type of activity on a data connection + * (cellular). + * + * @see #DATA_ACTIVITY_NONE + * @see #DATA_ACTIVITY_IN + * @see #DATA_ACTIVITY_OUT + * @see #DATA_ACTIVITY_INOUT + * @see #DATA_ACTIVITY_DORMANT + */ + int getDataActivityForSubId(int subId); + + /** + * Replaced by getDataStateForSubId. + */ + int getDataState(); - @UnsupportedAppUsage - int getDataActivity(); - @UnsupportedAppUsage - int getDataState(); + /** + * Returns a constant indicating the current data connection state + * (cellular). + * + * @see #DATA_DISCONNECTED + * @see #DATA_CONNECTING + * @see #DATA_CONNECTED + * @see #DATA_SUSPENDED + */ + int getDataStateForSubId(int subId); /** * Returns the current active phone type as integer. @@ -1059,6 +1087,11 @@ interface ITelephony { String[] getMergedSubscriberIds(int subId, String callingPackage); /** + * @hide + */ + String[] getMergedSubscriberIdsFromGroup(int subId, String callingPackage); + + /** * Override the operator branding for the current ICCID. * * Once set, whenever the SIM is present in the device, the service diff --git a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java index 7a0ab9ca6a28..51c5d12dfe15 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java @@ -600,26 +600,21 @@ public final class TelephonyPermissions { } } - /** - * Returns whether the provided uid has carrier privileges for any active subscription ID. - */ - private static boolean checkCarrierPrivilegeForAnySubId(Context context, - Supplier<ITelephony> telephonySupplier, int uid) { + /** Returns whether the provided uid has carrier privileges for any active subscription ID. */ + private static boolean checkCarrierPrivilegeForAnySubId( + Context context, Supplier<ITelephony> telephonySupplier, int uid) { SubscriptionManager sm = (SubscriptionManager) context.getSystemService( Context.TELEPHONY_SUBSCRIPTION_SERVICE); - int[] activeSubIds = sm.getActiveSubscriptionIdList(); - if (activeSubIds != null) { - for (int activeSubId : activeSubIds) { - if (getCarrierPrivilegeStatus(telephonySupplier, activeSubId, uid) - == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { - return true; - } + int[] activeSubIds = sm.getActiveSubscriptionIdList(/* visibleOnly */ false); + for (int activeSubId : activeSubIds) { + if (getCarrierPrivilegeStatus(telephonySupplier, activeSubId, uid) + == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { + return true; } } return false; } - private static int getCarrierPrivilegeStatus( Supplier<ITelephony> telephonySupplier, int subId, int uid) { ITelephony telephony = telephonySupplier.get(); diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java index beff0c6bc308..1b002cadb07f 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java @@ -960,6 +960,7 @@ public class RollbackTest { } @Test + @Ignore("b/136605788") public void testEnableRollbackTimeoutFailsRollback() throws Exception { try { RollbackTestUtils.adoptShellPermissionIdentity( |