Merge "Move battery icon back to bottom of the screen"
diff --git a/Android.bp b/Android.bp
index 8a3f76c..b9b1bd8 100644
--- a/Android.bp
+++ b/Android.bp
@@ -721,6 +721,7 @@
"frameworks/av/camera/aidl",
"frameworks/av/media/libaudioclient/aidl",
"frameworks/native/aidl/gui",
+ "frameworks/native/libs/incidentcompanion/binder",
"system/core/storaged/binder",
"system/vold/binder",
"system/gsid/aidl",
@@ -968,7 +969,10 @@
output_params: ["store_unknown_fields=true"],
include_dirs: ["external/protobuf/src"],
},
-
+ exclude_srcs: [
+ "core/proto/android/privacy.proto",
+ "core/proto/android/section.proto",
+ ],
sdk_version: "current",
srcs: [
"core/proto/**/*.proto",
@@ -988,6 +992,10 @@
"core/proto/**/*.proto",
"libs/incident/proto/android/os/**/*.proto",
],
+ exclude_srcs: [
+ "core/proto/android/privacy.proto",
+ "core/proto/android/section.proto",
+ ],
// Protos have lots of MissingOverride and similar.
errorprone: {
javacflags: ["-XepDisableAllChecks"],
@@ -995,9 +1003,9 @@
}
// ==== c++ proto device library ==============================
-cc_library {
- name: "libplatformprotos",
- host_supported: true,
+cc_defaults {
+ name: "libplatformprotos-defaults",
+
proto: {
export_proto_headers: true,
include_dirs: ["external/protobuf/src"],
@@ -1011,8 +1019,13 @@
srcs: [
"core/proto/**/*.proto",
- "libs/incident/**/*.proto",
],
+}
+
+cc_library {
+ name: "libplatformprotos",
+ defaults: ["libplatformprotos-defaults"],
+ host_supported: true,
target: {
host: {
@@ -1024,6 +1037,9 @@
proto: {
type: "lite",
},
+ shared_libs: [
+ "libprotobuf-cpp-lite",
+ ],
shared: {
enabled: false,
},
@@ -1031,6 +1047,26 @@
},
}
+// This is the full proto version of libplatformprotos. It may only
+// be used by test code that is not shipped on the device.
+cc_library {
+ name: "libplatformprotos-test",
+ defaults: ["libplatformprotos-defaults"],
+ host_supported: false,
+
+ target: {
+ android: {
+ proto: {
+ type: "full",
+ },
+ shared: {
+ enabled: false,
+ },
+ },
+ },
+}
+
+
gensrcs {
name: "gen-platform-proto-constants",
depfile: true,
@@ -1068,6 +1104,7 @@
output_extension: "proto.h",
}
+
subdirs = [
"cmds/*",
"core/*",
diff --git a/api/current.txt b/api/current.txt
index 2a26368..1e6bf2c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5480,7 +5480,7 @@
method public int describeContents();
method public boolean getAutoExpandBubble();
method @Nullable public android.app.PendingIntent getDeleteIntent();
- method public int getDesiredHeight();
+ method @Dimension(unit=android.annotation.Dimension.DP) public int getDesiredHeight();
method @DimenRes public int getDesiredHeightResId();
method @NonNull public android.graphics.drawable.Icon getIcon();
method @NonNull public android.app.PendingIntent getIntent();
@@ -5494,7 +5494,7 @@
method @NonNull public android.app.Notification.BubbleMetadata build();
method @NonNull public android.app.Notification.BubbleMetadata.Builder setAutoExpandBubble(boolean);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setDeleteIntent(@Nullable android.app.PendingIntent);
- method @NonNull public android.app.Notification.BubbleMetadata.Builder setDesiredHeight(int);
+ method @NonNull public android.app.Notification.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=android.annotation.Dimension.DP) int);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setIcon(@NonNull android.graphics.drawable.Icon);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setIntent(@NonNull android.app.PendingIntent);
@@ -14100,8 +14100,9 @@
}
public class ComposeShader extends android.graphics.Shader {
- ctor public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.Xfermode);
- ctor public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.PorterDuff.Mode);
+ ctor @Deprecated public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.Xfermode);
+ ctor @Deprecated public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.PorterDuff.Mode);
+ ctor public ComposeShader(@NonNull android.graphics.Shader, @NonNull android.graphics.Shader, @NonNull android.graphics.BlendMode);
}
public class CornerPathEffect extends android.graphics.PathEffect {
@@ -14795,37 +14796,37 @@
field public float y;
}
- public class PorterDuff {
- ctor public PorterDuff();
+ @Deprecated public class PorterDuff {
+ ctor @Deprecated public PorterDuff();
}
- public enum PorterDuff.Mode {
- enum_constant public static final android.graphics.PorterDuff.Mode ADD;
- enum_constant public static final android.graphics.PorterDuff.Mode CLEAR;
- enum_constant public static final android.graphics.PorterDuff.Mode DARKEN;
- enum_constant public static final android.graphics.PorterDuff.Mode DST;
- enum_constant public static final android.graphics.PorterDuff.Mode DST_ATOP;
- enum_constant public static final android.graphics.PorterDuff.Mode DST_IN;
- enum_constant public static final android.graphics.PorterDuff.Mode DST_OUT;
- enum_constant public static final android.graphics.PorterDuff.Mode DST_OVER;
- enum_constant public static final android.graphics.PorterDuff.Mode LIGHTEN;
- enum_constant public static final android.graphics.PorterDuff.Mode MULTIPLY;
- enum_constant public static final android.graphics.PorterDuff.Mode OVERLAY;
- enum_constant public static final android.graphics.PorterDuff.Mode SCREEN;
- enum_constant public static final android.graphics.PorterDuff.Mode SRC;
- enum_constant public static final android.graphics.PorterDuff.Mode SRC_ATOP;
- enum_constant public static final android.graphics.PorterDuff.Mode SRC_IN;
- enum_constant public static final android.graphics.PorterDuff.Mode SRC_OUT;
- enum_constant public static final android.graphics.PorterDuff.Mode SRC_OVER;
- enum_constant public static final android.graphics.PorterDuff.Mode XOR;
+ @Deprecated public enum PorterDuff.Mode {
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode ADD;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode CLEAR;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DARKEN;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST_ATOP;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST_IN;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST_OUT;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode DST_OVER;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode LIGHTEN;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode MULTIPLY;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode OVERLAY;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SCREEN;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC_ATOP;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC_IN;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC_OUT;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode SRC_OVER;
+ enum_constant @Deprecated public static final android.graphics.PorterDuff.Mode XOR;
}
@Deprecated public class PorterDuffColorFilter extends android.graphics.ColorFilter {
ctor @Deprecated public PorterDuffColorFilter(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode);
}
- public class PorterDuffXfermode extends android.graphics.Xfermode {
- ctor public PorterDuffXfermode(android.graphics.PorterDuff.Mode);
+ @Deprecated public class PorterDuffXfermode extends android.graphics.Xfermode {
+ ctor @Deprecated public PorterDuffXfermode(android.graphics.PorterDuff.Mode);
}
public interface PostProcessor {
@@ -15387,7 +15388,8 @@
method public boolean setState(@NonNull int[]);
method public void setTint(@ColorInt int);
method public void setTintList(@Nullable android.content.res.ColorStateList);
- method public void setTintMode(@NonNull android.graphics.PorterDuff.Mode);
+ method @Deprecated public void setTintMode(@NonNull android.graphics.PorterDuff.Mode);
+ method public void setTintMode(@NonNull android.graphics.BlendMode);
method public boolean setVisible(boolean, boolean);
method public void unscheduleSelf(@NonNull Runnable);
}
@@ -15545,7 +15547,8 @@
method public void loadDrawableAsync(android.content.Context, android.graphics.drawable.Icon.OnDrawableLoadedListener, android.os.Handler);
method public android.graphics.drawable.Icon setTint(@ColorInt int);
method public android.graphics.drawable.Icon setTintList(android.content.res.ColorStateList);
- method public android.graphics.drawable.Icon setTintMode(android.graphics.PorterDuff.Mode);
+ method @Deprecated @NonNull public android.graphics.drawable.Icon setTintMode(@NonNull android.graphics.PorterDuff.Mode);
+ method @NonNull public android.graphics.drawable.Icon setTintMode(@NonNull android.graphics.BlendMode);
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.graphics.drawable.Icon> CREATOR;
field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
@@ -23041,6 +23044,9 @@
method public int getUsage();
method public int getVolumeControlStream();
method public void writeToParcel(android.os.Parcel, int);
+ field public static final int ALLOW_CAPTURE_BY_ALL = 1; // 0x1
+ field public static final int ALLOW_CAPTURE_BY_NONE = 3; // 0x3
+ field public static final int ALLOW_CAPTURE_BY_SYSTEM = 2; // 0x2
field public static final int CONTENT_TYPE_MOVIE = 3; // 0x3
field public static final int CONTENT_TYPE_MUSIC = 2; // 0x2
field public static final int CONTENT_TYPE_SONIFICATION = 4; // 0x4
@@ -23072,7 +23078,7 @@
ctor public AudioAttributes.Builder();
ctor public AudioAttributes.Builder(android.media.AudioAttributes);
method public android.media.AudioAttributes build();
- method @NonNull public android.media.AudioAttributes.Builder setAllowCapture(boolean);
+ method @NonNull public android.media.AudioAttributes.Builder setAllowedCapturePolicy(int);
method public android.media.AudioAttributes.Builder setContentType(int);
method public android.media.AudioAttributes.Builder setFlags(int);
method public android.media.AudioAttributes.Builder setLegacyStreamType(int);
@@ -25069,7 +25075,7 @@
field public static final String KEY_LANGUAGE = "language";
field public static final String KEY_LATENCY = "latency";
field public static final String KEY_LEVEL = "level";
- field public static final String KEY_MAX_BFRAMES = "max-bframes";
+ field public static final String KEY_MAX_B_FRAMES = "max-bframes";
field public static final String KEY_MAX_FPS_TO_ENCODER = "max-fps-to-encoder";
field public static final String KEY_MAX_HEIGHT = "max-height";
field public static final String KEY_MAX_INPUT_SIZE = "max-input-size";
@@ -38851,6 +38857,7 @@
field public static final String ACTION_APPLICATION_DETAILS_SETTINGS = "android.settings.APPLICATION_DETAILS_SETTINGS";
field public static final String ACTION_APPLICATION_DEVELOPMENT_SETTINGS = "android.settings.APPLICATION_DEVELOPMENT_SETTINGS";
field public static final String ACTION_APPLICATION_SETTINGS = "android.settings.APPLICATION_SETTINGS";
+ field public static final String ACTION_APP_NOTIFICATION_BUBBLE_SETTINGS = "android.settings.APP_NOTIFICATION_BUBBLE_SETTINGS";
field public static final String ACTION_APP_NOTIFICATION_SETTINGS = "android.settings.APP_NOTIFICATION_SETTINGS";
field public static final String ACTION_APP_SEARCH_SETTINGS = "android.settings.APP_SEARCH_SETTINGS";
field public static final String ACTION_APP_USAGE_SETTINGS = "android.settings.action.APP_USAGE_SETTINGS";
@@ -49718,8 +49725,9 @@
method public default CharSequence getContentDescription();
method public int getGroupId();
method public android.graphics.drawable.Drawable getIcon();
+ method @Nullable public default android.graphics.BlendMode getIconTintBlendMode();
method @Nullable public default android.content.res.ColorStateList getIconTintList();
- method @Nullable public default android.graphics.PorterDuff.Mode getIconTintMode();
+ method @Deprecated @Nullable public default android.graphics.PorterDuff.Mode getIconTintMode();
method public android.content.Intent getIntent();
method public int getItemId();
method public android.view.ContextMenu.ContextMenuInfo getMenuInfo();
@@ -49748,7 +49756,8 @@
method public android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
method public android.view.MenuItem setIcon(@DrawableRes int);
method public default android.view.MenuItem setIconTintList(@Nullable android.content.res.ColorStateList);
- method public default android.view.MenuItem setIconTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method @Deprecated @NonNull public default android.view.MenuItem setIconTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method @NonNull public default android.view.MenuItem setIconTintMode(@Nullable android.graphics.BlendMode);
method public android.view.MenuItem setIntent(android.content.Intent);
method public android.view.MenuItem setNumericShortcut(char);
method public default android.view.MenuItem setNumericShortcut(char, int);
@@ -50401,8 +50410,9 @@
method public int getAutofillType();
method @Nullable public android.view.autofill.AutofillValue getAutofillValue();
method public android.graphics.drawable.Drawable getBackground();
+ method @Nullable public android.graphics.BlendMode getBackgroundBlendMode();
method @Nullable public android.content.res.ColorStateList getBackgroundTintList();
- method @Nullable public android.graphics.PorterDuff.Mode getBackgroundTintMode();
+ method @Deprecated @Nullable public android.graphics.PorterDuff.Mode getBackgroundTintMode();
method @android.view.ViewDebug.ExportedProperty(category="layout") public int getBaseline();
method @android.view.ViewDebug.CapturedViewProperty public final int getBottom();
method protected float getBottomFadingEdgeStrength();
@@ -50433,9 +50443,10 @@
method public java.util.ArrayList<android.view.View> getFocusables(int);
method public void getFocusedRect(android.graphics.Rect);
method public android.graphics.drawable.Drawable getForeground();
+ method @Nullable public android.graphics.BlendMode getForegroundBlendMode();
method public int getForegroundGravity();
method @Nullable public android.content.res.ColorStateList getForegroundTintList();
- method @Nullable public android.graphics.PorterDuff.Mode getForegroundTintMode();
+ method @Deprecated @Nullable public android.graphics.PorterDuff.Mode getForegroundTintMode();
method public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point);
method public final boolean getGlobalVisibleRect(android.graphics.Rect);
method public android.os.Handler getHandler();
@@ -50751,7 +50762,8 @@
method @Deprecated public void setBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setBackgroundResource(@DrawableRes int);
method public void setBackgroundTintList(@Nullable android.content.res.ColorStateList);
- method public void setBackgroundTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method @Deprecated public void setBackgroundTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method public void setBackgroundTintMode(@Nullable android.graphics.BlendMode);
method public final void setBottom(int);
method public void setCameraDistance(float);
method public void setClickable(boolean);
@@ -50778,7 +50790,8 @@
method public void setForeground(android.graphics.drawable.Drawable);
method public void setForegroundGravity(int);
method public void setForegroundTintList(@Nullable android.content.res.ColorStateList);
- method public void setForegroundTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method @Deprecated public void setForegroundTintMode(@Nullable android.graphics.PorterDuff.Mode);
+ method public void setForegroundTintMode(@Nullable android.graphics.BlendMode);
method public void setHapticFeedbackEnabled(boolean);
method public void setHasTransientState(boolean);
method public void setHorizontalFadingEdgeEnabled(boolean);
diff --git a/api/system-current.txt b/api/system-current.txt
index b47f573..0dd8250 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -49,6 +49,7 @@
field @Deprecated public static final String BROADCAST_NETWORK_PRIVILEGED = "android.permission.BROADCAST_NETWORK_PRIVILEGED";
field public static final String CAMERA_DISABLE_TRANSMIT_LED = "android.permission.CAMERA_DISABLE_TRANSMIT_LED";
field public static final String CAPTURE_AUDIO_HOTWORD = "android.permission.CAPTURE_AUDIO_HOTWORD";
+ field public static final String CAPTURE_MEDIA_OUTPUT = "android.permission.CAPTURE_MEDIA_OUTPUT";
field public static final String CAPTURE_TV_INPUT = "android.permission.CAPTURE_TV_INPUT";
field public static final String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE";
field public static final String CHANGE_DEVICE_IDLE_TEMP_WHITELIST = "android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST";
@@ -76,6 +77,7 @@
field public static final String HDMI_CEC = "android.permission.HDMI_CEC";
field public static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
field public static final String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
+ field public static final String INSTALL_DYNAMIC_SYSTEM = "android.permission.INSTALL_DYNAMIC_SYSTEM";
field public static final String INSTALL_GRANT_RUNTIME_PERMISSIONS = "android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS";
field public static final String INSTALL_PACKAGE_UPDATES = "android.permission.INSTALL_PACKAGE_UPDATES";
field public static final String INSTALL_SELF_UPDATES = "android.permission.INSTALL_SELF_UPDATES";
@@ -1599,7 +1601,7 @@
method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_SHARED_LIBRARIES) public java.util.List<android.content.pm.SharedLibraryInfo> getDeclaredSharedLibraries(@NonNull String, int);
method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract String getDefaultBrowserPackageNameAsUser(int);
method @Nullable @RequiresPermission(android.Manifest.permission.SET_HARMFUL_APP_WARNINGS) public CharSequence getHarmfulAppWarning(@NonNull String);
- method public String getIncidentReportApproverPackageName();
+ method @Nullable public String getIncidentReportApproverPackageName();
method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public abstract android.graphics.drawable.Drawable getInstantAppIcon(String);
method public abstract android.content.ComponentName getInstantAppInstallerComponent();
@@ -3376,19 +3378,19 @@
public class LocationManager {
method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void flushGnssBatch();
+ method @Nullable public String getExtraLocationControllerPackage();
method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int getGnssBatchSize();
method @Nullable public android.location.GnssCapabilities getGnssCapabilities();
- method @Nullable public String getLocationControllerExtraPackage();
method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void injectGnssMeasurementCorrections(@NonNull android.location.GnssMeasurementCorrections);
- method public boolean isLocationControllerExtraPackageEnabled();
+ method public boolean isExtraLocationControllerPackageEnabled();
method public boolean isLocationEnabledForUser(@NonNull android.os.UserHandle);
method public boolean isProviderEnabledForUser(@NonNull String, @NonNull android.os.UserHandle);
method public boolean isProviderPackage(@NonNull String);
method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean registerGnssBatchedLocationCallback(long, boolean, @NonNull android.location.BatchedLocationCallback, @Nullable android.os.Handler);
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull android.location.LocationRequest, @NonNull android.location.LocationListener, @Nullable android.os.Looper);
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull android.location.LocationRequest, @NonNull android.app.PendingIntent);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackage(@NonNull String);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackageEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setExtraLocationControllerPackage(@Nullable String);
+ method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setExtraLocationControllerPackageEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean, @NonNull android.os.UserHandle);
method @Deprecated @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setProviderEnabledForUser(@NonNull String, boolean, @NonNull android.os.UserHandle);
method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean unregisterGnssBatchedLocationCallback(@NonNull android.location.BatchedLocationCallback);
@@ -3601,6 +3603,7 @@
ctor public AudioMixingRule.Builder();
method public android.media.audiopolicy.AudioMixingRule.Builder addMixRule(int, Object) throws java.lang.IllegalArgumentException;
method public android.media.audiopolicy.AudioMixingRule.Builder addRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException;
+ method @NonNull public android.media.audiopolicy.AudioMixingRule.Builder allowPrivilegedPlaybackCapture(boolean);
method public android.media.audiopolicy.AudioMixingRule build();
method public android.media.audiopolicy.AudioMixingRule.Builder excludeMixRule(int, Object) throws java.lang.IllegalArgumentException;
method public android.media.audiopolicy.AudioMixingRule.Builder excludeRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException;
@@ -5647,12 +5650,12 @@
public class DynamicSystemClient {
ctor public DynamicSystemClient(@NonNull android.content.Context);
- method @RequiresPermission("android.permission.MANAGE_DYNAMIC_SYSTEM") public void bind();
+ method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void bind();
method public void setOnStatusChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener);
method public void setOnStatusChangedListener(@NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener);
- method @RequiresPermission("android.permission.MANAGE_DYNAMIC_SYSTEM") public void start(@NonNull String, long);
- method @RequiresPermission("android.permission.MANAGE_DYNAMIC_SYSTEM") public void start(@NonNull String, long, long);
- method @RequiresPermission("android.permission.MANAGE_DYNAMIC_SYSTEM") public void unbind();
+ method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void start(@NonNull android.net.Uri, long);
+ method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void start(@NonNull android.net.Uri, long, long);
+ method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void unbind();
field public static final int CAUSE_ERROR_EXCEPTION = 6; // 0x6
field public static final int CAUSE_ERROR_INVALID_URL = 4; // 0x4
field public static final int CAUSE_ERROR_IO = 3; // 0x3
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 9780d43..162f212 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -67,6 +67,8 @@
method @Deprecated public boolean addGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
method @Deprecated public void removeGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener);
method @Deprecated public void removeGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackage(String);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackageEnabled(boolean);
}
}
diff --git a/api/test-current.txt b/api/test-current.txt
index 56c5e98..6f8f310 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -662,7 +662,7 @@
public abstract class PackageManager {
method public abstract boolean arePermissionsIndividuallyControlled();
method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") public abstract String getDefaultBrowserPackageNameAsUser(int);
- method public String getIncidentReportApproverPackageName();
+ method @Nullable public String getIncidentReportApproverPackageName();
method public abstract int getInstallReason(String, @NonNull android.os.UserHandle);
method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int);
method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
diff --git a/cmds/incident/Android.bp b/cmds/incident/Android.bp
index 2a5ec5b..f56f101 100644
--- a/cmds/incident/Android.bp
+++ b/cmds/incident/Android.bp
@@ -29,6 +29,10 @@
"libincident",
],
+ static_libs: [
+ "libplatformprotos",
+ ],
+
cflags: [
"-Wall",
"-Werror",
diff --git a/cmds/incident/main.cpp b/cmds/incident/main.cpp
index cdec6a0..93e592c 100644
--- a/cmds/incident/main.cpp
+++ b/cmds/incident/main.cpp
@@ -68,6 +68,7 @@
StatusListener::onReportSectionStatus(int32_t section, int32_t status)
{
fprintf(stderr, "section %d status %d\n", section, status);
+ ALOGD("section %d status %d\n", section, status);
return Status::ok();
}
@@ -75,6 +76,7 @@
StatusListener::onReportServiceStatus(const String16& service, int32_t status)
{
fprintf(stderr, "service '%s' status %d\n", String8(service).string(), status);
+ ALOGD("service '%s' status %d\n", String8(service).string(), status);
return Status::ok();
}
@@ -82,6 +84,7 @@
StatusListener::onReportFinished()
{
fprintf(stderr, "done\n");
+ ALOGD("done\n");
exit(0);
return Status::ok();
}
@@ -90,6 +93,7 @@
StatusListener::onReportFailed()
{
fprintf(stderr, "failed\n");
+ ALOGD("failed\n");
exit(1);
return Status::ok();
}
@@ -146,25 +150,50 @@
// ================================================================================
static int
-get_dest(const char* arg)
+get_privacy_policy(const char* arg)
{
if (strcmp(arg, "L") == 0
|| strcmp(arg, "LOCAL") == 0) {
- return DEST_LOCAL;
+ return PRIVACY_POLICY_LOCAL;
}
if (strcmp(arg, "E") == 0
|| strcmp(arg, "EXPLICIT") == 0) {
- return DEST_EXPLICIT;
+ return PRIVACY_POLICY_EXPLICIT;
}
if (strcmp(arg, "A") == 0
|| strcmp(arg, "AUTO") == 0
|| strcmp(arg, "AUTOMATIC") == 0) {
- return DEST_AUTOMATIC;
+ return PRIVACY_POLICY_AUTOMATIC;
}
return -1; // return the default value
}
// ================================================================================
+static bool
+parse_receiver_arg(const string& arg, string* pkg, string* cls)
+{
+ if (arg.length() == 0) {
+ return true;
+ }
+ size_t slash = arg.find('/');
+ if (slash == string::npos) {
+ return false;
+ }
+ if (slash == 0 || slash == arg.length() - 1) {
+ return false;
+ }
+ if (arg.find('/', slash+1) != string::npos) {
+ return false;
+ }
+ pkg->assign(arg, 0, slash);
+ cls->assign(arg, slash+1);
+ if ((*cls)[0] == '.') {
+ *cls = (*pkg) + (*cls);
+ }
+ return true;
+}
+
+// ================================================================================
static void
usage(FILE* out)
{
@@ -173,10 +202,13 @@
fprintf(out, "Takes an incident report.\n");
fprintf(out, "\n");
fprintf(out, "OPTIONS\n");
+ fprintf(out, " -l list available sections\n");
+ fprintf(out, " -p privacy spec, LOCAL, EXPLICIT or AUTOMATIC. Default AUTOMATIC.\n");
+ fprintf(out, "\n");
+ fprintf(out, "and one of these destinations:\n");
fprintf(out, " -b (default) print the report to stdout (in proto format)\n");
fprintf(out, " -d send the report into dropbox\n");
- fprintf(out, " -l list available sections\n");
- fprintf(out, " -p privacy spec, LOCAL, EXPLICIT or AUTOMATIC\n");
+ fprintf(out, " -s PKG/CLS send broadcast to the broadcast receiver.\n");
fprintf(out, "\n");
fprintf(out, " SECTION the field numbers of the incident report fields to include\n");
fprintf(out, "\n");
@@ -187,12 +219,13 @@
{
Status status;
IncidentReportArgs args;
- enum { DEST_DROPBOX, DEST_STDOUT } destination = DEST_STDOUT;
- int dest = -1; // default
+ enum { DEST_UNSET, DEST_DROPBOX, DEST_STDOUT, DEST_BROADCAST } destination = DEST_UNSET;
+ int privacyPolicy = PRIVACY_POLICY_AUTOMATIC;
+ string receiverArg;
// Parse the args
int opt;
- while ((opt = getopt(argc, argv, "bhdlp:")) != -1) {
+ while ((opt = getopt(argc, argv, "bhdlp:s:")) != -1) {
switch (opt) {
case 'h':
usage(stdout);
@@ -201,13 +234,29 @@
section_list(stdout);
return 0;
case 'b':
+ if (!(destination == DEST_UNSET || destination == DEST_STDOUT)) {
+ usage(stderr);
+ return 1;
+ }
destination = DEST_STDOUT;
break;
case 'd':
+ if (!(destination == DEST_UNSET || destination == DEST_DROPBOX)) {
+ usage(stderr);
+ return 1;
+ }
destination = DEST_DROPBOX;
break;
case 'p':
- dest = get_dest(optarg);
+ privacyPolicy = get_privacy_policy(optarg);
+ break;
+ case 's':
+ if (destination != DEST_UNSET) {
+ usage(stderr);
+ return 1;
+ }
+ destination = DEST_BROADCAST;
+ receiverArg = optarg;
break;
default:
usage(stderr);
@@ -215,6 +264,17 @@
}
}
+ string pkg;
+ string cls;
+ if (parse_receiver_arg(receiverArg, &pkg, &cls)) {
+ args.setReceiverPkg(pkg);
+ args.setReceiverCls(cls);
+ } else {
+ fprintf(stderr, "badly formatted -s package/class option: %s\n\n", receiverArg.c_str());
+ usage(stderr);
+ return 1;
+ }
+
if (optind == argc) {
args.setAll(true);
} else {
@@ -236,7 +296,7 @@
}
}
}
- args.setDest(dest);
+ args.setPrivacyPolicy(privacyPolicy);
// Start the thread pool.
sp<ProcessState> ps(ProcessState::self());
@@ -272,12 +332,17 @@
//IPCThreadState::self()->joinThreadPool();
while (true) {
- int amt = splice(fds[0], NULL, STDOUT_FILENO, NULL, 4096, 0);
- fprintf(stderr, "spliced %d bytes\n", amt);
+ uint8_t buf[4096];
+ ssize_t amt = TEMP_FAILURE_RETRY(read(fds[0], buf, sizeof(buf)));
if (amt < 0) {
- return errno;
+ break;
} else if (amt == 0) {
- return 0;
+ break;
+ }
+
+ ssize_t wamt = TEMP_FAILURE_RETRY(write(STDOUT_FILENO, buf, amt));
+ if (wamt != amt) {
+ return errno;
}
}
} else {
diff --git a/cmds/incidentd/Android.bp b/cmds/incidentd/Android.bp
index 3dc1093..8f9a5f8 100644
--- a/cmds/incidentd/Android.bp
+++ b/cmds/incidentd/Android.bp
@@ -21,6 +21,7 @@
srcs: [
"src/**/*.cpp",
+ "src/**/*.proto",
":incidentd_section_list",
],
@@ -43,6 +44,10 @@
local_include_dirs: ["src"],
generated_headers: ["gen-platform-proto-constants"],
+ proto: {
+ type: "lite",
+ },
+
shared_libs: [
"libbase",
"libbinder",
@@ -56,6 +61,18 @@
"libprotobuf-cpp-lite",
],
+ static_libs: [
+ "libincidentcompanion",
+ "libplatformprotos",
+ ],
+
+ product_variables: {
+ debuggable: {
+ cflags: ["-DALLOW_RESTRICTED_SECTIONS=1"],
+ },
+ },
+
+
init_rc: ["incidentd.rc"],
}
@@ -72,6 +89,7 @@
"-Wall",
"-Wno-unused-variable",
"-Wunused-parameter",
+ "-g",
// Allow implicit fallthrough in IncidentService.cpp:85 until it is fixed.
"-Wno-error=implicit-fallthrough",
@@ -82,21 +100,26 @@
srcs: [
"tests/**/*.cpp",
- "src/PrivacyBuffer.cpp",
+ "tests/**/*.proto",
"src/FdBuffer.cpp",
"src/Privacy.cpp",
+ "src/PrivacyFilter.cpp",
"src/Reporter.cpp",
"src/Section.cpp",
"src/Throttler.cpp",
+ "src/WorkDirectory.cpp",
"src/incidentd_util.cpp",
+ "src/proto_util.cpp",
"src/report_directory.cpp",
+ "src/**/*.proto",
],
data: ["testdata/**/*"],
static_libs: [
"libgmock",
- "libplatformprotos",
+ "libincidentcompanion",
+ "libplatformprotos-test",
],
shared_libs: [
"libbase",
@@ -105,11 +128,19 @@
"libdumputils",
"libincident",
"liblog",
- "libprotobuf-cpp-lite",
+ "libprotobuf-cpp-full",
"libprotoutil",
"libservices",
"libutils",
],
+
+ target: {
+ android: {
+ proto: {
+ type: "full",
+ },
+ },
+ },
}
genrule {
diff --git a/cmds/incidentd/src/Broadcaster.cpp b/cmds/incidentd/src/Broadcaster.cpp
new file mode 100644
index 0000000..39e5393
--- /dev/null
+++ b/cmds/incidentd/src/Broadcaster.cpp
@@ -0,0 +1,440 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+#include "Log.h"
+
+#include "Broadcaster.h"
+
+#include "IncidentService.h"
+
+#include <android/os/DropBoxManager.h>
+#include <binder/IServiceManager.h>
+
+namespace android {
+namespace os {
+namespace incidentd {
+
+using android::os::IIncidentCompanion;
+using binder::Status;
+
+// ============================================================
+Broadcaster::ConsentListener::ConsentListener(const sp<Broadcaster>& broadcaster,
+ const ReportId& reportId)
+ :mBroadcaster(broadcaster),
+ mId(reportId) {
+}
+
+Broadcaster::ConsentListener::~ConsentListener() {
+}
+
+Status Broadcaster::ConsentListener::onReportApproved() {
+ mBroadcaster->report_approved(mId);
+ return Status::ok();
+}
+
+Status Broadcaster::ConsentListener::onReportDenied() {
+ mBroadcaster->report_denied(mId);
+ return Status::ok();
+}
+
+// ============================================================
+Broadcaster::ReportId::ReportId()
+ :id(),
+ pkg(),
+ cls() {
+}
+
+Broadcaster::ReportId::ReportId(const ReportId& that)
+ :id(that.id),
+ pkg(that.pkg),
+ cls(that.cls) {
+}
+
+Broadcaster::ReportId::ReportId(const string& i, const string& p, const string& c)
+ :id(i),
+ pkg(p),
+ cls(c) {
+}
+
+Broadcaster::ReportId::~ReportId() {
+}
+
+bool Broadcaster::ReportId::operator<(const ReportId& that) const {
+ if (id < that.id) {
+ return true;
+ }
+ if (id > that.id) {
+ return false;
+ }
+ if (pkg < that.pkg) {
+ return true;
+ }
+ if (pkg > that.pkg) {
+ return false;
+ }
+ if (cls < that.cls) {
+ return true;
+ }
+ return false;
+}
+
+// ============================================================
+Broadcaster::ReportStatus::ReportStatus()
+ :approval_sent(false),
+ ready_sent(false),
+ listener(nullptr) {
+}
+
+Broadcaster::ReportStatus::ReportStatus(const ReportStatus& that)
+ :approval_sent(that.approval_sent),
+ ready_sent(that.ready_sent),
+ listener(that.listener) {
+}
+
+Broadcaster::ReportStatus::~ReportStatus() {
+}
+
+// ============================================================
+Broadcaster::Broadcaster(const sp<WorkDirectory>& workDirectory)
+ :mReportHandler(),
+ mWorkDirectory(workDirectory) {
+}
+
+void Broadcaster::setHandler(const sp<ReportHandler>& handler) {
+ mReportHandler = handler;
+}
+
+void Broadcaster::reset() {
+ unique_lock<mutex> lock(mLock);
+ mLastSent = 0;
+ mHistory.clear();
+ // Could cancel the listeners, but this happens when
+ // the system process crashes, so don't bother.
+}
+
+void Broadcaster::clearBroadcasts(const string& pkg, const string& cls, const string& id) {
+ unique_lock<mutex> lock(mLock);
+
+ map<ReportId,ReportStatus>::const_iterator found = mHistory.find(ReportId(id, pkg, cls));
+ if (found != mHistory.end()) {
+ if (found->second.listener != nullptr) {
+ sp<IIncidentCompanion> ics = get_incident_companion();
+ if (ics != nullptr) {
+ ics->cancelAuthorization(found->second.listener);
+ }
+ }
+ mHistory.erase(found);
+ }
+}
+
+void Broadcaster::clearPackageBroadcasts(const string& pkg) {
+ unique_lock<mutex> lock(mLock);
+
+ map<ReportId,ReportStatus>::iterator it = mHistory.begin();
+ while (it != mHistory.end()) {
+ if (it->first.pkg == pkg) {
+ if (it->second.listener != nullptr) {
+ sp<IIncidentCompanion> ics = get_incident_companion();
+ if (ics != nullptr) {
+ ics->cancelAuthorization(it->second.listener);
+ }
+ }
+ it = mHistory.erase(it);
+ } else {
+ it++;
+ }
+ }
+}
+
+Broadcaster::broadcast_status_t Broadcaster::sendBroadcasts() {
+ int err;
+ int64_t lastSent = get_last_sent();
+
+ vector<sp<ReportFile>> files;
+ mWorkDirectory->getReports(&files, 0); //lastSent);
+
+ // Don't send multiple broadcasts to the same receiver.
+ set<ReportId> reportReadyBroadcasts;
+
+ for (const sp<ReportFile>& file: files) {
+ err = file->loadEnvelope();
+ if (err != NO_ERROR) {
+ ALOGW("Error (%s) loading envelope from %s", strerror(-err),
+ file->getEnvelopeFileName().c_str());
+ continue;
+ }
+
+ const ReportFileProto& envelope = file->getEnvelope();
+
+ if (!envelope.completed()) {
+ ALOGI("Incident report not completed skipping it: %s",
+ file->getEnvelopeFileName().c_str());
+ continue;
+ }
+
+ // When one of the broadcast functions in this loop fails, it's almost
+ // certainly because the system process is crashing or has crashed. Rather
+ // than continuing to pound on the system process and potentially make things
+ // worse, we bail right away, return BROADCASTS_BACKOFF, and we will try
+ // again later. In the meantime, if the system process did crash, it might
+ // clear out mHistory, which means we'll be back here again to send the
+ // backlog.
+ size_t reportCount = envelope.report_size();
+ bool hasApprovalPending = false;
+ for (int reportIndex = 0; reportIndex < reportCount; reportIndex++) {
+
+ const ReportFileProto_Report& report = envelope.report(reportIndex);
+ status_t err;
+ if (report.privacy_policy() == PRIVACY_POLICY_AUTOMATIC || report.share_approved()) {
+ // It's privacy policy is AUTO, or it's been approved,
+ // so send the actual broadcast.
+ if (!was_ready_sent(file->getId(), report.pkg(), report.cls())) {
+ if (report.pkg() == DROPBOX_SENTINEL.getPackageName()
+ && report.cls() == DROPBOX_SENTINEL.getClassName()) {
+ IncidentReportArgs args;
+ get_args_from_report(&args, report);
+ err = send_to_dropbox(file, args);
+ if (err != NO_ERROR) {
+ return BROADCASTS_BACKOFF;
+ }
+ } else {
+ reportReadyBroadcasts.insert(ReportId(file->getId(), report.pkg(),
+ report.cls()));
+ }
+ }
+ } else {
+ // It's not approved yet, so send the approval.
+ if (!was_approval_sent(file->getId(), report.pkg(), report.cls())) {
+ err = send_approval_broadcasts(file->getId(), report.pkg(), report.cls());
+ if (err != NO_ERROR) {
+ return BROADCASTS_BACKOFF;
+ }
+ hasApprovalPending = true;
+ }
+ }
+ }
+
+ lastSent = file->getTimestampNs();
+ if (!hasApprovalPending) {
+ set_last_sent(lastSent);
+ }
+ }
+
+ for (const ReportId& report: reportReadyBroadcasts) {
+ err = send_report_ready_broadcasts(report.id, report.pkg, report.cls);
+ if (err != NO_ERROR) {
+ return BROADCASTS_BACKOFF;
+ }
+ }
+
+ return mWorkDirectory->hasMore(lastSent) ? BROADCASTS_REPEAT : BROADCASTS_FINISHED;
+}
+
+void Broadcaster::set_last_sent(int64_t timestamp) {
+ unique_lock<mutex> lock(mLock);
+ mLastSent = timestamp;
+}
+
+int64_t Broadcaster::get_last_sent() {
+ unique_lock<mutex> lock(mLock);
+ return mLastSent;
+}
+
+/*
+void Broadcaster::printReportStatuses() const {
+ ALOGD("mHistory {");
+ for (map<ReportId,ReportStatus>::const_iterator it = mHistory.begin();
+ it != mHistory.end(); it++) {
+ ALOGD(" [%s %s] --> [%d %d]", it->first.id.c_str(), it->first.pkg.c_str(),
+ it->second.approval_sent, it->second.ready_sent);
+ }
+ ALOGD("}");
+}
+*/
+
+bool Broadcaster::was_approval_sent(const string& id, const string& pkg, const string& cls) {
+ unique_lock<mutex> lock(mLock);
+ map<ReportId,ReportStatus>::const_iterator found = mHistory.find(ReportId(id, pkg, cls));
+ if (found != mHistory.end()) {
+ return found->second.approval_sent;
+ }
+ return false;
+}
+
+void Broadcaster::set_approval_sent(const string& id, const string& pkg, const string& cls,
+ const sp<ConsentListener>& listener) {
+ unique_lock<mutex> lock(mLock);
+ ReportStatus& reportStatus = mHistory[ReportId(id, pkg, cls)];
+ reportStatus.approval_sent = true;
+ reportStatus.listener = listener;
+}
+
+bool Broadcaster::was_ready_sent(const string& id, const string& pkg, const string& cls) {
+ unique_lock<mutex> lock(mLock);
+ map<ReportId,ReportStatus>::const_iterator found = mHistory.find(ReportId(id, pkg, cls));
+ if (found != mHistory.end()) {
+ return found->second.ready_sent;
+ }
+ return false;
+}
+
+void Broadcaster::set_ready_sent(const string& id, const string& pkg, const string& cls) {
+ unique_lock<mutex> lock(mLock);
+ mHistory[ReportId(id, pkg, cls)].ready_sent = true;
+}
+
+status_t Broadcaster::send_approval_broadcasts(const string& id, const string& pkg,
+ const string& cls) {
+ sp<IIncidentCompanion> ics = get_incident_companion();
+ if (ics == nullptr) {
+ return NAME_NOT_FOUND;
+ }
+
+ sp<ConsentListener> listener = new ConsentListener(this, ReportId(id, pkg, cls));
+
+ ALOGI("send_approval_broadcasts for %s %s/%s", id.c_str(), pkg.c_str(), cls.c_str());
+
+ Status status = ics->authorizeReport(0, String16(pkg.c_str()),
+ String16(cls.c_str()), String16(id.c_str()), 0, listener);
+
+ if (!status.isOk()) {
+ // authorizeReport is oneway, so any error is a transaction error.
+ return status.transactionError();
+ }
+
+ set_approval_sent(id, pkg, cls, listener);
+
+ return NO_ERROR;
+}
+
+void Broadcaster::report_approved(const ReportId& reportId) {
+ status_t err;
+
+ // Kick off broadcaster to do send the ready broadcasts.
+ ALOGI("The user approved the report, so kicking off another broadcast pass. %s %s/%s",
+ reportId.id.c_str(), reportId.pkg.c_str(), reportId.cls.c_str());
+ sp<ReportFile> file = mWorkDirectory->getReport(reportId.pkg, reportId.cls, reportId.id,
+ nullptr);
+ if (file != nullptr) {
+ err = file->loadEnvelope();
+ if (err != NO_ERROR) {
+ return;
+ }
+
+ err = file->markApproved(reportId.pkg, reportId.cls);
+ if (err != NO_ERROR) {
+ ALOGI("Couldn't find report that was just approved: %s %s/%s",
+ reportId.id.c_str(), reportId.pkg.c_str(), reportId.cls.c_str());
+ return;
+ }
+
+ file->saveEnvelope();
+ if (err != NO_ERROR) {
+ return;
+ }
+ }
+ mReportHandler->scheduleSendBacklog();
+}
+
+void Broadcaster::report_denied(const ReportId& reportId) {
+ // The user didn't approve the report, so remove it from the WorkDirectory.
+ ALOGI("The user denied the report, so deleting it. %s %s/%s",
+ reportId.id.c_str(), reportId.pkg.c_str(), reportId.cls.c_str());
+ sp<ReportFile> file = mWorkDirectory->getReport(reportId.pkg, reportId.cls, reportId.id,
+ nullptr);
+ if (file != nullptr) {
+ mWorkDirectory->commit(file, reportId.pkg, reportId.cls);
+ }
+}
+
+status_t Broadcaster::send_report_ready_broadcasts(const string& id, const string& pkg,
+ const string& cls) {
+ sp<IIncidentCompanion> ics = get_incident_companion();
+ if (ics == nullptr) {
+ return NAME_NOT_FOUND;
+ }
+
+ ALOGI("send_report_ready_broadcasts for %s %s/%s", id.c_str(), pkg.c_str(), cls.c_str());
+
+ Status status = ics->sendReportReadyBroadcast(String16(pkg.c_str()), String16(cls.c_str()));
+
+ if (!status.isOk()) {
+ // sendReportReadyBroadcast is oneway, so any error is a transaction error.
+ return status.transactionError();
+ }
+
+ set_ready_sent(id, pkg, cls);
+
+ return NO_ERROR;
+}
+
+status_t Broadcaster::send_to_dropbox(const sp<ReportFile>& file,
+ const IncidentReportArgs& args) {
+ status_t err;
+
+ sp<DropBoxManager> dropbox = new DropBoxManager();
+ if (dropbox == nullptr) {
+ ALOGW("Can't reach dropbox now, so we won't be able to write the incident report to there");
+ return NO_ERROR;
+ }
+
+ // Start a thread to write the data to dropbox.
+ int readFd = -1;
+ err = file->startFilteringData(&readFd, args);
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ // Takes ownership of readFd.
+ Status status = dropbox->addFile(String16("incident"), readFd, 0);
+ if (!status.isOk()) {
+ // TODO: This may or may not leak the readFd, depending on where it failed.
+ // Not sure how to fix this given the dropbox API.
+ ALOGW("Error sending incident report to dropbox.");
+ return -errno;
+ }
+
+ // On successful write, tell the working directory that this file is done.
+ mWorkDirectory->commit(file, DROPBOX_SENTINEL.getPackageName(),
+ DROPBOX_SENTINEL.getClassName());
+
+ // Don't need to call set_ready_sent, because we just removed it from the ReportFile,
+ // so we'll never hear about it again.
+
+ return NO_ERROR;
+}
+
+sp<IIncidentCompanion> Broadcaster::get_incident_companion() {
+ sp<IBinder> binder = defaultServiceManager()->getService(String16("incidentcompanion"));
+ if (binder == nullptr) {
+ ALOGI("Can not find IIncidentCompanion service to send broadcast. Will try again later.");
+ return nullptr;
+ }
+
+ sp<IIncidentCompanion> ics = interface_cast<IIncidentCompanion>(binder);
+ if (ics == nullptr) {
+ ALOGI("The incidentcompanion service is not an IIncidentCompanion. Will try again later.");
+ return nullptr;
+ }
+
+ return ics;
+}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
+
diff --git a/cmds/incidentd/src/Broadcaster.h b/cmds/incidentd/src/Broadcaster.h
new file mode 100644
index 0000000..9330297
--- /dev/null
+++ b/cmds/incidentd/src/Broadcaster.h
@@ -0,0 +1,127 @@
+/*
+ * 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.
+ */
+#pragma once
+
+#include "WorkDirectory.h"
+
+#include <android/os/BnIncidentAuthListener.h>
+#include <android/os/IIncidentCompanion.h>
+#include <frameworks/base/cmds/incidentd/src/report_file.pb.h>
+
+namespace android {
+namespace os {
+namespace incidentd {
+
+using android::binder::Status;
+using android::os::BnIncidentAuthListener;
+using android::os::IIncidentCompanion;
+
+class ReportHandler;
+
+class Broadcaster : public virtual RefBase {
+public:
+ enum broadcast_status_t {
+ BROADCASTS_FINISHED = 0,
+ BROADCASTS_REPEAT = 1,
+ BROADCASTS_BACKOFF = 2
+ };
+
+ Broadcaster(const sp<WorkDirectory>& workDirectory);
+
+ void setHandler(const sp<ReportHandler>& handler);
+
+ /**
+ * Reset the beginning timestamp for broadcasts. Call this when
+ * the system_server restarts.
+ */
+ void reset();
+
+ /**
+ * Remove the history record for the broadcasts, including pending authorizations
+ * if necessary.
+ */
+ void clearBroadcasts(const string& pkg, const string& cls, const string& id);
+ void clearPackageBroadcasts(const string& pkg);
+
+ /**
+ * Send whichever broadcasts have been pending.
+ */
+ broadcast_status_t sendBroadcasts();
+
+private:
+ struct ReportId {
+ ReportId();
+ ReportId(const ReportId& that);
+ ReportId(const string& i, const string& p, const string& c);
+ ~ReportId();
+
+ bool operator<(const ReportId& that) const;
+
+ string id;
+ string pkg;
+ string cls;
+ };
+
+ class ConsentListener : public BnIncidentAuthListener {
+ public:
+ ConsentListener(const sp<Broadcaster>& broadcaster, const ReportId& reportId);
+ virtual ~ConsentListener();
+ virtual Status onReportApproved();
+ virtual Status onReportDenied();
+ private:
+ sp<Broadcaster> mBroadcaster;
+ ReportId mId;
+ };
+
+ struct ReportStatus {
+ ReportStatus();
+ ReportStatus(const ReportStatus& that);
+ ~ReportStatus();
+
+ bool approval_sent;
+ bool ready_sent;
+ sp<ConsentListener> listener;
+ };
+
+ sp<ReportHandler> mReportHandler;
+ sp<WorkDirectory> mWorkDirectory;
+
+ // protected by mLock
+ mutex mLock;
+ map<ReportId,ReportStatus> mHistory; // what we sent so we don't send it again
+ int64_t mLastSent;
+
+ void set_last_sent(int64_t timestamp);
+ int64_t get_last_sent();
+ void print_report_statuses() const;
+ status_t send_approval_broadcasts(const string& id, const string& pkg, const string& cls);
+ void report_approved(const ReportId& reportId);
+ void report_denied(const ReportId& reportId);
+ status_t send_report_ready_broadcasts(const string& id, const string& pkg, const string& cls);
+ status_t send_to_dropbox(const sp<ReportFile>& file, const IncidentReportArgs& args);
+ bool was_approval_sent(const string& id, const string& pkg, const string& cls);
+ void set_approval_sent(const string& id, const string& pkg, const string& cls,
+ const sp<ConsentListener>& listener);
+ bool was_ready_sent(const string& id, const string& pkg, const string& cls);
+ void set_ready_sent(const string& id, const string& pkg, const string& cls);
+ sp<IIncidentCompanion> get_incident_companion();
+};
+
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
diff --git a/cmds/incidentd/src/FdBuffer.cpp b/cmds/incidentd/src/FdBuffer.cpp
index 04819ec..685c067 100644
--- a/cmds/incidentd/src/FdBuffer.cpp
+++ b/cmds/incidentd/src/FdBuffer.cpp
@@ -34,9 +34,15 @@
const ssize_t MAX_BUFFER_COUNT = 256; // 4 MB max
FdBuffer::FdBuffer()
- : mBuffer(BUFFER_SIZE), mStartTime(-1), mFinishTime(-1), mTimedOut(false), mTruncated(false) {}
+ :mBuffer(new EncodedBuffer(BUFFER_SIZE)),
+ mStartTime(-1),
+ mFinishTime(-1),
+ mTimedOut(false),
+ mTruncated(false) {
+}
-FdBuffer::~FdBuffer() {}
+FdBuffer::~FdBuffer() {
+}
status_t FdBuffer::read(int fd, int64_t timeout) {
struct pollfd pfds = {.fd = fd, .events = POLLIN};
@@ -45,12 +51,12 @@
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
while (true) {
- if (mBuffer.size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) {
+ if (mBuffer->size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) {
mTruncated = true;
VLOG("Truncating data");
break;
}
- if (mBuffer.writeBuffer() == NULL) {
+ if (mBuffer->writeBuffer() == NULL) {
VLOG("No memory");
return NO_MEMORY;
}
@@ -76,7 +82,7 @@
return errno != 0 ? -errno : UNKNOWN_ERROR;
} else {
ssize_t amt = TEMP_FAILURE_RETRY(
- ::read(fd, mBuffer.writeBuffer(), mBuffer.currentToWrite()));
+ ::read(fd, mBuffer->writeBuffer(), mBuffer->currentToWrite()));
if (amt < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
continue;
@@ -88,7 +94,7 @@
VLOG("Reached EOF of fd=%d", fd);
break;
}
- mBuffer.wp()->move(amt);
+ mBuffer->wp()->move(amt);
}
}
}
@@ -100,28 +106,28 @@
mStartTime = uptimeMillis();
while (true) {
- if (mBuffer.size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) {
+ if (mBuffer->size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) {
// Don't let it get too big.
mTruncated = true;
VLOG("Truncating data");
break;
}
- if (mBuffer.writeBuffer() == NULL) {
+ if (mBuffer->writeBuffer() == NULL) {
VLOG("No memory");
return NO_MEMORY;
}
ssize_t amt =
- TEMP_FAILURE_RETRY(::read(fd, mBuffer.writeBuffer(), mBuffer.currentToWrite()));
+ TEMP_FAILURE_RETRY(::read(fd, mBuffer->writeBuffer(), mBuffer->currentToWrite()));
if (amt < 0) {
VLOG("Fail to read %d: %s", fd, strerror(errno));
return -errno;
} else if (amt == 0) {
- VLOG("Done reading %zu bytes", mBuffer.size());
+ VLOG("Done reading %zu bytes", mBuffer->size());
// We're done.
break;
}
- mBuffer.wp()->move(amt);
+ mBuffer->wp()->move(amt);
}
mFinishTime = uptimeMillis();
@@ -150,12 +156,12 @@
// This is the buffer used to store processed data
while (true) {
- if (mBuffer.size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) {
+ if (mBuffer->size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) {
VLOG("Truncating data");
mTruncated = true;
break;
}
- if (mBuffer.writeBuffer() == NULL) {
+ if (mBuffer->writeBuffer() == NULL) {
VLOG("No memory");
return NO_MEMORY;
}
@@ -248,7 +254,7 @@
// read from parsing process
ssize_t amt = TEMP_FAILURE_RETRY(
- ::read(fromFd.get(), mBuffer.writeBuffer(), mBuffer.currentToWrite()));
+ ::read(fromFd.get(), mBuffer->writeBuffer(), mBuffer->currentToWrite()));
if (amt < 0) {
if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
VLOG("Fail to read fromFd %d: %s", fromFd.get(), strerror(errno));
@@ -258,7 +264,7 @@
VLOG("Reached EOF of fromFd %d", fromFd.get());
break;
} else {
- mBuffer.wp()->move(amt);
+ mBuffer->wp()->move(amt);
}
}
@@ -266,9 +272,25 @@
return NO_ERROR;
}
-size_t FdBuffer::size() const { return mBuffer.size(); }
+status_t FdBuffer::write(uint8_t const* buf, size_t size) {
+ return mBuffer->writeRaw(buf, size);
+}
-EncodedBuffer::iterator FdBuffer::data() const { return mBuffer.begin(); }
+status_t FdBuffer::write(const sp<ProtoReader>& reader) {
+ return mBuffer->writeRaw(reader);
+}
+
+status_t FdBuffer::write(const sp<ProtoReader>& reader, size_t size) {
+ return mBuffer->writeRaw(reader, size);
+}
+
+size_t FdBuffer::size() const {
+ return mBuffer->size();
+}
+
+sp<EncodedBuffer> FdBuffer::data() const {
+ return mBuffer;
+}
} // namespace incidentd
} // namespace os
diff --git a/cmds/incidentd/src/FdBuffer.h b/cmds/incidentd/src/FdBuffer.h
index 20deefd..a349360 100644
--- a/cmds/incidentd/src/FdBuffer.h
+++ b/cmds/incidentd/src/FdBuffer.h
@@ -64,6 +64,21 @@
const bool isSysfs = false);
/**
+ * Write by hand into the buffer.
+ */
+ status_t write(uint8_t const* buf, size_t size);
+
+ /**
+ * Write all the data from a ProtoReader into our internal buffer.
+ */
+ status_t write(const sp<ProtoReader>& data);
+
+ /**
+ * Write size bytes of data from a ProtoReader into our internal buffer.
+ */
+ status_t write(const sp<ProtoReader>& data, size_t size);
+
+ /**
* Whether we timed out.
*/
bool timedOut() const { return mTimedOut; }
@@ -89,17 +104,12 @@
int64_t durationMs() const { return mFinishTime - mStartTime; }
/**
- * Reader API for data stored in FdBuffer
+ * Get the EncodedBuffer inside.
*/
- EncodedBuffer::iterator data() const;
-
- /**
- * Return the internal buffer, don't call unless you are familiar with EncodedBuffer.
- */
- EncodedBuffer* getInternalBuffer() { return &mBuffer; }
+ sp<EncodedBuffer> data() const;
private:
- EncodedBuffer mBuffer;
+ sp<EncodedBuffer> mBuffer;
int64_t mStartTime;
int64_t mFinishTime;
bool mTimedOut;
diff --git a/cmds/incidentd/src/IncidentService.cpp b/cmds/incidentd/src/IncidentService.cpp
index f8fb4a6..4ba31b4 100644
--- a/cmds/incidentd/src/IncidentService.cpp
+++ b/cmds/incidentd/src/IncidentService.cpp
@@ -19,7 +19,7 @@
#include "IncidentService.h"
#include "FdBuffer.h"
-#include "PrivacyBuffer.h"
+#include "PrivacyFilter.h"
#include "Reporter.h"
#include "incidentd_util.h"
#include "section_list.h"
@@ -35,9 +35,12 @@
#include <unistd.h>
-enum { WHAT_RUN_REPORT = 1, WHAT_SEND_BACKLOG_TO_DROPBOX = 2 };
+enum {
+ WHAT_TAKE_REPORT = 1,
+ WHAT_SEND_BROADCASTS = 2
+};
-#define DEFAULT_BACKLOG_DELAY_NS (1000000000LL)
+#define DEFAULT_DELAY_NS (1000000000LL)
#define DEFAULT_BYTES_SIZE_LIMIT (20 * 1024 * 1024) // 20MB
#define DEFAULT_REFACTORY_PERIOD_MS (24 * 60 * 60 * 1000) // 1 Day
@@ -53,6 +56,7 @@
namespace os {
namespace incidentd {
+String16 const APPROVE_INCIDENT_REPORTS("android.permission.APPROVE_INCIDENT_REPORTS");
String16 const DUMP_PERMISSION("android.permission.DUMP");
String16 const USAGE_STATS_PERMISSION("android.permission.PACKAGE_USAGE_STATS");
@@ -60,7 +64,14 @@
uid_t callingUid = IPCThreadState::self()->getCallingUid();
pid_t callingPid = IPCThreadState::self()->getCallingPid();
if (callingUid == AID_ROOT || callingUid == AID_SHELL) {
- // root doesn't have permission.DUMP if don't do this!
+ // Root and shell are ok.
+ return Status::ok();
+ }
+
+ if (checkCallingPermission(APPROVE_INCIDENT_REPORTS)) {
+ // Permission controller (this is a singleton permission that is always granted
+ // exactly for PermissionController) is allowed to access incident reports
+ // so it can show the user info about what they are approving.
return Status::ok();
}
@@ -81,8 +92,8 @@
}
// checking calling request uid permission.
- switch (args.dest()) {
- case DEST_LOCAL:
+ switch (args.getPrivacyPolicy()) {
+ case PRIVACY_POLICY_LOCAL:
if (callingUid != AID_SHELL && callingUid != AID_ROOT) {
ALOGW("Calling pid %d and uid %d does not have permission to get local data.",
callingPid, callingUid);
@@ -91,7 +102,7 @@
"Calling process does not have permission to get local data.");
}
break;
- case DEST_EXPLICIT:
+ case PRIVACY_POLICY_EXPLICIT:
if (callingUid != AID_SHELL && callingUid != AID_ROOT && callingUid != AID_STATSD &&
callingUid != AID_SYSTEM) {
ALOGW("Calling pid %d and uid %d does not have permission to get explicit data.",
@@ -105,78 +116,79 @@
return Status::ok();
}
-// ================================================================================
-ReportRequestQueue::ReportRequestQueue() {}
-
-ReportRequestQueue::~ReportRequestQueue() {}
-
-void ReportRequestQueue::addRequest(const sp<ReportRequest>& request) {
- unique_lock<mutex> lock(mLock);
- mQueue.push_back(request);
-}
-
-sp<ReportRequest> ReportRequestQueue::getNextRequest() {
- unique_lock<mutex> lock(mLock);
- if (mQueue.empty()) {
- return NULL;
- } else {
- sp<ReportRequest> front(mQueue.front());
- mQueue.pop_front();
- return front;
- }
+static string build_uri(const string& pkg, const string& cls, const string& id) {
+ return "build_uri not implemented " + pkg + "/" + cls + "/" + id;
}
// ================================================================================
-ReportHandler::ReportHandler(const sp<Looper>& handlerLooper, const sp<ReportRequestQueue>& queue,
- const sp<Throttler>& throttler)
- : mBacklogDelay(DEFAULT_BACKLOG_DELAY_NS),
- mHandlerLooper(handlerLooper),
- mQueue(queue),
- mThrottler(throttler) {}
+ReportHandler::ReportHandler(const sp<WorkDirectory>& workDirectory,
+ const sp<Broadcaster>& broadcaster, const sp<Looper>& handlerLooper,
+ const sp<Throttler>& throttler)
+ :mLock(),
+ mWorkDirectory(workDirectory),
+ mBroadcaster(broadcaster),
+ mHandlerLooper(handlerLooper),
+ mBacklogDelay(DEFAULT_DELAY_NS),
+ mThrottler(throttler),
+ mBatch(new ReportBatch()) {
+}
-ReportHandler::~ReportHandler() {}
+ReportHandler::~ReportHandler() {
+}
void ReportHandler::handleMessage(const Message& message) {
switch (message.what) {
- case WHAT_RUN_REPORT:
- run_report();
+ case WHAT_TAKE_REPORT:
+ take_report();
break;
- case WHAT_SEND_BACKLOG_TO_DROPBOX:
- send_backlog_to_dropbox();
+ case WHAT_SEND_BROADCASTS:
+ send_broadcasts();
break;
}
}
-void ReportHandler::scheduleRunReport(const sp<ReportRequest>& request) {
- mQueue->addRequest(request);
- mHandlerLooper->removeMessages(this, WHAT_RUN_REPORT);
- mHandlerLooper->sendMessage(this, Message(WHAT_RUN_REPORT));
+void ReportHandler::schedulePersistedReport(const IncidentReportArgs& args) {
+ mBatch->addPersistedReport(args);
+ mHandlerLooper->removeMessages(this, WHAT_TAKE_REPORT);
+ mHandlerLooper->sendMessage(this, Message(WHAT_TAKE_REPORT));
}
-void ReportHandler::scheduleSendBacklogToDropbox() {
+void ReportHandler::scheduleStreamingReport(const IncidentReportArgs& args,
+ const sp<IIncidentReportStatusListener>& listener, int streamFd) {
+ mBatch->addStreamingReport(args, listener, streamFd);
+ mHandlerLooper->removeMessages(this, WHAT_TAKE_REPORT);
+ mHandlerLooper->sendMessage(this, Message(WHAT_TAKE_REPORT));
+}
+
+void ReportHandler::scheduleSendBacklog() {
unique_lock<mutex> lock(mLock);
- mBacklogDelay = DEFAULT_BACKLOG_DELAY_NS;
- schedule_send_backlog_to_dropbox_locked();
+ mBacklogDelay = DEFAULT_DELAY_NS;
+ schedule_send_broadcasts_locked();
}
-void ReportHandler::schedule_send_backlog_to_dropbox_locked() {
- mHandlerLooper->removeMessages(this, WHAT_SEND_BACKLOG_TO_DROPBOX);
- mHandlerLooper->sendMessageDelayed(mBacklogDelay, this, Message(WHAT_SEND_BACKLOG_TO_DROPBOX));
+void ReportHandler::schedule_send_broadcasts_locked() {
+ mHandlerLooper->removeMessages(this, WHAT_SEND_BROADCASTS);
+ mHandlerLooper->sendMessageDelayed(mBacklogDelay, this, Message(WHAT_SEND_BROADCASTS));
}
-void ReportHandler::run_report() {
- sp<Reporter> reporter = new Reporter();
-
- // Merge all of the requests into one that has all of the
- // requested fields.
- while (true) {
- sp<ReportRequest> request = mQueue->getNextRequest();
- if (request == NULL) {
- break;
- }
- reporter->batch.add(request);
+void ReportHandler::take_report() {
+ // Cycle the batch
+ sp<ReportBatch> batch;
+ {
+ unique_lock<mutex> lock(mLock);
+ batch = mBatch;
+ mBatch = new ReportBatch();
}
+ if (batch->empty()) {
+ // Nothing to do.
+ return;
+ }
+
+ sp<Reporter> reporter = new Reporter(mWorkDirectory, batch);
+
+ // TODO: Do we really want to clear the reports if we throttle? Should we only throttle
+ // requests going to dropbox? How do we reconcile throttling with testing?
if (mThrottler->shouldThrottle()) {
ALOGW("RunReport got throttled.");
return;
@@ -185,46 +197,76 @@
// Take the report, which might take a while. More requests might queue
// up while we're doing this, and we'll handle them in their next batch.
// TODO: We should further rate-limit the reports to no more than N per time-period.
+ // TODO: Move this inside reporter.
size_t reportByteSize = 0;
- Reporter::run_report_status_t reportStatus = reporter->runReport(&reportByteSize);
+ reporter->runReport(&reportByteSize);
+
mThrottler->addReportSize(reportByteSize);
- if (reportStatus == Reporter::REPORT_NEEDS_DROPBOX) {
+
+ // Kick off the next steps, one of which is to send any new or otherwise remaining
+ // approvals, and one of which is to send any new or remaining broadcasts.
+ {
unique_lock<mutex> lock(mLock);
- schedule_send_backlog_to_dropbox_locked();
+ schedule_send_broadcasts_locked();
}
}
-void ReportHandler::send_backlog_to_dropbox() {
- if (Reporter::upload_backlog() == Reporter::REPORT_NEEDS_DROPBOX) {
+void ReportHandler::send_broadcasts() {
+ Broadcaster::broadcast_status_t result = mBroadcaster->sendBroadcasts();
+ if (result == Broadcaster::BROADCASTS_FINISHED) {
+ // We're done.
+ unique_lock<mutex> lock(mLock);
+ mBacklogDelay = DEFAULT_DELAY_NS;
+ } else if (result == Broadcaster::BROADCASTS_REPEAT) {
+ // It worked, but there are more.
+ unique_lock<mutex> lock(mLock);
+ mBacklogDelay = DEFAULT_DELAY_NS;
+ schedule_send_broadcasts_locked();
+ } else if (result == Broadcaster::BROADCASTS_BACKOFF) {
// There was a failure. Exponential backoff.
unique_lock<mutex> lock(mLock);
mBacklogDelay *= 2;
ALOGI("Error sending to dropbox. Trying again in %lld minutes",
(mBacklogDelay / (1000000000LL * 60)));
- schedule_send_backlog_to_dropbox_locked();
- } else {
- mBacklogDelay = DEFAULT_BACKLOG_DELAY_NS;
+ schedule_send_broadcasts_locked();
}
}
// ================================================================================
-IncidentService::IncidentService(const sp<Looper>& handlerLooper)
- : mQueue(new ReportRequestQueue()),
- mThrottler(new Throttler(DEFAULT_BYTES_SIZE_LIMIT, DEFAULT_REFACTORY_PERIOD_MS)) {
- mHandler = new ReportHandler(handlerLooper, mQueue, mThrottler);
+IncidentService::IncidentService(const sp<Looper>& handlerLooper) {
+ mThrottler = new Throttler(DEFAULT_BYTES_SIZE_LIMIT, DEFAULT_REFACTORY_PERIOD_MS);
+ mWorkDirectory = new WorkDirectory();
+ mBroadcaster = new Broadcaster(mWorkDirectory);
+ mHandler = new ReportHandler(mWorkDirectory, mBroadcaster, handlerLooper,
+ mThrottler);
+ mBroadcaster->setHandler(mHandler);
}
IncidentService::~IncidentService() {}
Status IncidentService::reportIncident(const IncidentReportArgs& args) {
- ALOGI("reportIncident");
+ // TODO: Validate that the privacy policy is one of the real ones.
+ // If it isn't, clamp it to the next more restrictive real one.
+ // TODO: This function should reject the LOCAL privacy policy.
+ // Those have to stream.
+
+ // TODO: Check that the broadcast recevier has the proper permissions
+ // TODO: Maybe we should consider relaxing the permissions if it's going to
+ // dropbox, but definitely not if it's going to the broadcaster.
Status status = checkIncidentPermissions(args);
if (!status.isOk()) {
return status;
}
- mHandler->scheduleRunReport(new ReportRequest(args, NULL, -1));
+ // If they didn't specify a component, use dropbox.
+ IncidentReportArgs argsCopy(args);
+ if (argsCopy.receiverPkg().length() == 0 && argsCopy.receiverCls().length() == 0) {
+ argsCopy.setReceiverPkg(DROPBOX_SENTINEL.getPackageName());
+ argsCopy.setReceiverCls(DROPBOX_SENTINEL.getClassName());
+ }
+
+ mHandler->schedulePersistedReport(argsCopy);
return Status::ok();
}
@@ -232,19 +274,29 @@
Status IncidentService::reportIncidentToStream(const IncidentReportArgs& args,
const sp<IIncidentReportStatusListener>& listener,
const unique_fd& stream) {
- ALOGI("reportIncidentToStream");
+ // TODO: Validate that the privacy policy is one of the real ones.
+ // If it isn't, clamp it to the next more restrictive real one.
- Status status = checkIncidentPermissions(args);
+ // TODO: Only shell should be able to do a LOCAL privacy policy report.
+
+ // Streaming reports can not also be broadcast.
+ IncidentReportArgs argsCopy(args);
+ argsCopy.setReceiverPkg("");
+ argsCopy.setReceiverCls("");
+
+ Status status = checkIncidentPermissions(argsCopy);
if (!status.isOk()) {
return status;
}
+
+ // The ReportRequest takes ownership of the fd, so we need to dup it.
int fd = dup(stream.get());
if (fd < 0) {
return Status::fromStatusT(-errno);
}
- mHandler->scheduleRunReport(new ReportRequest(args, listener, fd));
+ mHandler->scheduleStreamingReport(argsCopy, listener, fd);
return Status::ok();
}
@@ -256,7 +308,92 @@
}
// When system_server is up and running, schedule the dropbox task to run.
- mHandler->scheduleSendBacklogToDropbox();
+ mBroadcaster->reset();
+ mHandler->scheduleSendBacklog();
+
+ return Status::ok();
+}
+
+Status IncidentService::getIncidentReportList(const String16& pkg16, const String16& cls16,
+ vector<String16>* result) {
+ status_t err;
+ const string pkg(String8(pkg16).string());
+ const string cls(String8(cls16).string());
+
+ // List the reports
+ vector<sp<ReportFile>> all;
+ err = mWorkDirectory->getReports(&all, 0);
+ if (err != NO_ERROR) {
+ return Status::fromStatusT(err);
+ }
+
+ // Find the ones that match pkg and cls.
+ for (sp<ReportFile>& file: all) {
+ err = file->loadEnvelope();
+ if (err != NO_ERROR) {
+ continue;
+ }
+ const ReportFileProto& envelope = file->getEnvelope();
+ size_t reportCount = envelope.report_size();
+ for (int reportIndex = 0; reportIndex < reportCount; reportIndex++) {
+ const ReportFileProto_Report& report = envelope.report(reportIndex);
+ if (pkg == report.pkg() && cls == report.cls()) {
+ result->push_back(String16(build_uri(pkg, cls, file->getId()).c_str()));
+ break;
+ }
+ }
+ }
+
+ return Status::ok();
+}
+
+Status IncidentService::getIncidentReport(const String16& pkg16, const String16& cls16,
+ const String16& id16, IncidentManager::IncidentReport* result) {
+ status_t err;
+
+ const string pkg(String8(pkg16).string());
+ const string cls(String8(cls16).string());
+ const string id(String8(id16).string());
+
+ IncidentReportArgs args;
+ sp<ReportFile> file = mWorkDirectory->getReport(pkg, cls, id, &args);
+ if (file != nullptr) {
+ int fd;
+ err = file->startFilteringData(&fd, args);
+ if (err != 0) {
+ ALOGW("Error reading data file that we think should exist: %s",
+ file->getDataFileName().c_str());
+ return Status::ok();
+ }
+
+ result->setTimestampNs(file->getTimestampNs());
+ result->setPrivacyPolicy(file->getEnvelope().privacy_policy());
+ result->takeFileDescriptor(fd);
+ }
+
+ return Status::ok();
+}
+
+Status IncidentService::deleteIncidentReports(const String16& pkg16, const String16& cls16,
+ const String16& id16) {
+ const string pkg(String8(pkg16).string());
+ const string cls(String8(cls16).string());
+ const string id(String8(id16).string());
+
+ sp<ReportFile> file = mWorkDirectory->getReport(pkg, cls, id, nullptr);
+ if (file != nullptr) {
+ mWorkDirectory->commit(file, pkg, cls);
+ }
+ mBroadcaster->clearBroadcasts(pkg, cls, id);
+
+ return Status::ok();
+}
+
+Status IncidentService::deleteAllIncidentReports(const String16& pkg16) {
+ const string pkg(String8(pkg16).string());
+
+ mWorkDirectory->commitAll(pkg);
+ mBroadcaster->clearPackageBroadcasts(pkg);
return Status::ok();
}
@@ -354,7 +491,7 @@
static void printPrivacy(const Privacy* p, FILE* out, String8 indent) {
if (p == NULL) return;
- fprintf(out, "%sid:%d, type:%d, dest:%d\n", indent.string(), p->field_id, p->type, p->dest);
+ fprintf(out, "%sid:%d, type:%d, dest:%d\n", indent.string(), p->field_id, p->type, p->policy);
if (p->children == NULL) return;
for (int i = 0; p->children[i] != NULL; i++) { // NULL-terminated.
printPrivacy(p->children[i], out, indent + " ");
@@ -362,6 +499,8 @@
}
status_t IncidentService::cmd_privacy(FILE* in, FILE* out, FILE* err, Vector<String8>& args) {
+ (void)in;
+
const int argCount = args.size();
if (argCount >= 3) {
String8 opt = args[1];
@@ -376,6 +515,7 @@
if (opt == "print") {
printPrivacy(p, out, String8(""));
} else if (opt == "parse") {
+ /*
FdBuffer buf;
status_t error = buf.read(fileno(in), 60000);
if (error != NO_ERROR) {
@@ -383,15 +523,17 @@
return error;
}
fprintf(err, "Read %zu bytes\n", buf.size());
- PrivacyBuffer pBuf(p, buf.data());
+ PrivacyFilter pBuf(p, buf.data());
PrivacySpec spec = PrivacySpec::new_spec(argCount > 3 ? atoi(args[3]) : -1);
error = pBuf.strip(spec);
if (error != NO_ERROR) {
- fprintf(err, "Error strip pii fields with spec %d\n", spec.dest);
+ fprintf(err, "Error strip pii fields with spec %d\n", spec.policy);
return error;
}
return pBuf.flush(fileno(out));
+ */
+ return -1;
}
} else {
return cmd_help(out);
@@ -408,7 +550,7 @@
ALOGD("Dump incident proto");
IncidentReportArgs incidentArgs;
- incidentArgs.setDest(DEST_EXPLICIT);
+ incidentArgs.setPrivacyPolicy(PRIVACY_POLICY_EXPLICIT);
int skipped[] = SKIPPED_SECTIONS;
for (const Section** section = SECTION_LIST; *section; section++) {
const int id = (*section)->id;
@@ -421,12 +563,16 @@
return PERMISSION_DENIED;
}
+ // The ReportRequest takes ownership of the fd, so we need to dup it.
int fd1 = dup(fd);
if (fd1 < 0) {
return -errno;
}
- mHandler->scheduleRunReport(new ReportRequest(incidentArgs, NULL, fd1));
+ // TODO: Remove this. Someone even dumpstate, wanting to get an incident report
+ // should use the API. That will take making dumpstated call the API, which is a
+ // good thing. It also means it won't be subject to the timeout.
+ mHandler->scheduleStreamingReport(incidentArgs, NULL, fd1);
return NO_ERROR;
}
diff --git a/cmds/incidentd/src/IncidentService.h b/cmds/incidentd/src/IncidentService.h
index c63a183..6481321 100644
--- a/cmds/incidentd/src/IncidentService.h
+++ b/cmds/incidentd/src/IncidentService.h
@@ -20,13 +20,16 @@
#include "Reporter.h"
+#include "Broadcaster.h"
+#include "Throttler.h"
+#include "WorkDirectory.h"
+
#include <android/os/BnIncidentManager.h>
#include <utils/Looper.h>
-#include <deque>
+#include <vector>
#include <mutex>
-#include "Throttler.h"
namespace android {
namespace os {
@@ -38,60 +41,74 @@
using namespace android::os;
// ================================================================================
-class ReportRequestQueue : public virtual RefBase {
-public:
- ReportRequestQueue();
- virtual ~ReportRequestQueue();
-
- void addRequest(const sp<ReportRequest>& request);
- sp<ReportRequest> getNextRequest();
-
-private:
- mutex mLock;
- deque<sp<ReportRequest> > mQueue;
-};
-
-// ================================================================================
class ReportHandler : public MessageHandler {
public:
- ReportHandler(const sp<Looper>& handlerLooper, const sp<ReportRequestQueue>& queue,
- const sp<Throttler>& throttler);
+ ReportHandler(const sp<WorkDirectory>& workDirectory,
+ const sp<Broadcaster>& broadcaster, const sp<Looper>& handlerLooper,
+ const sp<Throttler>& throttler);
virtual ~ReportHandler();
virtual void handleMessage(const Message& message);
/**
- * Adds a ReportRequest to the queue.
+ * Schedule a report for the "main" report, where it will be delivered to
+ * the uploaders and/or dropbox.
*/
- void scheduleRunReport(const sp<ReportRequest>& request);
+ void schedulePersistedReport(const IncidentReportArgs& args);
+
+ /**
+ * Adds a ReportRequest to the queue for one that has a listener an and fd
+ */
+ void scheduleStreamingReport(const IncidentReportArgs& args,
+ const sp<IIncidentReportStatusListener>& listener,
+ int streamFd);
/**
* Resets mBacklogDelay to the default and schedules sending
* the messages to dropbox.
*/
- void scheduleSendBacklogToDropbox();
+ void scheduleSendBacklog();
private:
mutex mLock;
- nsecs_t mBacklogDelay;
+
+ sp<WorkDirectory> mWorkDirectory;
+ sp<Broadcaster> mBroadcaster;
+
sp<Looper> mHandlerLooper;
- sp<ReportRequestQueue> mQueue;
+ nsecs_t mBacklogDelay;
sp<Throttler> mThrottler;
+ sp<ReportBatch> mBatch;
+
/**
* Runs all of the reports that have been queued.
*/
- void run_report();
+ void take_report();
/**
- * Schedules a dropbox task mBacklogDelay nanoseconds from now.
+ * Schedules permission controller approve the reports.
*/
- void schedule_send_backlog_to_dropbox_locked();
+ void schedule_send_approvals_locked();
/**
- * Sends the backlog to the dropbox service.
+ * Sends the approvals to the PermissionController
*/
- void send_backlog_to_dropbox();
+ void send_approvals();
+
+ /**
+ * Schedules the broadcasts that reports are complete mBacklogDelay nanoseconds from now.
+ * The delay is because typically when an incident report is taken, the system is not
+ * really in a happy state. So we wait a bit before sending the report to let things
+ * quiet down if they can. The urgency is in taking the report, not sharing the report.
+ * However, we don
+ */
+ void schedule_send_broadcasts_locked();
+
+ /**
+ * Sends the broadcasts to the dropbox service.
+ */
+ void send_broadcasts();
};
// ================================================================================
@@ -108,6 +125,17 @@
virtual Status systemRunning();
+ virtual Status getIncidentReportList(const String16& pkg, const String16& cls,
+ vector<String16>* result);
+
+ virtual Status getIncidentReport(const String16& pkg, const String16& cls,
+ const String16& id, IncidentManager::IncidentReport* result);
+
+ virtual Status deleteIncidentReports(const String16& pkg, const String16& cls,
+ const String16& id);
+
+ virtual Status deleteAllIncidentReports(const String16& pkg);
+
// Implement commands for debugging purpose.
virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply,
uint32_t flags) override;
@@ -115,7 +143,8 @@
virtual status_t dump(int fd, const Vector<String16>& args);
private:
- sp<ReportRequestQueue> mQueue;
+ sp<WorkDirectory> mWorkDirectory;
+ sp<Broadcaster> mBroadcaster;
sp<ReportHandler> mHandler;
sp<Throttler> mThrottler;
diff --git a/cmds/incidentd/src/Privacy.cpp b/cmds/incidentd/src/Privacy.cpp
index 6e55f90..386303b 100644
--- a/cmds/incidentd/src/Privacy.cpp
+++ b/cmds/incidentd/src/Privacy.cpp
@@ -23,6 +23,8 @@
namespace os {
namespace incidentd {
+using namespace android::os;
+
uint64_t encode_field_id(const Privacy* p) { return (uint64_t)p->type << 32 | p->field_id; }
const Privacy* lookup(const Privacy* p, uint32_t fieldId) {
@@ -35,39 +37,48 @@
return NULL;
}
-static bool allowDest(const uint8_t dest, const uint8_t policy) {
- switch (policy) {
- case android::os::DEST_LOCAL:
- return dest == android::os::DEST_LOCAL;
- case android::os::DEST_EXPLICIT:
- case DEST_UNSET:
- return dest == android::os::DEST_LOCAL || dest == android::os::DEST_EXPLICIT ||
- dest == DEST_UNSET;
- case android::os::DEST_AUTOMATIC:
+static bool isAllowed(const uint8_t policy, const uint8_t check) {
+ switch (check) {
+ case PRIVACY_POLICY_LOCAL:
+ return policy == PRIVACY_POLICY_LOCAL;
+ case PRIVACY_POLICY_EXPLICIT:
+ case PRIVACY_POLICY_UNSET:
+ return policy == PRIVACY_POLICY_LOCAL
+ || policy == PRIVACY_POLICY_EXPLICIT
+ || policy == PRIVACY_POLICY_UNSET;
+ case PRIVACY_POLICY_AUTOMATIC:
return true;
default:
return false;
}
}
-bool PrivacySpec::operator<(const PrivacySpec& other) const { return dest < other.dest; }
-
-bool PrivacySpec::CheckPremission(const Privacy* privacy, const uint8_t defaultDest) const {
- uint8_t policy = privacy != NULL ? privacy->dest : defaultDest;
- return allowDest(dest, policy);
+PrivacySpec::PrivacySpec(uint8_t argPolicy) {
+ // TODO: Why on earth do we have two definitions of policy. Maybe
+ // it's not too late to clean this up.
+ switch (argPolicy) {
+ case android::os::PRIVACY_POLICY_AUTOMATIC:
+ case android::os::PRIVACY_POLICY_EXPLICIT:
+ case android::os::PRIVACY_POLICY_LOCAL:
+ mPolicy = argPolicy;
+ break;
+ default:
+ mPolicy = android::os::PRIVACY_POLICY_AUTOMATIC;
+ break;
+ }
}
-bool PrivacySpec::RequireAll() const { return dest == android::os::DEST_LOCAL; }
+bool PrivacySpec::operator<(const PrivacySpec& that) const {
+ return mPolicy < that.mPolicy;
+}
-PrivacySpec PrivacySpec::new_spec(int dest) {
- switch (dest) {
- case android::os::DEST_AUTOMATIC:
- case android::os::DEST_EXPLICIT:
- case android::os::DEST_LOCAL:
- return PrivacySpec(dest);
- default:
- return PrivacySpec(android::os::DEST_AUTOMATIC);
- }
+bool PrivacySpec::CheckPremission(const Privacy* privacy, const uint8_t defaultDest) const {
+ uint8_t check = privacy != NULL ? privacy->policy : defaultDest;
+ return isAllowed(mPolicy, check);
+}
+
+bool PrivacySpec::RequireAll() const {
+ return mPolicy == android::os::PRIVACY_POLICY_LOCAL;
}
} // namespace incidentd
diff --git a/cmds/incidentd/src/Privacy.h b/cmds/incidentd/src/Privacy.h
index a0159d9..fc8caae 100644
--- a/cmds/incidentd/src/Privacy.h
+++ b/cmds/incidentd/src/Privacy.h
@@ -18,15 +18,15 @@
#ifndef PRIVACY_H
#define PRIVACY_H
+#include <android/os/IncidentReportArgs.h>
+
#include <stdint.h>
namespace android {
namespace os {
namespace incidentd {
-// This is the default value of DEST enum, sync with privacy.proto
-const uint8_t DEST_UNSET = 255; // DEST_UNSET is not exposed to libincident
-const uint8_t DEST_DEFAULT_VALUE = DEST_UNSET;
+using namespace android::os;
/*
* In order to NOT auto-generate large chuck of code by proto compiler in incidentd,
@@ -48,8 +48,8 @@
// This array is NULL-terminated.
Privacy** children;
- // DESTINATION Enum in frameworks/base/libs/incident/proto/android/privacy.proto.
- uint8_t dest;
+ // DESTINATION Enum in frameworks/base/core/proto/android/privacy.proto.
+ uint8_t policy;
// A list of regexp rules for stripping string fields in proto.
const char** patterns;
};
@@ -63,27 +63,28 @@
/**
* PrivacySpec defines the request has what level of privacy authorization.
* For example, a device without user consent should only be able to upload AUTOMATIC fields.
- * DEST_UNSET are treated as DEST_EXPLICIT.
+ * PRIVACY_POLICY_UNSET are treated as PRIVACY_POLICY_EXPLICIT.
*/
class PrivacySpec {
public:
- const uint8_t dest;
+ explicit PrivacySpec(uint8_t argPolicy);
- PrivacySpec() : dest(DEST_DEFAULT_VALUE) {}
bool operator<(const PrivacySpec& other) const;
// check permission of a policy, if returns true, don't strip the data.
bool CheckPremission(const Privacy* privacy,
- const uint8_t defaultDest = DEST_DEFAULT_VALUE) const;
+ const uint8_t defaultPrivacyPolicy = PRIVACY_POLICY_UNSET) const;
// if returns true, no data need to be stripped.
bool RequireAll() const;
- // Constructs spec using static methods below.
- static PrivacySpec new_spec(int dest);
+ uint8_t getPolicy() const;
private:
- explicit PrivacySpec(uint8_t dest) : dest(dest) {}
+ // unimplemented constructors
+ explicit PrivacySpec();
+
+ uint8_t mPolicy;
};
} // namespace incidentd
diff --git a/cmds/incidentd/src/PrivacyBuffer.cpp b/cmds/incidentd/src/PrivacyBuffer.cpp
deleted file mode 100644
index 08f535d..0000000
--- a/cmds/incidentd/src/PrivacyBuffer.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-#define DEBUG false
-#include "Log.h"
-
-#include "PrivacyBuffer.h"
-#include "incidentd_util.h"
-
-#include <android-base/file.h>
-#include <android/util/protobuf.h>
-#include <log/log.h>
-
-namespace android {
-namespace os {
-namespace incidentd {
-
-/**
- * Write the field to buf based on the wire type, iterator will point to next field.
- * If skip is set to true, no data will be written to buf. Return number of bytes written.
- */
-void PrivacyBuffer::writeFieldOrSkip(uint32_t fieldTag, bool skip) {
- uint8_t wireType = read_wire_type(fieldTag);
- size_t bytesToWrite = 0;
- uint64_t varint = 0;
-
- switch (wireType) {
- case WIRE_TYPE_VARINT:
- varint = mData.readRawVarint();
- if (!skip) {
- mProto.writeRawVarint(fieldTag);
- mProto.writeRawVarint(varint);
- }
- return;
- case WIRE_TYPE_FIXED64:
- if (!skip) mProto.writeRawVarint(fieldTag);
- bytesToWrite = 8;
- break;
- case WIRE_TYPE_LENGTH_DELIMITED:
- bytesToWrite = mData.readRawVarint();
- if (!skip) mProto.writeLengthDelimitedHeader(read_field_id(fieldTag), bytesToWrite);
- break;
- case WIRE_TYPE_FIXED32:
- if (!skip) mProto.writeRawVarint(fieldTag);
- bytesToWrite = 4;
- break;
- }
- if (skip) {
- mData.rp()->move(bytesToWrite);
- } else {
- for (size_t i = 0; i < bytesToWrite; i++) {
- mProto.writeRawByte(mData.next());
- }
- }
-}
-
-/**
- * Strip next field based on its private policy and request spec, then stores data in buf.
- * Return NO_ERROR if succeeds, otherwise BAD_VALUE is returned to indicate bad data in FdBuffer.
- *
- * The iterator must point to the head of a protobuf formatted field for successful operation.
- * After exit with NO_ERROR, iterator points to the next protobuf field's head.
- */
-status_t PrivacyBuffer::stripField(const Privacy* parentPolicy, const PrivacySpec& spec,
- int depth /* use as a counter for this recusive method. */) {
- if (!mData.hasNext() || parentPolicy == NULL) return BAD_VALUE;
- uint32_t fieldTag = mData.readRawVarint();
- uint32_t fieldId = read_field_id(fieldTag);
- const Privacy* policy = lookup(parentPolicy, fieldId);
-
- VLOG("[Depth %2d]Try to strip id %d, wiretype %d", depth, fieldId, read_wire_type(fieldTag));
- if (policy == NULL || policy->children == NULL) {
- bool skip = !spec.CheckPremission(policy, parentPolicy->dest);
- // iterator will point to head of next field
- size_t currentAt = mData.rp()->pos();
- writeFieldOrSkip(fieldTag, skip);
- VLOG("[Depth %2d]Field %d %ss %zu bytes", depth, fieldId, skip ? "skip" : "write",
- get_varint_size(fieldTag) + mData.rp()->pos() - currentAt);
- return NO_ERROR;
- }
- // current field is message type and its sub-fields have extra privacy policies
- uint32_t msgSize = mData.readRawVarint();
- size_t start = mData.rp()->pos();
- uint64_t token = mProto.start(encode_field_id(policy));
- while (mData.rp()->pos() - start != msgSize) {
- status_t err = stripField(policy, spec, depth + 1);
- if (err != NO_ERROR) {
- VLOG("Bad value when stripping id %d, wiretype %d, tag %#x, depth %d, size %d, "
- "relative pos %zu, ", fieldId, read_wire_type(fieldTag), fieldTag, depth,
- msgSize, mData.rp()->pos() - start);
- return err;
- }
- }
- mProto.end(token);
- return NO_ERROR;
-}
-
-// ================================================================================
-PrivacyBuffer::PrivacyBuffer(const Privacy* policy, EncodedBuffer::iterator data)
- : mPolicy(policy), mData(data), mProto(), mSize(0) {}
-
-PrivacyBuffer::~PrivacyBuffer() {}
-
-status_t PrivacyBuffer::strip(const PrivacySpec& spec) {
- VLOG("Strip with spec %d", spec.dest);
- // optimization when no strip happens
- if (mPolicy == NULL || mPolicy->children == NULL || spec.RequireAll()) {
- if (spec.CheckPremission(mPolicy)) mSize = mData.size();
- return NO_ERROR;
- }
- while (mData.hasNext()) {
- status_t err = stripField(mPolicy, spec, 0);
- if (err != NO_ERROR) return err; // Error logged in stripField.
- }
- if (mData.bytesRead() != mData.size()) {
- VLOG("Buffer corrupted: expect %zu bytes, read %zu bytes",
- mData.size(), mData.bytesRead());
- return BAD_VALUE;
- }
- mSize = mProto.size();
- mData.rp()->rewind(); // rewind the read pointer back to beginning after the strip.
- return NO_ERROR;
-}
-
-void PrivacyBuffer::clear() {
- mSize = 0;
- mProto.clear();
-}
-
-size_t PrivacyBuffer::size() const { return mSize; }
-
-status_t PrivacyBuffer::flush(int fd) {
- status_t err = NO_ERROR;
- EncodedBuffer::iterator iter = size() == mData.size() ? mData : mProto.data();
- while (iter.readBuffer() != NULL) {
- err = WriteFully(fd, iter.readBuffer(), iter.currentToRead()) ? NO_ERROR : -errno;
- iter.rp()->move(iter.currentToRead());
- if (err != NO_ERROR) return err;
- }
- return NO_ERROR;
-}
-
-} // namespace incidentd
-} // namespace os
-} // namespace android
diff --git a/cmds/incidentd/src/PrivacyBuffer.h b/cmds/incidentd/src/PrivacyBuffer.h
deleted file mode 100644
index eac3862..0000000
--- a/cmds/incidentd/src/PrivacyBuffer.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-#pragma once
-
-#ifndef PRIVACY_BUFFER_H
-#define PRIVACY_BUFFER_H
-
-#include "Privacy.h"
-
-#include <android/util/EncodedBuffer.h>
-#include <android/util/ProtoOutputStream.h>
-#include <stdint.h>
-#include <utils/Errors.h>
-
-namespace android {
-namespace os {
-namespace incidentd {
-
-using namespace android::util;
-
-/**
- * PrivacyBuffer holds the original protobuf data and strips PII-sensitive fields
- * based on the request and holds stripped data in its own buffer for output.
- */
-class PrivacyBuffer {
-public:
- PrivacyBuffer(const Privacy* policy, EncodedBuffer::iterator data);
- ~PrivacyBuffer();
-
- /**
- * Strip based on the request and hold data in its own buffer. Return NO_ERROR if strip
- * succeeds.
- */
- status_t strip(const PrivacySpec& spec);
-
- /**
- * Clear encoded buffer so it can be reused by another request.
- */
- void clear();
-
- /**
- * Return the size of the stripped data.
- */
- size_t size() const;
-
- /**
- * Flush buffer to the given fd. NO_ERROR is returned if the flush succeeds.
- */
- status_t flush(int fd);
-
-private:
- const Privacy* mPolicy;
- EncodedBuffer::iterator mData;
-
- ProtoOutputStream mProto;
- size_t mSize;
-
- status_t stripField(const Privacy* parentPolicy, const PrivacySpec& spec, int depth);
- void writeFieldOrSkip(uint32_t fieldTag, bool skip);
-};
-
-} // namespace incidentd
-} // namespace os
-} // namespace android
-
-#endif // PRIVACY_BUFFER_H
\ No newline at end of file
diff --git a/cmds/incidentd/src/PrivacyFilter.cpp b/cmds/incidentd/src/PrivacyFilter.cpp
new file mode 100644
index 0000000..7126322
--- /dev/null
+++ b/cmds/incidentd/src/PrivacyFilter.cpp
@@ -0,0 +1,375 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+#define DEBUG false
+#include "Log.h"
+
+#include "incidentd_util.h"
+#include "PrivacyFilter.h"
+#include "proto_util.h"
+
+#include <android-base/file.h>
+#include <android/util/protobuf.h>
+#include <android/util/ProtoFileReader.h>
+#include <log/log.h>
+
+namespace android {
+namespace os {
+namespace incidentd {
+
+// ================================================================================
+/**
+ * Write the field to buf based on the wire type, iterator will point to next field.
+ * If skip is set to true, no data will be written to buf. Return number of bytes written.
+ */
+void write_field_or_skip(ProtoOutputStream* out, const sp<ProtoReader>& in,
+ uint32_t fieldTag, bool skip) {
+ uint8_t wireType = read_wire_type(fieldTag);
+ size_t bytesToWrite = 0;
+ uint64_t varint = 0;
+
+ switch (wireType) {
+ case WIRE_TYPE_VARINT:
+ varint = in->readRawVarint();
+ if (!skip) {
+ out->writeRawVarint(fieldTag);
+ out->writeRawVarint(varint);
+ }
+ return;
+ case WIRE_TYPE_FIXED64:
+ if (!skip) {
+ out->writeRawVarint(fieldTag);
+ }
+ bytesToWrite = 8;
+ break;
+ case WIRE_TYPE_LENGTH_DELIMITED:
+ bytesToWrite = in->readRawVarint();
+ if (!skip) {
+ out->writeLengthDelimitedHeader(read_field_id(fieldTag), bytesToWrite);
+ }
+ break;
+ case WIRE_TYPE_FIXED32:
+ if (!skip) {
+ out->writeRawVarint(fieldTag);
+ }
+ bytesToWrite = 4;
+ break;
+ }
+ if (skip) {
+ in->move(bytesToWrite);
+ } else {
+ for (size_t i = 0; i < bytesToWrite; i++) {
+ out->writeRawByte(in->next());
+ }
+ }
+}
+
+/**
+ * Strip next field based on its private policy and request spec, then stores data in buf.
+ * Return NO_ERROR if succeeds, otherwise BAD_VALUE is returned to indicate bad data in
+ * FdBuffer.
+ *
+ * The iterator must point to the head of a protobuf formatted field for successful operation.
+ * After exit with NO_ERROR, iterator points to the next protobuf field's head.
+ *
+ * depth is the depth of recursion, for debugging.
+ */
+status_t strip_field(ProtoOutputStream* out, const sp<ProtoReader>& in,
+ const Privacy* parentPolicy, const PrivacySpec& spec, int depth) {
+ if (!in->hasNext() || parentPolicy == NULL) {
+ return BAD_VALUE;
+ }
+ uint32_t fieldTag = in->readRawVarint();
+ uint32_t fieldId = read_field_id(fieldTag);
+ const Privacy* policy = lookup(parentPolicy, fieldId);
+
+ if (policy == NULL || policy->children == NULL) {
+ bool skip = !spec.CheckPremission(policy, parentPolicy->policy);
+ // iterator will point to head of next field
+ size_t currentAt = in->bytesRead();
+ write_field_or_skip(out, in, fieldTag, skip);
+ return NO_ERROR;
+ }
+ // current field is message type and its sub-fields have extra privacy policies
+ uint32_t msgSize = in->readRawVarint();
+ size_t start = in->bytesRead();
+ uint64_t token = out->start(encode_field_id(policy));
+ while (in->bytesRead() - start != msgSize) {
+ status_t err = strip_field(out, in, policy, spec, depth + 1);
+ if (err != NO_ERROR) {
+ ALOGW("Bad value when stripping id %d, wiretype %d, tag %#x, depth %d, size %d, "
+ "relative pos %zu, ", fieldId, read_wire_type(fieldTag), fieldTag, depth,
+ msgSize, in->bytesRead() - start);
+ return err;
+ }
+ }
+ out->end(token);
+ return NO_ERROR;
+}
+
+// ================================================================================
+class FieldStripper {
+public:
+ FieldStripper(const Privacy* restrictions, const sp<ProtoReader>& data,
+ uint8_t bufferLevel);
+
+ /**
+ * Take the data that we have, and filter it down so that no fields
+ * are more sensitive than the given privacy policy.
+ */
+ status_t strip(uint8_t privacyPolicy);
+
+ /**
+ * At the current filter level, how many bytes of data there is.
+ */
+ ssize_t dataSize() const { return mSize; }
+
+ /**
+ * Write the data from the current filter level to the file descriptor.
+ */
+ status_t writeData(int fd);
+
+private:
+ /**
+ * The global set of field --> required privacy level mapping.
+ */
+ const Privacy* mRestrictions;
+
+ /**
+ * The current buffer.
+ */
+ sp<ProtoReader> mData;
+
+ /**
+ * The current size of the buffer inside mData.
+ */
+ ssize_t mSize;
+
+ /**
+ * The current privacy policy that the data is filtered to, as an optimization
+ * so we don't always re-filter data that has already been filtered.
+ */
+ uint8_t mCurrentLevel;
+
+};
+
+FieldStripper::FieldStripper(const Privacy* restrictions, const sp<ProtoReader>& data,
+ uint8_t bufferLevel)
+ :mRestrictions(restrictions),
+ mData(data),
+ mSize(data->size()),
+ mCurrentLevel(bufferLevel) {
+ if (mSize < 0) {
+ ALOGW("FieldStripper constructed with a ProtoReader that doesn't support size."
+ " Data will be missing.");
+ }
+}
+
+status_t FieldStripper::strip(const uint8_t privacyPolicy) {
+ // If the current strip level is less (fewer fields retained) than what's already in the
+ // buffer, then we can skip it.
+ if (mCurrentLevel < privacyPolicy) {
+ PrivacySpec spec(privacyPolicy);
+ ProtoOutputStream proto;
+
+ // Optimization when no strip happens.
+ if (mRestrictions == NULL || mRestrictions->children == NULL || spec.RequireAll()) {
+ if (spec.CheckPremission(mRestrictions)) {
+ mSize = mData->size();
+ }
+ return NO_ERROR;
+ }
+
+ while (mData->hasNext()) {
+ status_t err = strip_field(&proto, mData, mRestrictions, spec, 0);
+ if (err != NO_ERROR) {
+ return err; // Error logged in strip_field.
+ }
+ }
+
+ if (mData->bytesRead() != mData->size()) {
+ ALOGW("Buffer corrupted: expect %zu bytes, read %zu bytes", mData->size(),
+ mData->bytesRead());
+ return BAD_VALUE;
+ }
+
+ mData = proto.data();
+ mSize = proto.size();
+ mCurrentLevel = privacyPolicy;
+ }
+ return NO_ERROR;
+}
+
+status_t FieldStripper::writeData(int fd) {
+ status_t err = NO_ERROR;
+ sp<ProtoReader> reader = mData;
+ while (reader->readBuffer() != NULL) {
+ err = WriteFully(fd, reader->readBuffer(), reader->currentToRead()) ? NO_ERROR : -errno;
+ reader->move(reader->currentToRead());
+ if (err != NO_ERROR) return err;
+ }
+ return NO_ERROR;
+}
+
+
+// ================================================================================
+FilterFd::FilterFd(uint8_t privacyPolicy, int fd)
+ :mPrivacyPolicy(privacyPolicy),
+ mFd(fd) {
+}
+
+FilterFd::~FilterFd() {
+}
+
+// ================================================================================
+PrivacyFilter::PrivacyFilter(int sectionId, const Privacy* restrictions)
+ :mSectionId(sectionId),
+ mRestrictions(restrictions),
+ mOutputs() {
+}
+
+PrivacyFilter::~PrivacyFilter() {
+}
+
+void PrivacyFilter::addFd(const sp<FilterFd>& output) {
+ mOutputs.push_back(output);
+}
+
+status_t PrivacyFilter::writeData(const FdBuffer& buffer, uint8_t bufferLevel,
+ size_t* maxSize) {
+ status_t err;
+
+ if (maxSize != NULL) {
+ *maxSize = 0;
+ }
+
+ // Order the writes by privacy filter, with increasing levels of filtration,k
+ // so we can do the filter once, and then write many times.
+ sort(mOutputs.begin(), mOutputs.end(),
+ [](const sp<FilterFd>& a, const sp<FilterFd>& b) -> bool {
+ return a->getPrivacyPolicy() < b->getPrivacyPolicy();
+ });
+
+ uint8_t privacyPolicy = PRIVACY_POLICY_LOCAL; // a.k.a. no filtering
+ FieldStripper fieldStripper(mRestrictions, buffer.data()->read(), bufferLevel);
+ for (const sp<FilterFd>& output: mOutputs) {
+ // Do another level of filtering if necessary
+ if (privacyPolicy != output->getPrivacyPolicy()) {
+ privacyPolicy = output->getPrivacyPolicy();
+ err = fieldStripper.strip(privacyPolicy);
+ if (err != NO_ERROR) {
+ // We can't successfully strip this data. We will skip
+ // the rest of this section.
+ return err;
+ }
+ }
+
+ // Write the resultant buffer to the fd, along with the header.
+ ssize_t dataSize = fieldStripper.dataSize();
+ if (dataSize > 0) {
+ err = write_section_header(output->getFd(), mSectionId, dataSize);
+ if (err != NO_ERROR) {
+ output->onWriteError(err);
+ continue;
+ }
+
+ err = fieldStripper.writeData(output->getFd());
+ if (err != NO_ERROR) {
+ output->onWriteError(err);
+ continue;
+ }
+ }
+
+ if (maxSize != NULL) {
+ if (dataSize > *maxSize) {
+ *maxSize = dataSize;
+ }
+ }
+ }
+
+ return NO_ERROR;
+}
+
+// ================================================================================
+class ReadbackFilterFd : public FilterFd {
+public:
+ ReadbackFilterFd(uint8_t privacyPolicy, int fd);
+
+ virtual void onWriteError(status_t err);
+ status_t getError() { return mError; }
+
+private:
+ status_t mError;
+};
+
+ReadbackFilterFd::ReadbackFilterFd(uint8_t privacyPolicy, int fd)
+ :FilterFd(privacyPolicy, fd),
+ mError(NO_ERROR) {
+}
+
+void ReadbackFilterFd::onWriteError(status_t err) {
+ mError = err;
+}
+
+// ================================================================================
+status_t filter_and_write_report(int to, int from, uint8_t bufferLevel,
+ const IncidentReportArgs& args) {
+ status_t err;
+ sp<ProtoFileReader> reader = new ProtoFileReader(from);
+
+ while (reader->hasNext()) {
+ uint64_t fieldTag = reader->readRawVarint();
+ uint32_t fieldId = read_field_id(fieldTag);
+ uint8_t wireType = read_wire_type(fieldTag);
+ if (wireType == WIRE_TYPE_LENGTH_DELIMITED && args.containsSection(fieldId)) {
+ // We need this field, but we need to strip it to the level provided in args.
+ PrivacyFilter filter(fieldId, get_privacy_of_section(fieldId));
+ filter.addFd(new ReadbackFilterFd(args.getPrivacyPolicy(), to));
+
+ // Read this section from the reader into an FdBuffer
+ size_t sectionSize = reader->readRawVarint();
+ FdBuffer sectionData;
+ err = sectionData.write(reader, sectionSize);
+ if (err != NO_ERROR) {
+ ALOGW("filter_and_write_report FdBuffer.write failed (this shouldn't happen): %s",
+ strerror(-err));
+ return err;
+ }
+
+ // Do the filter and write.
+ err = filter.writeData(sectionData, bufferLevel, nullptr);
+ if (err != NO_ERROR) {
+ ALOGW("filter_and_write_report filter.writeData had an error: %s", strerror(-err));
+ return err;
+ }
+ } else {
+ // We don't need this field. Incident does not have any direct children
+ // other than sections. So just skip them.
+ write_field_or_skip(NULL, reader, fieldTag, true);
+ }
+ }
+
+ err = reader->getError();
+ if (err != NO_ERROR) {
+ ALOGW("filter_and_write_report reader had an error: %s", strerror(-err));
+ return err;
+ }
+
+ return NO_ERROR;
+}
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
diff --git a/cmds/incidentd/src/PrivacyFilter.h b/cmds/incidentd/src/PrivacyFilter.h
new file mode 100644
index 0000000..76b2849
--- /dev/null
+++ b/cmds/incidentd/src/PrivacyFilter.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+#pragma once
+
+#ifndef PRIVACY_BUFFER_H
+#define PRIVACY_BUFFER_H
+
+#include "Privacy.h"
+
+#include "FdBuffer.h"
+
+#include <android/os/IncidentReportArgs.h>
+#include <android/util/ProtoOutputStream.h>
+#include <stdint.h>
+#include <utils/Errors.h>
+
+namespace android {
+namespace os {
+namespace incidentd {
+
+using namespace android::util;
+
+/**
+ * Class to wrap a file descriptor, so callers of PrivacyFilter
+ * can associate additional data with each fd for their own
+ * purposes.
+ */
+class FilterFd : public RefBase {
+public:
+ FilterFd(uint8_t privacyPolicy, int fd);
+ virtual ~FilterFd();
+
+ uint8_t getPrivacyPolicy() const { return mPrivacyPolicy; }
+ int getFd() { return mFd;}
+
+ virtual void onWriteError(status_t err) = 0;
+
+private:
+ uint8_t mPrivacyPolicy;
+ int mFd;
+};
+
+/**
+ * PrivacyFilter holds the original protobuf data and strips PII-sensitive fields
+ * for several requests, streaming them to a set of corresponding file descriptors.
+ */
+class PrivacyFilter {
+public:
+ /**
+ * Constructor, with the field --> privacy restrictions mapping.
+ */
+ PrivacyFilter(int sectionId, const Privacy* restrictions);
+
+ ~PrivacyFilter();
+
+ /**
+ * Add a target file descriptor, and the privacy policy to which
+ * it should be filtered.
+ */
+ void addFd(const sp<FilterFd>& output);
+
+ /**
+ * Write the data, filtered according to the privacy specs, to each of the
+ * file descriptors. Any non-NO_ERROR return codes are fatal to the whole
+ * report. Individual write errors to streams are reported via the callbacks
+ * on the FilterFds.
+ *
+ * If maxSize is not NULL, it will be set to the maximum size buffer that
+ * was written (i.e. after filtering).
+ *
+ * The buffer is assumed to have already been filtered to bufferLevel.
+ */
+ status_t writeData(const FdBuffer& buffer, uint8_t bufferLevel, size_t* maxSize);
+
+private:
+ int mSectionId;
+ const Privacy* mRestrictions;
+ vector<sp<FilterFd>> mOutputs;
+};
+
+status_t filter_and_write_report(int to, int from, uint8_t bufferLevel,
+ const IncidentReportArgs& args);
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
+#endif // PRIVACY_BUFFER_H
diff --git a/cmds/incidentd/src/Reporter.cpp b/cmds/incidentd/src/Reporter.cpp
index 8f62da2..e773e74 100644
--- a/cmds/incidentd/src/Reporter.cpp
+++ b/cmds/incidentd/src/Reporter.cpp
@@ -18,12 +18,17 @@
#include "Reporter.h"
+#include "incidentd_util.h"
#include "Privacy.h"
+#include "PrivacyFilter.h"
+#include "proto_util.h"
#include "report_directory.h"
#include "section_list.h"
-#include <android-base/properties.h>
+#include <android-base/file.h>
#include <android/os/DropBoxManager.h>
+#include <android/util/protobuf.h>
+#include <android/util/ProtoOutputStream.h>
#include <private/android_filesystem_config.h>
#include <utils/SystemClock.h>
@@ -33,308 +38,664 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <string>
-
-/**
- * The directory where the incident reports are stored.
- */
-static const char* INCIDENT_DIRECTORY = "/data/misc/incidents/";
+#include <time.h>
namespace android {
namespace os {
namespace incidentd {
+using namespace android::util;
+
+/**
+ * The field id of the metadata section from
+ * frameworks/base/core/proto/android/os/incident.proto
+ */
+const int FIELD_ID_METADATA = 2;
+
+IncidentMetadata_Destination privacy_policy_to_dest(uint8_t privacyPolicy) {
+ switch (privacyPolicy) {
+ case PRIVACY_POLICY_AUTOMATIC:
+ return IncidentMetadata_Destination_AUTOMATIC;
+ case PRIVACY_POLICY_EXPLICIT:
+ return IncidentMetadata_Destination_EXPLICIT;
+ case PRIVACY_POLICY_LOCAL:
+ return IncidentMetadata_Destination_LOCAL;
+ default:
+ // Anything else reverts to automatic
+ return IncidentMetadata_Destination_AUTOMATIC;
+ }
+}
+
+void poo_make_metadata(IncidentMetadata* result, const IncidentMetadata& full,
+ int64_t reportId, int32_t privacyPolicy, const IncidentReportArgs& args) {
+ result->set_report_id(reportId);
+ result->set_dest(privacy_policy_to_dest(privacyPolicy));
+
+ size_t sectionCount = full.sections_size();
+ for (int sectionIndex = 0; sectionIndex < sectionCount; sectionIndex++) {
+ const IncidentMetadata::SectionStats& sectionStats = full.sections(sectionIndex);
+ if (args.containsSection(sectionStats.id())) {
+ *result->add_sections() = sectionStats;
+ }
+ }
+}
+
+// ARGS must have a containsSection(int) method
+template <typename ARGS> void make_metadata(IncidentMetadata* result, const IncidentMetadata& full,
+ int64_t reportId, int32_t privacyPolicy, ARGS args) {
+ result->set_report_id(reportId);
+ result->set_dest(privacy_policy_to_dest(privacyPolicy));
+
+ size_t sectionCount = full.sections_size();
+ for (int sectionIndex = 0; sectionIndex < sectionCount; sectionIndex++) {
+ const IncidentMetadata::SectionStats& sectionStats = full.sections(sectionIndex);
+ if (args->containsSection(sectionStats.id())) {
+ *result->add_sections() = sectionStats;
+ }
+ }
+}
+
+// ================================================================================
+class StreamingFilterFd : public FilterFd {
+public:
+ StreamingFilterFd(uint8_t privacyPolicy, int fd, const sp<ReportRequest>& request);
+
+ virtual void onWriteError(status_t err);
+
+private:
+ sp<ReportRequest> mRequest;
+};
+
+StreamingFilterFd::StreamingFilterFd(uint8_t privacyPolicy, int fd,
+ const sp<ReportRequest>& request)
+ :FilterFd(privacyPolicy, fd),
+ mRequest(request) {
+}
+
+void StreamingFilterFd::onWriteError(status_t err) {
+ mRequest->setStatus(err);
+}
+
+
+// ================================================================================
+class PersistedFilterFd : public FilterFd {
+public:
+ PersistedFilterFd(uint8_t privacyPolicy, int fd, const sp<ReportFile>& reportFile);
+
+ virtual void onWriteError(status_t err);
+
+private:
+ sp<ReportFile> mReportFile;
+};
+
+PersistedFilterFd::PersistedFilterFd(uint8_t privacyPolicy, int fd,
+ const sp<ReportFile>& reportFile)
+ :FilterFd(privacyPolicy, fd),
+ mReportFile(reportFile) {
+}
+
+void PersistedFilterFd::onWriteError(status_t err) {
+ mReportFile->setWriteError(err);
+}
+
+
// ================================================================================
ReportRequest::ReportRequest(const IncidentReportArgs& a,
- const sp<IIncidentReportStatusListener>& l, int f)
- : args(a), listener(l), fd(f), err(NO_ERROR) {}
+ const sp<IIncidentReportStatusListener>& listener, int fd)
+ :args(a),
+ mListener(listener),
+ mFd(fd),
+ mIsStreaming(fd >= 0),
+ mStatus(NO_ERROR) {
+}
ReportRequest::~ReportRequest() {
- if (fd >= 0) {
+ if (mIsStreaming && mFd >= 0) {
// clean up the opened file descriptor
- close(fd);
+ close(mFd);
}
}
-bool ReportRequest::ok() { return fd >= 0 && err == NO_ERROR; }
-
-// ================================================================================
-ReportRequestSet::ReportRequestSet()
- : mRequests(), mSections(), mMainFd(-1), mMainDest(-1), mMetadata(), mSectionStats() {}
-
-ReportRequestSet::~ReportRequestSet() {}
-
-// TODO: dedup on exact same args and fd, report the status back to listener!
-void ReportRequestSet::add(const sp<ReportRequest>& request) {
- mRequests.push_back(request);
- mSections.merge(request->args);
- mMetadata.set_request_size(mMetadata.request_size() + 1);
+bool ReportRequest::ok() {
+ return mFd >= 0 && mStatus == NO_ERROR;
}
-void ReportRequestSet::setMainFd(int fd) {
- mMainFd = fd;
- mMetadata.set_use_dropbox(fd > 0);
-}
-
-void ReportRequestSet::setMainDest(int dest) {
- mMainDest = dest;
- PrivacySpec spec = PrivacySpec::new_spec(dest);
- switch (spec.dest) {
- case android::os::DEST_AUTOMATIC:
- mMetadata.set_dest(IncidentMetadata_Destination_AUTOMATIC);
- break;
- case android::os::DEST_EXPLICIT:
- mMetadata.set_dest(IncidentMetadata_Destination_EXPLICIT);
- break;
- case android::os::DEST_LOCAL:
- mMetadata.set_dest(IncidentMetadata_Destination_LOCAL);
- break;
+void ReportRequest::closeFd() {
+ if (mIsStreaming && mFd >= 0) {
+ close(mFd);
+ mFd = -1;
}
}
-bool ReportRequestSet::containsSection(int id) { return mSections.containsSection(id); }
-
-IncidentMetadata::SectionStats* ReportRequestSet::sectionStats(int id) {
- if (mSectionStats.find(id) == mSectionStats.end()) {
- IncidentMetadata::SectionStats stats;
- stats.set_id(id);
- mSectionStats[id] = stats;
- }
- return &mSectionStats[id];
-}
-
// ================================================================================
-Reporter::Reporter() : Reporter(INCIDENT_DIRECTORY) { isTest = false; };
+ReportBatch::ReportBatch() {}
-Reporter::Reporter(const char* directory) : batch() {
- char buf[100];
+ReportBatch::~ReportBatch() {}
- mMaxSize = 30 * 1024 * 1024; // incident reports can take up to 30MB on disk
- mMaxCount = 100;
-
- // string ends up with '/' is a directory
- String8 dir = String8(directory);
- if (directory[dir.size() - 1] != '/') dir += "/";
- mIncidentDirectory = dir.string();
-
- // There can't be two at the same time because it's on one thread.
- mStartTime = time(NULL);
- strftime(buf, sizeof(buf), "incident-%Y%m%d-%H%M%S", localtime(&mStartTime));
- mFilename = mIncidentDirectory + buf;
+void ReportBatch::addPersistedReport(const IncidentReportArgs& args) {
+ ComponentName component(args.receiverPkg(), args.receiverCls());
+ map<ComponentName, sp<ReportRequest>>::iterator found = mPersistedRequests.find(component);
+ if (found == mPersistedRequests.end()) {
+ // not found
+ mPersistedRequests[component] = new ReportRequest(args, nullptr, -1);
+ } else {
+ // found
+ sp<ReportRequest> request = found->second;
+ request->args.merge(args);
+ }
}
-Reporter::~Reporter() {}
+void ReportBatch::addStreamingReport(const IncidentReportArgs& args,
+ const sp<IIncidentReportStatusListener>& listener, int streamFd) {
+ mStreamingRequests.push_back(new ReportRequest(args, listener, streamFd));
+}
-Reporter::run_report_status_t Reporter::runReport(size_t* reportByteSize) {
+bool ReportBatch::empty() const {
+ return mPersistedRequests.size() == 0 && mStreamingRequests.size() == 0;
+}
+
+sp<ReportRequest> ReportBatch::getPersistedRequest(const ComponentName& component) {
+ map<ComponentName, sp<ReportRequest>>::iterator it = mPersistedRequests.find(component);
+ if (it != mPersistedRequests.find(component)) {
+ return it->second;
+ } else {
+ return nullptr;
+ }
+}
+
+void ReportBatch::forEachPersistedRequest(const function<void (const sp<ReportRequest>&)>& func) {
+ for (map<ComponentName, sp<ReportRequest>>::iterator it = mPersistedRequests.begin();
+ it != mPersistedRequests.end(); it++) {
+ func(it->second);
+ }
+}
+
+void ReportBatch::forEachStreamingRequest(const function<void (const sp<ReportRequest>&)>& func) {
+ for (vector<sp<ReportRequest>>::iterator request = mStreamingRequests.begin();
+ request != mStreamingRequests.end(); request++) {
+ func(*request);
+ }
+}
+
+void ReportBatch::forEachListener(
+ const function<void (const sp<IIncidentReportStatusListener>&)>& func) {
+ for (map<ComponentName, sp<ReportRequest>>::iterator it = mPersistedRequests.begin();
+ it != mPersistedRequests.end(); it++) {
+ sp<IIncidentReportStatusListener> listener = it->second->getListener();
+ if (listener != nullptr) {
+ func(listener);
+ }
+ }
+ for (vector<sp<ReportRequest>>::iterator request = mStreamingRequests.begin();
+ request != mStreamingRequests.end(); request++) {
+ sp<IIncidentReportStatusListener> listener = (*request)->getListener();
+ if (listener != nullptr) {
+ func(listener);
+ }
+ }
+}
+
+void ReportBatch::forEachListener(int sectionId,
+ const function<void (const sp<IIncidentReportStatusListener>&)>& func) {
+ for (map<ComponentName, sp<ReportRequest>>::iterator it = mPersistedRequests.begin();
+ it != mPersistedRequests.end(); it++) {
+ if (it->second->containsSection(sectionId)) {
+ sp<IIncidentReportStatusListener> listener = it->second->getListener();
+ if (listener != nullptr) {
+ func(listener);
+ }
+ }
+ }
+ for (vector<sp<ReportRequest>>::iterator request = mStreamingRequests.begin();
+ request != mStreamingRequests.end(); request++) {
+ if ((*request)->containsSection(sectionId)) {
+ sp<IIncidentReportStatusListener> listener = (*request)->getListener();
+ if (listener != nullptr) {
+ func(listener);
+ }
+ }
+ }
+}
+
+void ReportBatch::getCombinedPersistedArgs(IncidentReportArgs* result) {
+ for (map<ComponentName, sp<ReportRequest>>::iterator it = mPersistedRequests.begin();
+ it != mPersistedRequests.end(); it++) {
+ result->merge(it->second->args);
+ }
+}
+
+bool ReportBatch::containsSection(int sectionId) {
+ // We don't cache this, because in case of error, we remove requests
+ // from the batch, and this is easier than recomputing the set.
+ for (map<ComponentName, sp<ReportRequest>>::iterator it = mPersistedRequests.begin();
+ it != mPersistedRequests.end(); it++) {
+ if (it->second->containsSection(sectionId)) {
+ return true;
+ }
+ }
+ for (vector<sp<ReportRequest>>::iterator request = mStreamingRequests.begin();
+ request != mStreamingRequests.end(); request++) {
+ if ((*request)->containsSection(sectionId)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void ReportBatch::clearPersistedRequests() {
+ mPersistedRequests.clear();
+}
+
+void ReportBatch::getFailedRequests(vector<sp<ReportRequest>>* requests) {
+ for (map<ComponentName, sp<ReportRequest>>::iterator it = mPersistedRequests.begin();
+ it != mPersistedRequests.end(); it++) {
+ if (it->second->getStatus() != NO_ERROR) {
+ requests->push_back(it->second);
+ }
+ }
+ for (vector<sp<ReportRequest>>::iterator request = mStreamingRequests.begin();
+ request != mStreamingRequests.end(); request++) {
+ if ((*request)->getStatus() != NO_ERROR) {
+ requests->push_back(*request);
+ }
+ }
+}
+
+void ReportBatch::removeRequest(const sp<ReportRequest>& request) {
+ for (map<ComponentName, sp<ReportRequest>>::iterator it = mPersistedRequests.begin();
+ it != mPersistedRequests.end(); it++) {
+ if (it->second == request) {
+ mPersistedRequests.erase(it);
+ return;
+ }
+ }
+ for (vector<sp<ReportRequest>>::iterator it = mStreamingRequests.begin();
+ it != mStreamingRequests.end(); it++) {
+ if (*it == request) {
+ mStreamingRequests.erase(it);
+ return;
+ }
+ }
+}
+
+// ================================================================================
+ReportWriter::ReportWriter(const sp<ReportBatch>& batch)
+ :mBatch(batch),
+ mPersistedFile(),
+ mMaxPersistedPrivacyPolicy(PRIVACY_POLICY_UNSET) {
+}
+
+ReportWriter::~ReportWriter() {
+}
+
+void ReportWriter::setPersistedFile(sp<ReportFile> file) {
+ mPersistedFile = file;
+}
+
+void ReportWriter::setMaxPersistedPrivacyPolicy(uint8_t privacyPolicy) {
+ mMaxPersistedPrivacyPolicy = privacyPolicy;
+}
+
+void ReportWriter::startSection(int sectionId) {
+ mCurrentSectionId = sectionId;
+ mSectionStartTimeMs = uptimeMillis();
+
+ mSectionStatsCalledForSectionId = -1;
+ mDumpSizeBytes = 0;
+ mDumpDurationMs = 0;
+ mSectionTimedOut = false;
+ mSectionTruncated = false;
+ mSectionBufferSuccess = false;
+ mHadError = false;
+ mSectionErrors.clear();
+
+}
+
+void ReportWriter::setSectionStats(const FdBuffer& buffer) {
+ mSectionStatsCalledForSectionId = mCurrentSectionId;
+ mDumpSizeBytes = buffer.size();
+ mDumpDurationMs = buffer.durationMs();
+ mSectionTimedOut = buffer.timedOut();
+ mSectionTruncated = buffer.truncated();
+ mSectionBufferSuccess = !buffer.timedOut() && !buffer.truncated();
+}
+
+void ReportWriter::endSection(IncidentMetadata::SectionStats* sectionMetadata) {
+ long endTime = uptimeMillis();
+
+ if (mSectionStatsCalledForSectionId != mCurrentSectionId) {
+ ALOGW("setSectionStats not called for section %d", mCurrentSectionId);
+ }
+
+ sectionMetadata->set_id(mCurrentSectionId);
+ sectionMetadata->set_success((!mHadError) && mSectionBufferSuccess);
+ sectionMetadata->set_report_size_bytes(mMaxSectionDataFilteredSize);
+ sectionMetadata->set_exec_duration_ms(endTime - mSectionStartTimeMs);
+ sectionMetadata->set_dump_size_bytes(mDumpSizeBytes);
+ sectionMetadata->set_dump_duration_ms(mDumpDurationMs);
+ sectionMetadata->set_timed_out(mSectionTimedOut);
+ sectionMetadata->set_is_truncated(mSectionTruncated);
+ sectionMetadata->set_error_msg(mSectionErrors);
+}
+
+void ReportWriter::warning(const Section* section, status_t err, const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ vflog(section, err, ANDROID_LOG_ERROR, "error", format, args);
+ va_end(args);
+}
+
+void ReportWriter::error(const Section* section, status_t err, const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ vflog(section, err, ANDROID_LOG_WARN, "warning", format, args);
+ va_end(args);
+}
+
+void ReportWriter::vflog(const Section* section, status_t err, int level, const char* levelText,
+ const char* format, va_list args) {
+ const char* prefixFormat = "%s in section %d (%d) '%s': ";
+ int prefixLen = snprintf(NULL, 0, prefixFormat, levelText, section->id,
+ err, strerror(-err));
+
+ va_list measureArgs;
+ va_copy(measureArgs, args);
+ int messageLen = vsnprintf(NULL, 0, format, args);
+ va_end(measureArgs);
+
+ char* line = (char*)malloc(prefixLen + messageLen + 1);
+ if (line == NULL) {
+ // All hope is lost, just give up.
+ return;
+ }
+
+ sprintf(line, prefixFormat, levelText, section->id, err, strerror(-err));
+
+ vsprintf(line + prefixLen, format, args);
+
+ __android_log_write(level, LOG_TAG, line);
+
+ if (mSectionErrors.length() == 0) {
+ mSectionErrors = line;
+ } else {
+ mSectionErrors += '\n';
+ mSectionErrors += line;
+ }
+
+ free(line);
+
+ if (level >= ANDROID_LOG_ERROR) {
+ mHadError = true;
+ }
+}
+
+// Reads data from FdBuffer and writes it to the requests file descriptor.
+status_t ReportWriter::writeSection(const FdBuffer& buffer) {
+ PrivacyFilter filter(mCurrentSectionId, get_privacy_of_section(mCurrentSectionId));
+
+ // Add the fd for the persisted requests
+ if (mPersistedFile != nullptr) {
+ filter.addFd(new PersistedFilterFd(mMaxPersistedPrivacyPolicy,
+ mPersistedFile->getDataFileFd(), mPersistedFile));
+ }
+
+ // Add the fds for the streamed requests
+ mBatch->forEachStreamingRequest([&filter, this](const sp<ReportRequest>& request) {
+ if (request->ok() && request->args.containsSection(mCurrentSectionId)) {
+ filter.addFd(new StreamingFilterFd(request->args.getPrivacyPolicy(),
+ request->getFd(), request));
+ }
+ });
+
+ return filter.writeData(buffer, PRIVACY_POLICY_LOCAL, &mMaxSectionDataFilteredSize);
+}
+
+
+// ================================================================================
+Reporter::Reporter(const sp<WorkDirectory>& workDirectory, const sp<ReportBatch>& batch)
+ :mWorkDirectory(workDirectory),
+ mWriter(batch),
+ mBatch(batch) {
+}
+
+Reporter::~Reporter() {
+}
+
+void Reporter::runReport(size_t* reportByteSize) {
status_t err = NO_ERROR;
- bool needMainFd = false;
- int mainFd = -1;
- int mainDest = -1;
- int sectionCount = 0;
- HeaderSection headers;
- MetadataSection metadataSection;
- std::string buildType = android::base::GetProperty("ro.build.type", "");
- const bool isUserdebugOrEng = buildType == "userdebug" || buildType == "eng";
- // See if we need the main file
- for (ReportRequestSet::iterator it = batch.begin(); it != batch.end(); it++) {
- if ((*it)->fd < 0 && mainFd < 0) {
- needMainFd = true;
- mainDest = (*it)->args.dest();
- break;
- }
- }
- if (needMainFd) {
- // Create the directory
- if (!isTest) err = create_directory(mIncidentDirectory);
- if (err != NO_ERROR) {
- goto DONE;
- }
+ IncidentMetadata metadata;
+ int persistedPrivacyPolicy = PRIVACY_POLICY_UNSET;
- // If there are too many files in the directory (for whatever reason),
- // delete the oldest ones until it's under the limit. Doing this first
- // does mean that we can go over, so the max size is not a hard limit.
- if (!isTest) clean_directory(mIncidentDirectory, mMaxSize, mMaxCount);
-
- // Open the file.
- err = create_file(&mainFd);
- if (err != NO_ERROR) {
- goto DONE;
- }
-
- // Add to the set
- batch.setMainFd(mainFd);
- batch.setMainDest(mainDest);
- }
+ (*reportByteSize) = 0;
// Tell everyone that we're starting.
- for (ReportRequestSet::iterator it = batch.begin(); it != batch.end(); it++) {
- if ((*it)->listener != NULL) {
- (*it)->listener->onReportStarted();
+ ALOGI("Starting incident report");
+ mBatch->forEachListener([](const auto& listener) { listener->onReportStarted(); });
+
+ if (mBatch->hasPersistedReports()) {
+ // Open a work file to contain the contents of all of the persisted reports.
+ // For this block, if we can't initialize the report file for some reason,
+ // then we will remove the persisted ReportRequests from the report, but
+ // continue with the streaming ones.
+ mPersistedFile = mWorkDirectory->createReportFile();
+ ALOGI("Report will be persisted: envelope: %s data: %s",
+ mPersistedFile->getEnvelopeFileName().c_str(),
+ mPersistedFile->getDataFileName().c_str());
+
+ // Record all of the metadata to the persisted file's metadata file.
+ // It will be read from there and reconstructed as the actual reports
+ // are sent out.
+ if (mPersistedFile != nullptr) {
+ mBatch->forEachPersistedRequest([this, &persistedPrivacyPolicy](
+ const sp<ReportRequest>& request) {
+ mPersistedFile->addReport(request->args);
+ if (request->args.getPrivacyPolicy() < persistedPrivacyPolicy) {
+ persistedPrivacyPolicy = request->args.getPrivacyPolicy();
+ }
+ });
+ mPersistedFile->setMaxPersistedPrivacyPolicy(persistedPrivacyPolicy);
+ err = mPersistedFile->saveEnvelope();
+ if (err != NO_ERROR) {
+ mWorkDirectory->remove(mPersistedFile);
+ mPersistedFile = nullptr;
+ }
+ mWriter.setMaxPersistedPrivacyPolicy(persistedPrivacyPolicy);
+ }
+
+ if (mPersistedFile != nullptr) {
+ err = mPersistedFile->startWritingDataFile();
+ if (err != NO_ERROR) {
+ mWorkDirectory->remove(mPersistedFile);
+ mPersistedFile = nullptr;
+ }
+ }
+
+ if (mPersistedFile != nullptr) {
+ mWriter.setPersistedFile(mPersistedFile);
+ } else {
+ ALOGW("Error creating the persisted file, so clearing persisted reports.");
+ // If we couldn't open the file (permissions err, etc), then
+ // we still want to proceed with any streaming reports, but
+ // cancel all of the persisted ones.
+ mBatch->forEachPersistedRequest([](const sp<ReportRequest>& request) {
+ sp<IIncidentReportStatusListener> listener = request->getListener();
+ if (listener != nullptr) {
+ listener->onReportFailed();
+ }
+ });
+ mBatch->clearPersistedRequests();
}
}
- // Write the incident headers
- headers.Execute(&batch);
+ // If we have a persisted ID, then we allow all the readers to see that. There's
+ // enough in the data to allow for a join, and nothing in here that intrisincally
+ // could ever prevent that, so just give them the ID. If we don't have that then we
+ // make and ID that's extremely likely to be unique, but clock resetting could allow
+ // it to be duplicate.
+ int64_t reportId;
+ if (mPersistedFile != nullptr) {
+ reportId = mPersistedFile->getTimestampNs();
+ } else {
+ struct timespec spec;
+ clock_gettime(CLOCK_REALTIME, &spec);
+ reportId = (spec.tv_sec) * 1000 + spec.tv_nsec;
+ }
+
+ // Write the incident report headers - each request gets its own headers. It's different
+ // from the other top-level fields in IncidentReport that are the sections where the rest
+ // is all shared data (although with their own individual privacy filtering).
+ mBatch->forEachStreamingRequest([](const sp<ReportRequest>& request) {
+ const vector<vector<uint8_t>>& headers = request->args.headers();
+ for (vector<vector<uint8_t>>::const_iterator buf = headers.begin(); buf != headers.end();
+ buf++) {
+ // If there was an error now, there will be an error later and we will remove
+ // it from the list then.
+ write_header_section(request->getFd(), *buf);
+ }
+ });
+
+ // If writing to any of the headers failed, we don't want to keep processing
+ // sections for it.
+ cancel_and_remove_failed_requests();
// For each of the report fields, see if we need it, and if so, execute the command
// and report to those that care that we're doing it.
for (const Section** section = SECTION_LIST; *section; section++) {
- const int id = (*section)->id;
- if ((*section)->userdebugAndEngOnly && !isUserdebugOrEng) {
- VLOG("Skipping incident report section %d '%s' because it's limited to userdebug/eng",
- id, (*section)->name.string());
+ const int sectionId = (*section)->id;
+
+ // If nobody wants this section, skip it.
+ if (!mBatch->containsSection(sectionId)) {
continue;
}
- if (this->batch.containsSection(id)) {
- VLOG("Taking incident report section %d '%s'", id, (*section)->name.string());
- for (ReportRequestSet::iterator it = batch.begin(); it != batch.end(); it++) {
- if ((*it)->listener != NULL && (*it)->args.containsSection(id)) {
- (*it)->listener->onReportSectionStatus(
- id, IIncidentReportStatusListener::STATUS_STARTING);
- }
- }
- // Execute - go get the data and write it into the file descriptors.
- IncidentMetadata::SectionStats* stats = batch.sectionStats(id);
- int64_t startTime = uptimeMillis();
- err = (*section)->Execute(&batch);
- int64_t endTime = uptimeMillis();
- stats->set_exec_duration_ms(endTime - startTime);
- if (err != NO_ERROR) {
- ALOGW("Incident section %s (%d) failed: %s. Stopping report.",
- (*section)->name.string(), id, strerror(-err));
- // Execute() has already recorded this status. Only update if there's new failure.
- stats->set_success(false);
- goto DONE;
- }
- (*reportByteSize) += stats->report_size_bytes();
+ ALOGD("Start incident report section %d '%s'", sectionId, (*section)->name.string());
+ IncidentMetadata::SectionStats* sectionMetadata = metadata.add_sections();
- // Notify listener of starting
- for (ReportRequestSet::iterator it = batch.begin(); it != batch.end(); it++) {
- if ((*it)->listener != NULL && (*it)->args.containsSection(id)) {
- (*it)->listener->onReportSectionStatus(
- id, IIncidentReportStatusListener::STATUS_FINISHED);
- }
- }
- VLOG("Finish incident report section %d '%s'", id, (*section)->name.string());
- sectionCount++;
+ // Notify listener of starting
+ mBatch->forEachListener(sectionId, [sectionId](const auto& listener) {
+ listener->onReportSectionStatus(
+ sectionId, IIncidentReportStatusListener::STATUS_STARTING);
+ });
+
+ // Go get the data and write it into the file descriptors.
+ mWriter.startSection(sectionId);
+ err = (*section)->Execute(&mWriter);
+ mWriter.endSection(sectionMetadata);
+
+ // Sections returning errors are fatal. Most errors should not be fatal.
+ if (err != NO_ERROR) {
+ mWriter.error((*section), err, "Section failed. Stopping report.");
+ goto DONE;
}
+
+ // The returned max data size is used for throttling too many incident reports.
+ (*reportByteSize) += sectionMetadata->report_size_bytes();
+
+ // For any requests that failed during this section, remove them now. We do this
+ // before calling back about section finished, so listeners do not erroniously get the
+ // impression that the section succeeded. But we do it here instead of inside
+ // writeSection so that the callback is done from a known context and not from the
+ // bowels of a section, where changing the batch could cause odd errors.
+ cancel_and_remove_failed_requests();
+
+ // Notify listener of finishing
+ mBatch->forEachListener(sectionId, [sectionId](const auto& listener) {
+ listener->onReportSectionStatus(
+ sectionId, IIncidentReportStatusListener::STATUS_FINISHED);
+ });
+
+ ALOGD("Finish incident report section %d '%s'", sectionId, (*section)->name.string());
}
DONE:
- ALOGD("Incident reporting took %d sections.", sectionCount);
- // Reports the metdadata when taking the incident report.
- if (!isTest) metadataSection.Execute(&batch);
+ // Finish up the persisted file.
+ if (mPersistedFile != nullptr) {
+ mPersistedFile->closeDataFile();
- // Close the file.
- if (mainFd >= 0) {
- close(mainFd);
- }
+ // Set the stored metadata
+ IncidentReportArgs combinedArgs;
+ mBatch->getCombinedPersistedArgs(&combinedArgs);
+ IncidentMetadata persistedMetadata;
+ make_metadata(&persistedMetadata, metadata, mPersistedFile->getTimestampNs(),
+ persistedPrivacyPolicy, &combinedArgs);
+ mPersistedFile->setMetadata(persistedMetadata);
- // Tell everyone that we're done.
- for (ReportRequestSet::iterator it = batch.begin(); it != batch.end(); it++) {
- if ((*it)->listener != NULL) {
- if (err == NO_ERROR) {
- (*it)->listener->onReportFinished();
- } else {
- (*it)->listener->onReportFailed();
- }
+ mPersistedFile->markCompleted();
+ err = mPersistedFile->saveEnvelope();
+ if (err != NO_ERROR) {
+ ALOGW("mPersistedFile->saveEnvelope returned %s. Won't send broadcast",
+ strerror(-err));
+ // Abandon ship.
+ mWorkDirectory->remove(mPersistedFile);
}
}
- // Put the report into dropbox.
- if (needMainFd && err == NO_ERROR) {
- sp<DropBoxManager> dropbox = new DropBoxManager();
- Status status = dropbox->addFile(String16("incident"), mFilename, 0);
- ALOGD("Incident report done. dropbox status=%s\n", status.toString8().string());
- if (!status.isOk()) {
- return REPORT_NEEDS_DROPBOX;
+ // Write the metadata to the streaming ones
+ mBatch->forEachStreamingRequest([reportId, &metadata](const sp<ReportRequest>& request) {
+ IncidentMetadata streamingMetadata;
+ make_metadata(&streamingMetadata, metadata, reportId,
+ request->args.getPrivacyPolicy(), request);
+ status_t nonFatalErr = write_section(request->getFd(), FIELD_ID_METADATA,
+ streamingMetadata);
+ if (nonFatalErr != NO_ERROR) {
+ ALOGW("Error writing the metadata to streaming incident report. This is the last"
+ " thing so we won't return an error: %s", strerror(nonFatalErr));
}
+ });
- // If the status was ok, delete the file. If not, leave it around until the next
- // boot or the next checkin. If the directory gets too big older files will
- // be rotated out.
- if (!isTest) unlink(mFilename.c_str());
+ // Finish up the streaming ones.
+ mBatch->forEachStreamingRequest([](const sp<ReportRequest>& request) {
+ request->closeFd();
+ });
+
+ // Tell the listeners that we're done.
+ if (err == NO_ERROR) {
+ mBatch->forEachListener([](const auto& listener) {
+ listener->onReportFinished();
+ });
+ } else {
+ mBatch->forEachListener([](const auto& listener) {
+ listener->onReportFailed();
+ });
}
- return REPORT_FINISHED;
+ ALOGI("Done taking incident report err=%s", strerror(-err));
}
-/**
- * Create our output file and set the access permissions to -rw-rw----
- */
-status_t Reporter::create_file(int* fd) {
- const char* filename = mFilename.c_str();
-
- *fd = open(filename, O_CREAT | O_TRUNC | O_RDWR | O_CLOEXEC, 0660);
- if (*fd < 0) {
- ALOGE("Couldn't open incident file: %s (%s)", filename, strerror(errno));
- return -errno;
- }
-
- // Override umask. Not super critical. If it fails go on with life.
- chmod(filename, 0660);
-
- if (chown(filename, AID_INCIDENTD, AID_INCIDENTD)) {
- ALOGE("Unable to change ownership of incident file %s: %s\n", filename, strerror(errno));
- status_t err = -errno;
- unlink(mFilename.c_str());
- return err;
- }
-
- return NO_ERROR;
-}
-
-Reporter::run_report_status_t Reporter::upload_backlog() {
- DIR* dir;
- struct dirent* entry;
- struct stat st;
- status_t err;
-
- ALOGD("Start uploading backlogs in %s", INCIDENT_DIRECTORY);
- if ((err = create_directory(INCIDENT_DIRECTORY)) != NO_ERROR) {
- ALOGE("directory doesn't exist: %s", strerror(-err));
- return REPORT_FINISHED;
- }
-
- if ((dir = opendir(INCIDENT_DIRECTORY)) == NULL) {
- ALOGE("Couldn't open incident directory: %s", INCIDENT_DIRECTORY);
- return REPORT_NEEDS_DROPBOX;
- }
-
- sp<DropBoxManager> dropbox = new DropBoxManager();
-
- // Enumerate, count and add up size
- int count = 0;
- while ((entry = readdir(dir)) != NULL) {
- if (entry->d_name[0] == '.') {
- continue;
+void Reporter::cancel_and_remove_failed_requests() {
+ // Handle a failure in the persisted file
+ if (mPersistedFile != nullptr) {
+ if (mPersistedFile->getWriteError() != NO_ERROR) {
+ ALOGW("Error writing to the persisted file (%s). Closing it and canceling.",
+ strerror(-mPersistedFile->getWriteError()));
+ mBatch->forEachPersistedRequest([this](const sp<ReportRequest>& request) {
+ sp<IIncidentReportStatusListener> listener = request->getListener();
+ if (listener != nullptr) {
+ listener->onReportFailed();
+ }
+ mBatch->removeRequest(request);
+ });
+ mWriter.setPersistedFile(nullptr);
+ mPersistedFile->closeDataFile();
+ mWorkDirectory->remove(mPersistedFile);
+ mPersistedFile = nullptr;
}
- String8 filename = String8(INCIDENT_DIRECTORY) + entry->d_name;
- if (stat(filename.string(), &st) != 0) {
- ALOGE("Unable to stat file %s", filename.string());
- continue;
- }
- if (!S_ISREG(st.st_mode)) {
- continue;
- }
-
- Status status = dropbox->addFile(String16("incident"), filename.string(), 0);
- ALOGD("Incident report done. dropbox status=%s\n", status.toString8().string());
- if (!status.isOk()) {
- return REPORT_NEEDS_DROPBOX;
- }
-
- // If the status was ok, delete the file. If not, leave it around until the next
- // boot or the next checkin. If the directory gets too big older files will
- // be rotated out.
- unlink(filename.string());
- count++;
}
- ALOGD("Successfully uploaded %d files to Dropbox.", count);
- closedir(dir);
- return REPORT_FINISHED;
+ // Handle failures in the streaming files
+ vector<sp<ReportRequest>> failed;
+ mBatch->getFailedRequests(&failed);
+ for (sp<ReportRequest>& request: failed) {
+ ALOGW("Error writing to a request stream (%s). Closing it and canceling.",
+ strerror(-request->getStatus()));
+ sp<IIncidentReportStatusListener> listener = request->getListener();
+ if (listener != nullptr) {
+ listener->onReportFailed();
+ }
+ request->closeFd(); // Will only close the streaming ones.
+ mBatch->removeRequest(request);
+ }
}
} // namespace incidentd
diff --git a/cmds/incidentd/src/Reporter.h b/cmds/incidentd/src/Reporter.h
index 2a3abd7..e7a474f 100644
--- a/cmds/incidentd/src/Reporter.h
+++ b/cmds/incidentd/src/Reporter.h
@@ -15,103 +15,247 @@
*/
#pragma once
-#ifndef REPORTER_H
-#define REPORTER_H
+#include "FdBuffer.h"
+#include "Throttler.h"
+#include "WorkDirectory.h"
+#include "frameworks/base/core/proto/android/os/metadata.pb.h"
+#include <android/content/ComponentName.h>
#include <android/os/IIncidentReportStatusListener.h>
#include <android/os/IncidentReportArgs.h>
+#include <android/util/protobuf.h>
#include <map>
#include <string>
#include <vector>
#include <time.h>
-
-#include "Throttler.h"
-#include "frameworks/base/libs/incident/proto/android/os/metadata.pb.h"
+#include <stdarg.h>
namespace android {
namespace os {
namespace incidentd {
+using namespace std;
+using namespace android::content;
+using namespace android::os;
+
+class Section;
+
// ================================================================================
-struct ReportRequest : public virtual RefBase {
+class ReportRequest : public virtual RefBase {
+public:
IncidentReportArgs args;
- sp<IIncidentReportStatusListener> listener;
- int fd;
- status_t err;
ReportRequest(const IncidentReportArgs& args, const sp<IIncidentReportStatusListener>& listener,
int fd);
virtual ~ReportRequest();
+ bool isStreaming() { return mIsStreaming; }
+
+ void setStatus(status_t err) { mStatus = err; }
+ status_t getStatus() const { return mStatus; }
+
bool ok(); // returns true if the request is ok for write.
+
+ bool containsSection(int sectionId) const { return args.containsSection(sectionId); }
+
+ sp<IIncidentReportStatusListener> getListener() { return mListener; }
+
+ int getFd() { return mFd; }
+
+ int setPersistedFd(int fd);
+
+ void closeFd();
+
+private:
+ sp<IIncidentReportStatusListener> mListener;
+ int mFd;
+ bool mIsStreaming;
+ status_t mStatus;
};
// ================================================================================
-class ReportRequestSet {
+class ReportBatch : public virtual RefBase {
public:
- ReportRequestSet();
- ~ReportRequestSet();
+ ReportBatch();
+ virtual ~ReportBatch();
- void add(const sp<ReportRequest>& request);
- void setMainFd(int fd);
- void setMainDest(int dest);
+ // TODO: Should there be some kind of listener associated with the
+ // component? Could be good for getting status updates e.g. in the ui,
+ // as it progresses. But that's out of scope for now.
- typedef vector<sp<ReportRequest>>::iterator iterator;
+ /**
+ * Schedule a report for the "main" report, where it will be delivered to
+ * the uploaders and/or dropbox.
+ */
+ void addPersistedReport(const IncidentReportArgs& args);
- iterator begin() { return mRequests.begin(); }
- iterator end() { return mRequests.end(); }
+ /**
+ * Adds a ReportRequest to the queue for one that has a listener an and fd
+ */
+ void addStreamingReport(const IncidentReportArgs& args,
+ const sp<IIncidentReportStatusListener>& listener, int streamFd);
- int mainFd() { return mMainFd; }
- int mainDest() { return mMainDest; }
- IncidentMetadata& metadata() { return mMetadata; }
- map<int, IncidentMetadata::SectionStats>& allSectionStats() { return mSectionStats; }
+ /**
+ * Returns whether both queues are empty.
+ */
+ bool empty() const;
+ /**
+ * Returns whether there are any persisted records.
+ */
+ bool hasPersistedReports() const { return mPersistedRequests.size() > 0; }
+
+ /**
+ * Return the persisted request for the given component, or nullptr.
+ */
+ sp<ReportRequest> getPersistedRequest(const ComponentName& component);
+
+ /**
+ * Call func(request) for each Request.
+ */
+ void forEachPersistedRequest(const function<void (const sp<ReportRequest>&)>& func);
+
+ /**
+ * Call func(request) for each Request.
+ */
+ void forEachStreamingRequest(const function<void (const sp<ReportRequest>&)>& func);
+
+ /**
+ * Call func(request) for each file descriptor that has
+ */
+ void forEachFd(int sectionId, const function<void (const sp<ReportRequest>&)>& func);
+
+ /**
+ * Call func(listener) for every listener in this batch.
+ */
+ void forEachListener(const function<void (const sp<IIncidentReportStatusListener>&)>& func);
+
+ /**
+ * Call func(listener) for every listener in this batch that requests
+ * sectionId.
+ */
+ void forEachListener(int sectionId,
+ const function<void (const sp<IIncidentReportStatusListener>&)>& func);
+ /**
+ * Get an IncidentReportArgs that represents the combined args for the
+ * persisted requests.
+ */
+ void getCombinedPersistedArgs(IncidentReportArgs* results);
+
+ /**
+ * Return whether any of the requests contain the section.
+ */
bool containsSection(int id);
- IncidentMetadata::SectionStats* sectionStats(int id);
+
+ /**
+ * Remove all of the broadcast (persisted) requests.
+ */
+ void clearPersistedRequests();
+
+ /**
+ * Get the requests that have encountered errors.
+ */
+ void getFailedRequests(vector<sp<ReportRequest>>* requests);
+
+ /**
+ * Remove the request from whichever list it's in.
+ */
+ void removeRequest(const sp<ReportRequest>& request);
+
private:
- vector<sp<ReportRequest>> mRequests;
- IncidentReportArgs mSections;
- int mMainFd;
- int mMainDest;
+ map<ComponentName, sp<ReportRequest>> mPersistedRequests;
+ vector<sp<ReportRequest>> mStreamingRequests;
+};
- IncidentMetadata mMetadata;
- map<int, IncidentMetadata::SectionStats> mSectionStats;
+// ================================================================================
+class ReportWriter {
+public:
+ ReportWriter(const sp<ReportBatch>& batch);
+ ~ReportWriter();
+
+ void setPersistedFile(sp<ReportFile> file);
+ void setMaxPersistedPrivacyPolicy(uint8_t privacyPolicy);
+
+ void startSection(int sectionId);
+ void endSection(IncidentMetadata::SectionStats* sectionStats);
+
+ void setSectionStats(const FdBuffer& buffer);
+
+ void warning(const Section* section, status_t err, const char* format, ...);
+ void error(const Section* section, status_t err, const char* format, ...);
+
+ status_t writeSection(const FdBuffer& buffer);
+
+private:
+ // Data about all requests
+ sp<ReportBatch> mBatch;
+
+ /**
+ * The file on disk where we will store the persisted file.
+ */
+ sp<ReportFile> mPersistedFile;
+
+ /**
+ * The least restricted privacy policy of all of the perstited
+ * requests. We pre-filter to that to save disk space.
+ */
+ uint8_t mMaxPersistedPrivacyPolicy;
+
+ /**
+ * The current section that is being written.
+ */
+ int mCurrentSectionId;
+
+ /**
+ * The time that that the current section was started.
+ */
+ int64_t mSectionStartTimeMs;
+
+ /**
+ * The last section that setSectionStats was called for, so if someone misses
+ * it we can log that.
+ */
+ int mSectionStatsCalledForSectionId;
+
+ /*
+ * Fields for IncidentMetadata.SectionStats. Set by setSectionStats. Accessed by
+ * getSectionStats.
+ */
+ int32_t mDumpSizeBytes;
+ int64_t mDumpDurationMs;
+ bool mSectionTimedOut;
+ bool mSectionTruncated;
+ bool mSectionBufferSuccess;
+ bool mHadError;
+ string mSectionErrors;
+ size_t mMaxSectionDataFilteredSize;
+
+ void vflog(const Section* section, status_t err, int level, const char* levelText,
+ const char* format, va_list args);
};
// ================================================================================
class Reporter : public virtual RefBase {
public:
- enum run_report_status_t { REPORT_FINISHED = 0, REPORT_NEEDS_DROPBOX = 1 };
+ Reporter(const sp<WorkDirectory>& workDirectory, const sp<ReportBatch>& batch);
- ReportRequestSet batch;
-
- Reporter(); // PROD must use this constructor.
- explicit Reporter(const char* directory); // For testing purpose only.
virtual ~Reporter();
// Run the report as described in the batch and args parameters.
- run_report_status_t runReport(size_t* reportByteSize);
-
- static run_report_status_t upload_backlog();
+ void runReport(size_t* reportByteSize);
private:
- String8 mIncidentDirectory;
+ sp<WorkDirectory> mWorkDirectory;
+ ReportWriter mWriter;
+ sp<ReportBatch> mBatch;
+ sp<ReportFile> mPersistedFile;
- string mFilename;
- off_t mMaxSize;
- size_t mMaxCount;
- time_t mStartTime;
-
- status_t create_file(int* fd);
-
- bool isTest = true; // default to true for testing
+ void cancel_and_remove_failed_requests();
};
} // namespace incidentd
} // namespace os
} // namespace android
-
-#endif // REPORTER_H
diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp
index 32ec1ba..935a7c4 100644
--- a/cmds/incidentd/src/Section.cpp
+++ b/cmds/incidentd/src/Section.cpp
@@ -25,8 +25,10 @@
#include <set>
#include <android-base/file.h>
+#include <android-base/properties.h>
#include <android-base/stringprintf.h>
#include <android/util/protobuf.h>
+#include <android/util/ProtoOutputStream.h>
#include <binder/IServiceManager.h>
#include <debuggerd/client.h>
#include <dumputils/dump_utils.h>
@@ -37,7 +39,6 @@
#include "FdBuffer.h"
#include "Privacy.h"
-#include "PrivacyBuffer.h"
#include "frameworks/base/core/proto/android/os/backtrace.proto.h"
#include "frameworks/base/core/proto/android/os/data.proto.h"
#include "frameworks/base/core/proto/android/util/log.proto.h"
@@ -51,7 +52,6 @@
using namespace android::util;
// special section ids
-const int FIELD_ID_INCIDENT_HEADER = 1;
const int FIELD_ID_INCIDENT_METADATA = 2;
// incident section parameters
@@ -64,206 +64,18 @@
}
// ================================================================================
-static status_t write_section_header(int fd, int sectionId, size_t size) {
- uint8_t buf[20];
- uint8_t* p = write_length_delimited_tag_header(buf, sectionId, size);
- return WriteFully(fd, buf, p - buf) ? NO_ERROR : -errno;
-}
-
-static void write_section_stats(IncidentMetadata::SectionStats* stats, const FdBuffer& buffer) {
- stats->set_dump_size_bytes(buffer.data().size());
- stats->set_dump_duration_ms(buffer.durationMs());
- stats->set_timed_out(buffer.timedOut());
- stats->set_is_truncated(buffer.truncated());
- stats->set_success(!buffer.timedOut() && !buffer.truncated());
-}
-
-// Reads data from FdBuffer and writes it to the requests file descriptor.
-static status_t write_report_requests(const int id, const FdBuffer& buffer,
- ReportRequestSet* requests) {
- status_t err = -EBADF;
- EncodedBuffer::iterator data = buffer.data();
- PrivacyBuffer privacyBuffer(get_privacy_of_section(id), data);
- IncidentMetadata::SectionStats* stats = requests->sectionStats(id);
- int nPassed = 0;
-
- // The streaming ones, group requests by spec in order to save unnecessary strip operations
- map<PrivacySpec, vector<sp<ReportRequest>>> requestsBySpec;
- for (auto it = requests->begin(); it != requests->end(); it++) {
- sp<ReportRequest> request = *it;
- if (!request->ok() || !request->args.containsSection(id)) {
- continue; // skip invalid request
- }
- PrivacySpec spec = PrivacySpec::new_spec(request->args.dest());
- requestsBySpec[spec].push_back(request);
- }
-
- for (auto mit = requestsBySpec.begin(); mit != requestsBySpec.end(); mit++) {
- PrivacySpec spec = mit->first;
- err = privacyBuffer.strip(spec);
- if (err != NO_ERROR) {
- // Privacy Buffer is corrupted, probably due to an ill-formatted proto. This is a
- // non-fatal error. The whole report is still valid. So just log the failure.
- ALOGW("Failed to strip section %d with spec %d: %s",
- id, spec.dest, strerror(-err));
- stats->set_success(false);
- stats->set_error_msg("Failed to strip section: privacy buffer corrupted, probably "
- "due to an ill-formatted proto");
- nPassed++;
- continue;
- }
-
- if (privacyBuffer.size() == 0) continue;
-
- for (auto it = mit->second.begin(); it != mit->second.end(); it++) {
- sp<ReportRequest> request = *it;
- err = write_section_header(request->fd, id, privacyBuffer.size());
- if (err != NO_ERROR) {
- request->err = err;
- continue;
- }
- err = privacyBuffer.flush(request->fd);
- if (err != NO_ERROR) {
- request->err = err;
- continue;
- }
- nPassed++;
- VLOG("Section %d flushed %zu bytes to fd %d with spec %d", id, privacyBuffer.size(),
- request->fd, spec.dest);
- }
- privacyBuffer.clear();
- }
-
- // The dropbox file
- if (requests->mainFd() >= 0) {
- PrivacySpec spec = PrivacySpec::new_spec(requests->mainDest());
- err = privacyBuffer.strip(spec);
- if (err != NO_ERROR) {
- ALOGW("Failed to strip section %d with spec %d for dropbox: %s",
- id, spec.dest, strerror(-err));
- stats->set_success(false);
- stats->set_error_msg("Failed to strip section: privacy buffer corrupted, probably "
- "due to an ill-formatted proto");
- nPassed++;
- goto DONE;
- }
- if (privacyBuffer.size() == 0) goto DONE;
-
- err = write_section_header(requests->mainFd(), id, privacyBuffer.size());
- if (err != NO_ERROR) {
- requests->setMainFd(-1);
- goto DONE;
- }
- err = privacyBuffer.flush(requests->mainFd());
- if (err != NO_ERROR) {
- requests->setMainFd(-1);
- goto DONE;
- }
- nPassed++;
- VLOG("Section %d flushed %zu bytes to dropbox %d with spec %d", id, privacyBuffer.size(),
- requests->mainFd(), spec.dest);
- // Reports bytes of the section uploaded via dropbox after filtering.
- requests->sectionStats(id)->set_report_size_bytes(privacyBuffer.size());
- }
-
-DONE:
- // only returns error if there is no fd to write to.
- return nPassed > 0 ? NO_ERROR : err;
-}
-
-// ================================================================================
-Section::Section(int i, int64_t timeoutMs, bool userdebugAndEngOnly)
+Section::Section(int i, int64_t timeoutMs)
: id(i),
- timeoutMs(timeoutMs),
- userdebugAndEngOnly(userdebugAndEngOnly) {}
+ timeoutMs(timeoutMs) {
+}
Section::~Section() {}
// ================================================================================
-HeaderSection::HeaderSection() : Section(FIELD_ID_INCIDENT_HEADER, 0) {}
-
-HeaderSection::~HeaderSection() {}
-
-status_t HeaderSection::Execute(ReportRequestSet* requests) const {
- for (ReportRequestSet::iterator it = requests->begin(); it != requests->end(); it++) {
- const sp<ReportRequest> request = *it;
- const vector<vector<uint8_t>>& headers = request->args.headers();
-
- for (vector<vector<uint8_t>>::const_iterator buf = headers.begin(); buf != headers.end();
- buf++) {
- if (buf->empty()) continue;
-
- // So the idea is only requests with negative fd are written to dropbox file.
- int fd = request->fd >= 0 ? request->fd : requests->mainFd();
- write_section_header(fd, id, buf->size());
- WriteFully(fd, (uint8_t const*)buf->data(), buf->size());
- // If there was an error now, there will be an error later and we will remove
- // it from the list then.
- }
- }
- return NO_ERROR;
-}
-// ================================================================================
-MetadataSection::MetadataSection() : Section(FIELD_ID_INCIDENT_METADATA, 0) {}
-
-MetadataSection::~MetadataSection() {}
-
-status_t MetadataSection::Execute(ReportRequestSet* requests) const {
- ProtoOutputStream proto;
- IncidentMetadata metadata = requests->metadata();
- proto.write(FIELD_TYPE_ENUM | IncidentMetadata::kDestFieldNumber, metadata.dest());
- proto.write(FIELD_TYPE_INT32 | IncidentMetadata::kRequestSizeFieldNumber,
- metadata.request_size());
- proto.write(FIELD_TYPE_BOOL | IncidentMetadata::kUseDropboxFieldNumber, metadata.use_dropbox());
- for (auto iter = requests->allSectionStats().begin(); iter != requests->allSectionStats().end();
- iter++) {
- IncidentMetadata::SectionStats stats = iter->second;
- uint64_t token = proto.start(FIELD_TYPE_MESSAGE | IncidentMetadata::kSectionsFieldNumber);
- proto.write(FIELD_TYPE_INT32 | IncidentMetadata::SectionStats::kIdFieldNumber, stats.id());
- proto.write(FIELD_TYPE_BOOL | IncidentMetadata::SectionStats::kSuccessFieldNumber,
- stats.success());
- proto.write(FIELD_TYPE_INT32 | IncidentMetadata::SectionStats::kReportSizeBytesFieldNumber,
- stats.report_size_bytes());
- proto.write(FIELD_TYPE_INT64 | IncidentMetadata::SectionStats::kExecDurationMsFieldNumber,
- stats.exec_duration_ms());
- proto.write(FIELD_TYPE_INT32 | IncidentMetadata::SectionStats::kDumpSizeBytesFieldNumber,
- stats.dump_size_bytes());
- proto.write(FIELD_TYPE_INT64 | IncidentMetadata::SectionStats::kDumpDurationMsFieldNumber,
- stats.dump_duration_ms());
- proto.write(FIELD_TYPE_BOOL | IncidentMetadata::SectionStats::kTimedOutFieldNumber,
- stats.timed_out());
- proto.write(FIELD_TYPE_BOOL | IncidentMetadata::SectionStats::kIsTruncatedFieldNumber,
- stats.is_truncated());
- proto.write(FIELD_TYPE_STRING | IncidentMetadata::SectionStats::kErrorMsgFieldNumber,
- stats.error_msg());
- proto.end(token);
- }
-
- for (ReportRequestSet::iterator it = requests->begin(); it != requests->end(); it++) {
- const sp<ReportRequest> request = *it;
- if (request->fd < 0 || request->err != NO_ERROR) {
- continue;
- }
- write_section_header(request->fd, id, proto.size());
- if (!proto.flush(request->fd)) {
- ALOGW("Failed to write metadata to fd %d", request->fd);
- // we don't fail if we can't write to a single request's fd.
- }
- }
- if (requests->mainFd() >= 0) {
- write_section_header(requests->mainFd(), id, proto.size());
- if (!proto.flush(requests->mainFd())) {
- ALOGW("Failed to write metadata to dropbox fd %d", requests->mainFd());
- return -1;
- }
- }
- return NO_ERROR;
-}
-// ================================================================================
static inline bool isSysfs(const char* filename) { return strncmp(filename, "/sys/", 5) == 0; }
FileSection::FileSection(int id, const char* filename, const int64_t timeoutMs)
- : Section(id, timeoutMs, false), mFilename(filename) {
+ : Section(id, timeoutMs), mFilename(filename) {
name = "file ";
name += filename;
mIsSysfs = isSysfs(filename);
@@ -271,7 +83,7 @@
FileSection::~FileSection() {}
-status_t FileSection::Execute(ReportRequestSet* requests) const {
+status_t FileSection::Execute(ReportWriter* writer) const {
// read from mFilename first, make sure the file is available
// add O_CLOEXEC to make sure it is closed when exec incident helper
unique_fd fd(open(mFilename, O_RDONLY | O_CLOEXEC));
@@ -301,7 +113,7 @@
status_t readStatus = buffer.readProcessedDataInStream(fd.get(), std::move(p2cPipe.writeFd()),
std::move(c2pPipe.readFd()),
this->timeoutMs, mIsSysfs);
- write_section_stats(requests->sectionStats(this->id), buffer);
+ writer->setSectionStats(buffer);
if (readStatus != NO_ERROR || buffer.timedOut()) {
ALOGW("[%s] failed to read data from incident helper: %s, timedout: %s",
this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false");
@@ -315,7 +127,7 @@
return ihStatus;
}
- return write_report_requests(this->id, buffer, requests);
+ return writer->writeSection(buffer);
}
// ================================================================================
GZipSection::GZipSection(int id, const char* filename, ...) : Section(id) {
@@ -332,7 +144,7 @@
GZipSection::~GZipSection() { free(mFilenames); }
-status_t GZipSection::Execute(ReportRequestSet* requests) const {
+status_t GZipSection::Execute(ReportWriter* writer) const {
// Reads the files in order, use the first available one.
int index = 0;
unique_fd fd;
@@ -366,7 +178,7 @@
// construct Fdbuffer to output GZippedfileProto, the reason to do this instead of using
// ProtoOutputStream is to avoid allocation of another buffer inside ProtoOutputStream.
- EncodedBuffer* internalBuffer = buffer.getInternalBuffer();
+ sp<EncodedBuffer> internalBuffer = buffer.data();
internalBuffer->writeHeader((uint32_t)GZippedFileProto::FILENAME, WIRE_TYPE_LENGTH_DELIMITED);
size_t fileLen = strlen(mFilenames[index]);
internalBuffer->writeRawVarint32(fileLen);
@@ -383,7 +195,7 @@
status_t readStatus = buffer.readProcessedDataInStream(
fd.get(), std::move(p2cPipe.writeFd()), std::move(c2pPipe.readFd()), this->timeoutMs,
isSysfs(mFilenames[index]));
- write_section_stats(requests->sectionStats(this->id), buffer);
+ writer->setSectionStats(buffer);
if (readStatus != NO_ERROR || buffer.timedOut()) {
ALOGW("[%s] failed to read data from gzip: %s, timedout: %s", this->name.string(),
strerror(-readStatus), buffer.timedOut() ? "true" : "false");
@@ -402,7 +214,7 @@
internalBuffer->writeRawVarint32(dataSize);
internalBuffer->copy(dataBeginAt, dataSize);
- return write_report_requests(this->id, buffer, requests);
+ return writer->writeSection(buffer);
}
// ================================================================================
@@ -425,8 +237,8 @@
WorkerThreadData::~WorkerThreadData() {}
// ================================================================================
-WorkerThreadSection::WorkerThreadSection(int id, const int64_t timeoutMs, bool userdebugAndEngOnly)
- : Section(id, timeoutMs, userdebugAndEngOnly) {}
+WorkerThreadSection::WorkerThreadSection(int id, const int64_t timeoutMs)
+ : Section(id, timeoutMs) {}
WorkerThreadSection::~WorkerThreadSection() {}
@@ -458,13 +270,12 @@
return NULL;
}
-status_t WorkerThreadSection::Execute(ReportRequestSet* requests) const {
+status_t WorkerThreadSection::Execute(ReportWriter* writer) const {
status_t err = NO_ERROR;
pthread_t thread;
pthread_attr_t attr;
bool workerDone = false;
FdBuffer buffer;
- IncidentMetadata::SectionStats* stats = requests->sectionStats(this->id);
// Data shared between this thread and the worker thread.
sp<WorkerThreadData> data = new WorkerThreadData(this);
@@ -474,10 +285,6 @@
return -errno;
}
- // The worker thread needs a reference and we can't let the count go to zero
- // if that thread is slow to start.
- data->incStrong(this);
-
// Create the thread
err = pthread_attr_init(&attr);
if (err != 0) {
@@ -489,12 +296,17 @@
pthread_attr_destroy(&attr);
return -err;
}
+
+ // The worker thread needs a reference and we can't let the count go to zero
+ // if that thread is slow to start.
+ data->incStrong(this);
+
err = pthread_create(&thread, &attr, worker_thread_func, (void*)data.get());
+ pthread_attr_destroy(&attr);
if (err != 0) {
- pthread_attr_destroy(&attr);
+ data->decStrong(this);
return -err;
}
- pthread_attr_destroy(&attr);
// Loop reading until either the timeout or the worker side is done (i.e. eof).
err = buffer.read(data->pipe.readFd().get(), this->timeoutMs);
@@ -517,18 +329,17 @@
workerDone = data->workerDone;
}
- write_section_stats(stats, buffer);
+ writer->setSectionStats(buffer);
if (err != NO_ERROR) {
char errMsg[128];
snprintf(errMsg, 128, "[%s] failed with error '%s'",
this->name.string(), strerror(-err));
- stats->set_success(false);
- stats->set_error_msg(errMsg);
+ writer->error(this, err, "WorkerThreadSection failed.");
return NO_ERROR;
}
if (buffer.truncated()) {
ALOGW("[%s] too large, truncating", this->name.string());
- // Do not write a truncated section. It won't pass through the PrivacyBuffer.
+ // Do not write a truncated section. It won't pass through the PrivacyFilter.
return NO_ERROR;
}
if (!workerDone || buffer.timedOut()) {
@@ -537,7 +348,7 @@
}
// Write the data that was collected
- return write_report_requests(this->id, buffer, requests);
+ return writer->writeSection(buffer);
}
// ================================================================================
@@ -568,7 +379,7 @@
CommandSection::~CommandSection() { free(mCommand); }
-status_t CommandSection::Execute(ReportRequestSet* requests) const {
+status_t CommandSection::Execute(ReportWriter* writer) const {
FdBuffer buffer;
Fpipe cmdPipe;
Fpipe ihPipe;
@@ -591,7 +402,7 @@
cmdPipe.writeFd().reset();
status_t readStatus = buffer.read(ihPipe.readFd().get(), this->timeoutMs);
- write_section_stats(requests->sectionStats(this->id), buffer);
+ writer->setSectionStats(buffer);
if (readStatus != NO_ERROR || buffer.timedOut()) {
ALOGW("[%s] failed to read data from incident helper: %s, timedout: %s",
this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false");
@@ -605,18 +416,18 @@
status_t cmdStatus = wait_child(cmdPid);
status_t ihStatus = wait_child(ihPid);
if (cmdStatus != NO_ERROR || ihStatus != NO_ERROR) {
- ALOGW("[%s] abnormal child processes, return status: command: %s, incident "
- "helper: %s",
+ ALOGW("[%s] abnormal child processes, return status: command: %s, incident helper: %s",
this->name.string(), strerror(-cmdStatus), strerror(-ihStatus));
- return cmdStatus != NO_ERROR ? cmdStatus : ihStatus;
+ // Not a fatal error.
+ return NO_ERROR;
}
- return write_report_requests(this->id, buffer, requests);
+ return writer->writeSection(buffer);
}
// ================================================================================
-DumpsysSection::DumpsysSection(int id, bool userdebugAndEngOnly, const char* service, ...)
- : WorkerThreadSection(id, REMOTE_CALL_TIMEOUT_MS, userdebugAndEngOnly), mService(service) {
+DumpsysSection::DumpsysSection(int id, const char* service, ...)
+ : WorkerThreadSection(id, REMOTE_CALL_TIMEOUT_MS), mService(service) {
name = "dumpsys ";
name += service;
@@ -842,7 +653,8 @@
const std::string link_name = android::base::StringPrintf("/proc/%d/exe", pid);
std::string exe;
if (!android::base::Readlink(link_name, &exe)) {
- ALOGE("Can't read '%s': %s\n", link_name.c_str(), strerror(errno));
+ ALOGE("Section %s: Can't read '%s': %s\n", name.string(),
+ link_name.c_str(), strerror(errno));
continue;
}
@@ -913,10 +725,10 @@
}
auto dump = std::make_unique<char[]>(buffer.size());
- auto iterator = buffer.data();
+ sp<ProtoReader> reader = buffer.data()->read();
int i = 0;
- while (iterator.hasNext()) {
- dump[i] = iterator.next();
+ while (reader->hasNext()) {
+ dump[i] = reader->next();
i++;
}
uint64_t token = proto.start(android::os::BackTraceProto::TRACES);
diff --git a/cmds/incidentd/src/Section.h b/cmds/incidentd/src/Section.h
index 86d956f..cfe7e16 100644
--- a/cmds/incidentd/src/Section.h
+++ b/cmds/incidentd/src/Section.h
@@ -40,35 +40,12 @@
public:
const int id;
const int64_t timeoutMs; // each section must have a timeout
- const bool userdebugAndEngOnly;
String8 name;
- Section(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS, bool userdebugAndEngOnly = false);
+ Section(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS);
virtual ~Section();
- virtual status_t Execute(ReportRequestSet* requests) const = 0;
-};
-
-/**
- * Section that generates incident headers.
- */
-class HeaderSection : public Section {
-public:
- HeaderSection();
- virtual ~HeaderSection();
-
- virtual status_t Execute(ReportRequestSet* requests) const;
-};
-
-/**
- * Section that generates incident metadata.
- */
-class MetadataSection : public Section {
-public:
- MetadataSection();
- virtual ~MetadataSection();
-
- virtual status_t Execute(ReportRequestSet* requests) const;
+ virtual status_t Execute(ReportWriter* writer) const = 0;
};
/**
@@ -80,7 +57,7 @@
int64_t timeoutMs = 5000 /* 5 seconds */);
virtual ~FileSection();
- virtual status_t Execute(ReportRequestSet* requests) const;
+ virtual status_t Execute(ReportWriter* writer) const;
private:
const char* mFilename;
@@ -95,7 +72,7 @@
GZipSection(int id, const char* filename, ...);
virtual ~GZipSection();
- virtual status_t Execute(ReportRequestSet* requests) const;
+ virtual status_t Execute(ReportWriter* writer) const;
private:
// It looks up the content from multiple files and stops when the first one is available.
@@ -107,11 +84,10 @@
*/
class WorkerThreadSection : public Section {
public:
- WorkerThreadSection(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS,
- bool userdebugAndEngOnly = false);
+ WorkerThreadSection(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS);
virtual ~WorkerThreadSection();
- virtual status_t Execute(ReportRequestSet* requests) const;
+ virtual status_t Execute(ReportWriter* writer) const;
virtual status_t BlockingCall(int pipeWriteFd) const = 0;
};
@@ -127,7 +103,7 @@
virtual ~CommandSection();
- virtual status_t Execute(ReportRequestSet* requests) const;
+ virtual status_t Execute(ReportWriter* writer) const;
private:
const char** mCommand;
@@ -138,7 +114,7 @@
*/
class DumpsysSection : public WorkerThreadSection {
public:
- DumpsysSection(int id, bool userdebugAndEngOnly, const char* service, ...);
+ DumpsysSection(int id, const char* service, ...);
virtual ~DumpsysSection();
virtual status_t BlockingCall(int pipeWriteFd) const;
@@ -149,6 +125,21 @@
};
/**
+ * Section that calls dumpsys on a system service.
+ */
+class SystemPropertyDumpsysSection : public WorkerThreadSection {
+public:
+ SystemPropertyDumpsysSection(int id, const char* service, ...);
+ virtual ~SystemPropertyDumpsysSection();
+
+ virtual status_t BlockingCall(int pipeWriteFd) const;
+
+private:
+ String16 mService;
+ Vector<String16> mArgs;
+};
+
+/**
* Section that reads from logd.
*/
class LogSection : public WorkerThreadSection {
diff --git a/cmds/incidentd/src/WorkDirectory.cpp b/cmds/incidentd/src/WorkDirectory.cpp
new file mode 100644
index 0000000..aa376dd
--- /dev/null
+++ b/cmds/incidentd/src/WorkDirectory.cpp
@@ -0,0 +1,844 @@
+/*
+ * 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.
+ */
+
+#include "Log.h"
+
+#include "WorkDirectory.h"
+
+#include "PrivacyFilter.h"
+
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <private/android_filesystem_config.h>
+
+#include <iomanip>
+#include <map>
+#include <sstream>
+#include <thread>
+#include <vector>
+
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+#include <inttypes.h>
+
+namespace android {
+namespace os {
+namespace incidentd {
+
+using std::thread;
+using google::protobuf::MessageLite;
+using google::protobuf::RepeatedPtrField;
+using google::protobuf::io::FileInputStream;
+using google::protobuf::io::FileOutputStream;
+
+/**
+ * Turn off to skip removing files for debugging.
+ */
+static const bool DO_UNLINK = true;
+
+/**
+ * File extension for envelope files.
+ */
+static const string EXTENSION_ENVELOPE(".envelope");
+
+/**
+ * File extension for data files.
+ */
+static const string EXTENSION_DATA(".data");
+
+/**
+ * Send these reports to dropbox.
+ */
+const ComponentName DROPBOX_SENTINEL("android", "DROPBOX");
+
+/**
+ * Read a protobuf from disk into the message.
+ */
+static status_t read_proto(MessageLite* msg, const string& filename) {
+ int fd = open(filename.c_str(), O_RDONLY | O_CLOEXEC);
+ if (fd < 0) {
+ return -errno;
+ }
+
+ FileInputStream stream(fd);
+ stream.SetCloseOnDelete(fd);
+
+ if (!msg->ParseFromZeroCopyStream(&stream)) {
+ return BAD_VALUE;
+ }
+
+ return stream.GetErrno();
+}
+
+/**
+ * Write a protobuf to disk.
+ */
+static status_t write_proto(const MessageLite& msg, const string& filename) {
+ int fd = open(filename.c_str(), O_CREAT | O_TRUNC | O_RDWR | O_CLOEXEC, 0660);
+ if (fd < 0) {
+ return -errno;
+ }
+
+ FileOutputStream stream(fd);
+ stream.SetCloseOnDelete(fd);
+
+ if (!msg.SerializeToZeroCopyStream(&stream)) {
+ ALOGW("write_proto: error writing to %s", filename.c_str());
+ return BAD_VALUE;
+ }
+
+ return stream.GetErrno();
+}
+
+static string strip_extension(const string& filename) {
+ return filename.substr(0, filename.find('.'));
+}
+
+static bool ends_with(const string& str, const string& ending) {
+ if (str.length() >= ending.length()) {
+ return str.compare(str.length()-ending.length(), ending.length(), ending) == 0;
+ } else {
+ return false;
+ }
+}
+
+// Returns true if it was a valid timestamp.
+static bool parse_timestamp_ns(const string& id, int64_t* result) {
+ char* endptr;
+ *result = strtoll(id.c_str(), &endptr, 10);
+ return id.length() != 0 && *endptr == '\0';
+}
+
+static bool has_section(const ReportFileProto_Report& report, int section) {
+ const size_t sectionCount = report.section_size();
+ for (int i = 0; i < sectionCount; i++) {
+ if (report.section(i) == section) {
+ return true;
+ }
+ }
+ return false;
+}
+
+status_t create_directory(const char* directory) {
+ struct stat st;
+ status_t err = NO_ERROR;
+ char* dir = strdup(directory);
+
+ // Skip first slash
+ char* d = dir + 1;
+
+ // Create directories, assigning them to the system user
+ bool last = false;
+ while (!last) {
+ d = strchr(d, '/');
+ if (d != NULL) {
+ *d = '\0';
+ } else {
+ last = true;
+ }
+ if (stat(dir, &st) == 0) {
+ if (!S_ISDIR(st.st_mode)) {
+ err = ALREADY_EXISTS;
+ goto done;
+ }
+ } else {
+ ALOGE("No such directory %s, something wrong.", dir);
+ err = -1;
+ goto done;
+ }
+ if (!last) {
+ *d++ = '/';
+ }
+ }
+
+ // Ensure that the final directory is owned by the system with 0770. If it isn't
+ // we won't write into it.
+ if (stat(directory, &st) != 0) {
+ ALOGE("No incident reports today. Can't stat: %s", directory);
+ err = -errno;
+ goto done;
+ }
+ if ((st.st_mode & 0777) != 0770) {
+ ALOGE("No incident reports today. Mode is %0o on report directory %s", st.st_mode,
+ directory);
+ err = BAD_VALUE;
+ goto done;
+ }
+ if (st.st_uid != AID_INCIDENTD || st.st_gid != AID_INCIDENTD) {
+ ALOGE("No incident reports today. Owner is %d and group is %d on report directory %s",
+ st.st_uid, st.st_gid, directory);
+ err = BAD_VALUE;
+ goto done;
+ }
+
+done:
+ free(dir);
+ return err;
+}
+
+void log_envelope(const ReportFileProto& envelope) {
+ ALOGD("Envelope: {");
+ for (int i=0; i<envelope.report_size(); i++) {
+ ALOGD(" report {");
+ ALOGD(" pkg=%s", envelope.report(i).pkg().c_str());
+ ALOGD(" cls=%s", envelope.report(i).cls().c_str());
+ ALOGD(" share_approved=%d", envelope.report(i).share_approved());
+ ALOGD(" privacy_policy=%d", envelope.report(i).privacy_policy());
+ ALOGD(" all_sections=%d", envelope.report(i).all_sections());
+ for (int j=0; j<envelope.report(i).section_size(); j++) {
+ ALOGD(" section[%d]=%d", j, envelope.report(i).section(j));
+ }
+ ALOGD(" }");
+ }
+ ALOGD(" data_file=%s", envelope.data_file().c_str());
+ ALOGD(" privacy_policy=%d", envelope.privacy_policy());
+ ALOGD(" data_file_size=%lld", envelope.data_file_size());
+ ALOGD(" completed=%d", envelope.completed());
+ ALOGD("}");
+}
+
+// ================================================================================
+struct WorkDirectoryEntry {
+ WorkDirectoryEntry();
+ explicit WorkDirectoryEntry(const WorkDirectoryEntry& that);
+ ~WorkDirectoryEntry();
+
+ string envelope;
+ string data;
+ int64_t timestampNs;
+ off_t size;
+};
+
+WorkDirectoryEntry::WorkDirectoryEntry()
+ :envelope(),
+ data(),
+ size(0) {
+}
+
+WorkDirectoryEntry::WorkDirectoryEntry(const WorkDirectoryEntry& that)
+ :envelope(that.envelope),
+ data(that.data),
+ size(that.size) {
+}
+
+WorkDirectoryEntry::~WorkDirectoryEntry() {
+}
+
+// ================================================================================
+ReportFile::ReportFile(const sp<WorkDirectory>& workDirectory, int64_t timestampNs,
+ const string& envelopeFileName, const string& dataFileName)
+ :mWorkDirectory(workDirectory),
+ mTimestampNs(timestampNs),
+ mEnvelopeFileName(envelopeFileName),
+ mDataFileName(dataFileName),
+ mEnvelope(),
+ mDataFd(-1),
+ mError(NO_ERROR) {
+ // might get overwritten when we read but that's ok
+ mEnvelope.set_data_file(mDataFileName);
+}
+
+ReportFile::~ReportFile() {
+ if (mDataFd >= 0) {
+ close(mDataFd);
+ }
+}
+
+int64_t ReportFile::getTimestampNs() const {
+ return mTimestampNs;
+}
+
+void ReportFile::addReport(const IncidentReportArgs& args) {
+ // There is only one report per component. Merge into an existing one if necessary.
+ ReportFileProto_Report* report;
+ const int reportCount = mEnvelope.report_size();
+ int i = 0;
+ for (; i < reportCount; i++) {
+ report = mEnvelope.mutable_report(i);
+ if (report->pkg() == args.receiverPkg() && report->cls() == args.receiverCls()) {
+ if (args.getPrivacyPolicy() < report->privacy_policy()) {
+ // Lower privacy policy (less restrictive) wins.
+ report->set_privacy_policy(args.getPrivacyPolicy());
+ }
+ report->set_all_sections(report->all_sections() | args.all());
+ for (int section: args.sections()) {
+ if (!has_section(*report, section)) {
+ report->add_section(section);
+ }
+ }
+ break;
+ }
+ }
+ if (i >= reportCount) {
+ report = mEnvelope.add_report();
+ report->set_pkg(args.receiverPkg());
+ report->set_cls(args.receiverCls());
+ report->set_privacy_policy(args.getPrivacyPolicy());
+ report->set_all_sections(args.all());
+ for (int section: args.sections()) {
+ report->add_section(section);
+ }
+ }
+
+ for (const vector<uint8_t>& header: args.headers()) {
+ report->add_header(header.data(), header.size());
+ }
+}
+
+void ReportFile::removeReport(const string& pkg, const string& cls) {
+ RepeatedPtrField<ReportFileProto_Report>* reports = mEnvelope.mutable_report();
+ const int reportCount = reports->size();
+ for (int i = 0; i < reportCount; i++) {
+ const ReportFileProto_Report& r = reports->Get(i);
+ if (r.pkg() == pkg && r.cls() == cls) {
+ reports->DeleteSubrange(i, 1);
+ return;
+ }
+ }
+}
+
+void ReportFile::removeReports(const string& pkg) {
+ RepeatedPtrField<ReportFileProto_Report>* reports = mEnvelope.mutable_report();
+ const int reportCount = reports->size();
+ for (int i = reportCount-1; i >= 0; i--) {
+ const ReportFileProto_Report& r = reports->Get(i);
+ if (r.pkg() == pkg) {
+ reports->DeleteSubrange(i, 1);
+ }
+ }
+}
+
+void ReportFile::setMetadata(const IncidentMetadata& metadata) {
+ *mEnvelope.mutable_metadata() = metadata;
+}
+
+void ReportFile::markCompleted() {
+ mEnvelope.set_completed(true);
+}
+
+status_t ReportFile::markApproved(const string& pkg, const string& cls) {
+ size_t const reportCount = mEnvelope.report_size();
+ for (int reportIndex = 0; reportIndex < reportCount; reportIndex++) {
+ ReportFileProto_Report* report = mEnvelope.mutable_report(reportIndex);
+ if (report->pkg() == pkg && report->cls() == cls) {
+ report->set_share_approved(true);
+ return NO_ERROR;
+ }
+ }
+ return NAME_NOT_FOUND;
+}
+
+void ReportFile::setMaxPersistedPrivacyPolicy(int persistedPrivacyPolicy) {
+ mEnvelope.set_privacy_policy(persistedPrivacyPolicy);
+}
+
+status_t ReportFile::saveEnvelope() {
+ return save_envelope_impl(true);
+}
+
+status_t ReportFile::trySaveEnvelope() {
+ return save_envelope_impl(false);
+}
+
+status_t ReportFile::loadEnvelope() {
+ return load_envelope_impl(true);
+}
+
+status_t ReportFile::tryLoadEnvelope() {
+ return load_envelope_impl(false);
+}
+
+const ReportFileProto& ReportFile::getEnvelope() {
+ return mEnvelope;
+}
+
+status_t ReportFile::startWritingDataFile() {
+ if (mDataFd >= 0) {
+ ALOGW("ReportFile::startWritingDataFile called with the file already open: %s",
+ mDataFileName.c_str());
+ return ALREADY_EXISTS;
+ }
+ mDataFd = open(mDataFileName.c_str(), O_CREAT | O_TRUNC | O_RDWR | O_CLOEXEC, 0660);
+ if (mDataFd < 0) {
+ return -errno;
+ }
+ return NO_ERROR;
+}
+
+void ReportFile::closeDataFile() {
+ if (mDataFd >= 0) {
+ mEnvelope.set_data_file_size(lseek(mDataFd, 0, SEEK_END));
+ close(mDataFd);
+ mDataFd = -1;
+ }
+}
+
+status_t ReportFile::startFilteringData(int* fd, const IncidentReportArgs& args) {
+ // Open data file.
+ int dataFd = open(mDataFileName.c_str(), O_RDONLY | O_CLOEXEC);
+ if (dataFd < 0) {
+ return -errno;
+ }
+
+ // Check that the size on disk is what we thought we wrote.
+ struct stat st;
+ if (fstat(dataFd, &st) != 0) {
+ return -errno;
+ }
+ if (st.st_size != mEnvelope.data_file_size()) {
+ ALOGW("File size mismatch. Envelope says %" PRIi64 " bytes but data file is %" PRIi64
+ " bytes: %s", (int64_t)mEnvelope.data_file_size(), st.st_size,
+ mDataFileName.c_str());
+ ALOGW("Removing incident report");
+ mWorkDirectory->remove(this);
+ return BAD_VALUE;
+ }
+
+ // Create pipe
+ int fds[2];
+ if (pipe(fds) != 0) {
+ ALOGW("Error opening pipe to filter incident report: %s", getDataFileName().c_str());
+ return -errno;
+ }
+
+ *fd = fds[0];
+ int writeFd = fds[1];
+
+ // Spawn off a thread to do the filtering and writing
+ thread th([this, dataFd, writeFd, args]() {
+ ALOGD("worker thread started dataFd=%d writeFd=%d", dataFd, writeFd);
+ status_t err;
+
+ err = filter_and_write_report(writeFd, dataFd, mEnvelope.privacy_policy(), args);
+ close(writeFd);
+
+ if (err != NO_ERROR) {
+ ALOGW("Error writing incident report '%s' to dropbox: %s", getDataFileName().c_str(),
+ strerror(-err));
+ // If there's an error here, there will also be an error returned from
+ // addFile, so we'll use that error to reschedule the send_to_dropbox.
+ // If the file is corrupted, we will put some logs in logcat, but won't
+ // actually return an error.
+ return;
+ }
+ });
+
+ // Better would be to join this thread after write is back, but there is no
+ // timeout parameter for that, which means we can't clean up if system server
+ // is stuck. Better is to leak the thread, which will eventually clean itself
+ // up after system server eventually dies, which it probably will.
+ th.detach();
+
+ // If the thread fails to start, we should return an error, but the thread
+ // class doesn't give us a good way to determine that. Just pretend everything
+ // is ok.
+ return NO_ERROR;
+}
+
+string ReportFile::getDataFileName() const {
+ return mDataFileName;
+}
+
+string ReportFile::getEnvelopeFileName() const {
+ return mEnvelopeFileName;
+}
+
+int ReportFile::getDataFileFd() {
+ return mDataFd;
+}
+
+void ReportFile::setWriteError(status_t err) {
+ mError = err;
+}
+
+status_t ReportFile::getWriteError() {
+ return mError;
+}
+
+string ReportFile::getId() {
+ return to_string(mTimestampNs);
+}
+
+status_t ReportFile::save_envelope_impl(bool cleanup) {
+ status_t err;
+ err = write_proto(mEnvelope, mEnvelopeFileName);
+ if (err != NO_ERROR) {
+ // If there was an error writing the envelope, then delete the whole thing.
+ if (cleanup) {
+ mWorkDirectory->remove(this);
+ }
+ return err;
+ }
+ return NO_ERROR;
+}
+
+status_t ReportFile::load_envelope_impl(bool cleanup) {
+ status_t err;
+ err = read_proto(&mEnvelope, mEnvelopeFileName);
+ if (err != NO_ERROR) {
+ // If there was an error reading the envelope, then delete the whole thing.
+ if (cleanup) {
+ mWorkDirectory->remove(this);
+ }
+ return err;
+ }
+ return NO_ERROR;
+}
+
+
+
+// ================================================================================
+//
+
+WorkDirectory::WorkDirectory()
+ :mDirectory("/data/misc/incidents"),
+ mMaxFileCount(100),
+ mMaxDiskUsageBytes(30 * 1024 * 1024) { // Incident reports can take up to 30MB on disk.
+ // TODO: Should be a flag.
+ create_directory(mDirectory.c_str());
+}
+
+WorkDirectory::WorkDirectory(const string& dir, int maxFileCount, long maxDiskUsageBytes)
+ :mDirectory(dir),
+ mMaxFileCount(maxFileCount),
+ mMaxDiskUsageBytes(maxDiskUsageBytes) {
+ create_directory(mDirectory.c_str());
+}
+
+sp<ReportFile> WorkDirectory::createReportFile() {
+ unique_lock<mutex> lock(mLock);
+ status_t err;
+
+ clean_directory_locked();
+
+ int64_t timestampNs = make_timestamp_ns_locked();
+ string envelopeFileName = make_filename(timestampNs, EXTENSION_ENVELOPE);
+ string dataFileName = make_filename(timestampNs, EXTENSION_DATA);
+
+ sp<ReportFile> result = new ReportFile(this, timestampNs, envelopeFileName, dataFileName);
+
+ err = result->trySaveEnvelope();
+ if (err != NO_ERROR) {
+ ALOGW("Can't save envelope file %s: %s", strerror(-errno), envelopeFileName.c_str());
+ return nullptr;
+ }
+
+ return result;
+}
+
+status_t WorkDirectory::getReports(vector<sp<ReportFile>>* result, int64_t after) {
+ unique_lock<mutex> lock(mLock);
+
+ const bool DBG = true;
+
+ if (DBG) {
+ ALOGD("WorkDirectory::getReports");
+ }
+
+ map<string,WorkDirectoryEntry> files;
+ get_directory_contents_locked(&files, after);
+ for (map<string,WorkDirectoryEntry>::iterator it = files.begin();
+ it != files.end(); it++) {
+ sp<ReportFile> reportFile = new ReportFile(this, it->second.timestampNs,
+ it->second.envelope, it->second.data);
+ if (DBG) {
+ ALOGD(" %s", reportFile->getId().c_str());
+ }
+ result->push_back(reportFile);
+ }
+ return NO_ERROR;
+}
+
+sp<ReportFile> WorkDirectory::getReport(const string& pkg, const string& cls, const string& id,
+ IncidentReportArgs* args) {
+ unique_lock<mutex> lock(mLock);
+
+ status_t err;
+ int64_t timestampNs;
+ if (!parse_timestamp_ns(id, ×tampNs)) {
+ return nullptr;
+ }
+
+ // Make the ReportFile object, and then see if it's valid and for pkg and cls.
+ sp<ReportFile> result = new ReportFile(this, timestampNs,
+ make_filename(timestampNs, EXTENSION_ENVELOPE),
+ make_filename(timestampNs, EXTENSION_DATA));
+
+ err = result->tryLoadEnvelope();
+ if (err != NO_ERROR) {
+ ALOGW("Can't open envelope file for report %s/%s %s", pkg.c_str(), cls.c_str(), id.c_str());
+ return nullptr;
+ }
+
+ const ReportFileProto& envelope = result->getEnvelope();
+ const size_t reportCount = envelope.report_size();
+ for (int i = 0; i < reportCount; i++) {
+ const ReportFileProto_Report& report = envelope.report(i);
+ if (report.pkg() == pkg && report.cls() == cls) {
+ if (args != nullptr) {
+ get_args_from_report(args, report);
+ }
+ return result;
+ }
+
+ }
+
+ return nullptr;
+}
+
+bool WorkDirectory::hasMore(int64_t after) {
+ unique_lock<mutex> lock(mLock);
+
+ map<string,WorkDirectoryEntry> files;
+ get_directory_contents_locked(&files, after);
+ return files.size() > 0;
+}
+
+void WorkDirectory::commit(const sp<ReportFile>& report, const string& pkg, const string& cls) {
+ status_t err;
+ ALOGI("Committing report %s for %s/%s", report->getId().c_str(), pkg.c_str(), cls.c_str());
+
+ unique_lock<mutex> lock(mLock);
+
+ // Load the envelope here inside the lock.
+ err = report->loadEnvelope();
+
+ report->removeReport(pkg, cls);
+
+ delete_files_for_report_if_necessary(report);
+}
+
+void WorkDirectory::commitAll(const string& pkg) {
+ status_t err;
+ ALOGI("All reports for %s", pkg.c_str());
+
+ unique_lock<mutex> lock(mLock);
+
+ map<string,WorkDirectoryEntry> files;
+ get_directory_contents_locked(&files, 0);
+
+ for (map<string,WorkDirectoryEntry>::iterator it = files.begin();
+ it != files.end(); it++) {
+ sp<ReportFile> reportFile = new ReportFile(this, it->second.timestampNs,
+ it->second.envelope, it->second.data);
+
+ err = reportFile->loadEnvelope();
+ if (err != NO_ERROR) {
+ continue;
+ }
+
+ reportFile->removeReports(pkg);
+
+ delete_files_for_report_if_necessary(reportFile);
+ }
+}
+
+void WorkDirectory::remove(const sp<ReportFile>& report) {
+ unique_lock<mutex> lock(mLock);
+ // Set this to false to leave files around for debugging.
+ if (DO_UNLINK) {
+ unlink(report->getDataFileName().c_str());
+ unlink(report->getEnvelopeFileName().c_str());
+ }
+}
+
+int64_t WorkDirectory::make_timestamp_ns_locked() {
+ // Guarantee that we don't have duplicate timestamps.
+ // This is a little bit lame, but since reports are created on the
+ // same thread and are kinda slow we'll seldomly actually hit the
+ // condition. The bigger risk is the clock getting reset and causing
+ // a collision. In that case, we'll just make incident reporting a
+ // little bit slower. Nobody will notice if we just loop until we
+ // have a unique file name.
+ int64_t timestampNs = 0;
+ do {
+ struct timespec spec;
+ if (timestampNs > 0) {
+ spec.tv_sec = 0;
+ spec.tv_nsec = 1;
+ nanosleep(&spec, nullptr);
+ }
+ clock_gettime(CLOCK_REALTIME, &spec);
+ timestampNs = (spec.tv_sec) * 1000 + spec.tv_nsec;
+ } while (file_exists_locked(timestampNs));
+ return timestampNs;
+}
+
+/**
+ * It is required to hold the lock here so in case someone else adds it
+ * our result is still correct for the caller.
+ */
+bool WorkDirectory::file_exists_locked(int64_t timestampNs) {
+ const string filename = make_filename(timestampNs, EXTENSION_ENVELOPE);
+ struct stat st;
+ return stat(filename.c_str(), &st) == 0;
+}
+
+string WorkDirectory::make_filename(int64_t timestampNs, const string& extension) {
+ // Zero pad the timestamp so it can also be alpha sorted.
+ stringstream result;
+ result << mDirectory << '/' << setfill('0') << setw(20) << timestampNs << extension;
+ return result.str();
+}
+
+off_t WorkDirectory::get_directory_contents_locked(map<string,WorkDirectoryEntry>* files,
+ int64_t after) {
+ DIR* dir;
+ struct dirent* entry;
+
+ if ((dir = opendir(mDirectory.c_str())) == NULL) {
+ ALOGE("Couldn't open incident directory: %s", mDirectory.c_str());
+ return -1;
+ }
+
+ string dirbase(mDirectory);
+ if (mDirectory[dirbase.size() - 1] != '/') dirbase += "/";
+
+ off_t totalSize = 0;
+
+ // Enumerate, count and add up size
+ while ((entry = readdir(dir)) != NULL) {
+ if (entry->d_name[0] == '.') {
+ continue;
+ }
+ string entryname = entry->d_name; // local to this dir
+ string filename = dirbase + entryname; // fully qualified
+
+ bool isEnvelope = ends_with(entryname, EXTENSION_ENVELOPE);
+ bool isData = ends_with(entryname, EXTENSION_DATA);
+
+ // If the file isn't one of our files, just ignore it. Otherwise,
+ // sum up the sizes.
+ if (isEnvelope || isData) {
+ string timestamp = strip_extension(entryname);
+
+ int64_t timestampNs;
+ if (!parse_timestamp_ns(timestamp, ×tampNs)) {
+ continue;
+ }
+
+ if (after == 0 || timestampNs > after) {
+ struct stat st;
+ if (stat(filename.c_str(), &st) != 0) {
+ ALOGE("Unable to stat file %s", filename.c_str());
+ continue;
+ }
+ if (!S_ISREG(st.st_mode)) {
+ continue;
+ }
+
+ WorkDirectoryEntry& entry = (*files)[timestamp];
+ if (isEnvelope) {
+ entry.envelope = filename;
+ } else if (isData) {
+ entry.data = filename;
+ }
+ entry.timestampNs = timestampNs;
+ entry.size += st.st_size;
+ totalSize += st.st_size;
+ }
+ }
+ }
+
+ closedir(dir);
+
+ // Now check if there are any data files that don't have envelope files.
+ // If there are, then just go ahead and delete them now. Don't wait for
+ // a cleaning.
+
+ if (DO_UNLINK) {
+ map<string,WorkDirectoryEntry>::iterator it = files->begin();
+ while (it != files->end()) {
+ if (it->second.envelope.length() == 0) {
+ unlink(it->second.data.c_str());
+ it = files->erase(it);
+ } else {
+ it++;
+ }
+ }
+ }
+
+ return totalSize;
+}
+
+void WorkDirectory::clean_directory_locked() {
+ DIR* dir;
+ struct dirent* entry;
+ struct stat st;
+
+ // Map of filename without extension to the entries about it. Conveniently,
+ // this also keeps the list sorted by filename, which is a timestamp.
+ map<string,WorkDirectoryEntry> files;
+ off_t totalSize = get_directory_contents_locked(&files, 0);
+ if (totalSize < 0) {
+ return;
+ }
+ int totalCount = files.size();
+
+ // Count or size is less than max, then we're done.
+ if (totalSize < mMaxDiskUsageBytes && totalCount < mMaxFileCount) {
+ return;
+ }
+
+ // Remove files until we're under our limits.
+ if (DO_UNLINK) {
+ for (map<string, WorkDirectoryEntry>::const_iterator it = files.begin();
+ it != files.end() && (totalSize >= mMaxDiskUsageBytes
+ || totalCount >= mMaxFileCount);
+ it++) {
+ unlink(it->second.envelope.c_str());
+ unlink(it->second.data.c_str());
+ totalSize -= it->second.size;
+ totalCount--;
+ }
+ }
+}
+
+void WorkDirectory::delete_files_for_report_if_necessary(const sp<ReportFile>& report) {
+ if (report->getEnvelope().report_size() == 0) {
+ ALOGI("Report %s is finished. Deleting from storage.", report->getId().c_str());
+ if (DO_UNLINK) {
+ unlink(report->getDataFileName().c_str());
+ unlink(report->getEnvelopeFileName().c_str());
+ }
+ }
+}
+
+// ================================================================================
+void get_args_from_report(IncidentReportArgs* out, const ReportFileProto_Report& report) {
+ out->setPrivacyPolicy(report.privacy_policy());
+ out->setAll(report.all_sections());
+ out->setReceiverPkg(report.pkg());
+ out->setReceiverCls(report.cls());
+
+ const int sectionCount = report.section_size();
+ for (int i = 0; i < sectionCount; i++) {
+ out->addSection(report.section(i));
+ }
+
+ const int headerCount = report.header_size();
+ for (int i = 0; i < headerCount; i++) {
+ const string& header = report.header(i);
+ vector<uint8_t> vec(header.begin(), header.end());
+ out->addHeader(vec);
+ }
+}
+
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
diff --git a/cmds/incidentd/src/WorkDirectory.h b/cmds/incidentd/src/WorkDirectory.h
new file mode 100644
index 0000000..e344371
--- /dev/null
+++ b/cmds/incidentd/src/WorkDirectory.h
@@ -0,0 +1,276 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <android/content/ComponentName.h>
+#include <android/os/IncidentReportArgs.h>
+#include <frameworks/base/core/proto/android/os/metadata.pb.h>
+#include <frameworks/base/cmds/incidentd/src/report_file.pb.h>
+
+#include <utils/RefBase.h>
+
+#include <mutex>
+#include <string>
+
+namespace android {
+namespace os {
+namespace incidentd {
+
+using android::content::ComponentName;
+using android::os::IncidentReportArgs;
+using namespace std;
+
+extern const ComponentName DROPBOX_SENTINEL;
+
+class WorkDirectory;
+struct WorkDirectoryEntry;
+
+void get_args_from_report(IncidentReportArgs* out, const ReportFileProto_Report& report);
+
+/**
+ * A ReportFile object is backed by two files.
+ * - A metadata file, which contains a
+ */
+class ReportFile : public virtual RefBase {
+public:
+ ReportFile(const sp<WorkDirectory>& workDirectory, int64_t timestampNs,
+ const string& envelopeFileName, const string& dataFileName);
+
+ virtual ~ReportFile();
+
+ /**
+ * Get the timestamp from when this file was added.
+ */
+ int64_t getTimestampNs() const;
+
+ /**
+ * Add an additional report to this ReportFile.
+ */
+ void addReport(const IncidentReportArgs& args);
+
+ /**
+ * Remove the reports for pkg/cls from this file.
+ */
+ void removeReport(const string& pkg, const string& cls);
+
+ /**
+ * Remove all reports for pkg from this file.
+ */
+ void removeReports(const string& pkg);
+
+ /**
+ * Set the metadata for this incident report.
+ */
+ void setMetadata(const IncidentMetadata& metadata);
+
+ /*
+ * Mark this incident report as finished and ready for broadcast.
+ */
+ void markCompleted();
+
+ /*
+ * Mark this incident report as finished and ready for broadcast.
+ */
+ status_t markApproved(const string& pkg, const string& cls);
+
+ /**
+ * Set the privacy policy that is being used to pre-filter the data
+ * going to disk.
+ */
+ void setMaxPersistedPrivacyPolicy(int persistedPrivacyPolicy);
+
+ /**
+ * Save the metadata (envelope) information about the incident
+ * report. Must be called after addReport, setMetadata markCompleted
+ * markApproved to save those changes to disk.
+ */
+ status_t saveEnvelope();
+
+ /**
+ * Like saveEnvelope() but will not clean up if there is an error.
+ */
+ status_t trySaveEnvelope();
+
+ /**
+ * Read the envelope information from disk. If there was an error, the envelope and
+ * data file will be removed. If the proto can't be loaded, the whole file is deleted.
+ */
+ status_t loadEnvelope();
+
+ /**
+ * Like loadEnvelope() but will not clean up if there is an error.
+ */
+ status_t tryLoadEnvelope();
+
+ /**
+ * Get the envelope information.
+ */
+ const ReportFileProto& getEnvelope();
+
+ /**
+ * Open the file that will contain the contents of the incident report. Call
+ * close() or closeDataFile() on the result of getDataFileFd() when you're done.
+ * This is not done automatically in the desctructor. If there is an error, returns
+ * it and you will not get an fd.
+ */
+ status_t startWritingDataFile();
+
+ /**
+ * Close the data file.
+ */
+ void closeDataFile();
+
+ /**
+ * Spawn a thread to start writing and filtering data to a pipe, the read end of which
+ * will be returned in fd. This thread will be detached and run until somebody finishes
+ * reading from the fd or closes it. If there is an error, returns it and you will not
+ * get an fd.
+ *
+ * Use the privacy and section configuraiton from the args parameter.
+ */
+ status_t startFilteringData(int* fd, const IncidentReportArgs& args);
+
+ /**
+ * Get the name of the data file on disk.
+ */
+ string getDataFileName() const;
+
+ /**
+ * Get the name of the envelope file on disk.
+ */
+ string getEnvelopeFileName() const;
+
+ /**
+ * Return the file descriptor for the data file, or -1 if it is not
+ * currently open.
+ */
+ int getDataFileFd();
+
+ /**
+ * Record that there was an error writing to the data file.
+ */
+ void setWriteError(status_t err);
+
+ /**
+ * Get whether there was previously an error writing to the data file.
+ */
+ status_t getWriteError();
+
+ /**
+ * Get the unique identifier for this file.
+ */
+ string getId();
+
+private:
+ sp<WorkDirectory> mWorkDirectory;
+ int64_t mTimestampNs;
+ string mEnvelopeFileName;
+ string mDataFileName;
+ ReportFileProto mEnvelope;
+ int mDataFd;
+ status_t mError;
+
+ status_t save_envelope_impl(bool cleanup);
+ status_t load_envelope_impl(bool cleanup);
+};
+
+/**
+ * For directory cleanup to work, WorkDirectory must be kept
+ * alive for the duration of all of the ReportFiles. In the real
+ * incidentd, WorkDirectory is a singleton. In tests, it may
+ * have a shorter duration.
+ */
+class WorkDirectory : public virtual RefBase {
+public:
+ /**
+ * Save files to the default location.
+ */
+ WorkDirectory();
+
+ /**
+ * Save files to a specific location (primarily for testing).
+ */
+ WorkDirectory(const string& dir, int maxFileCount, long maxDiskUsageBytes);
+
+ /**
+ * Return a new report file. Creating this object won't fail, but
+ * subsequent actions on the file could, if the disk is full, permissions
+ * aren't set correctly, etc.
+ */
+ sp<ReportFile> createReportFile();
+
+ /**
+ * Get the reports that are saved on-disk, with the time after (>) than the
+ * given timestamp. Pass 0 to start at the beginning. These files
+ * will be sorted by timestamp. The envelope will not have been loaded.
+ */
+ status_t getReports(vector<sp<ReportFile>>* files, int64_t after);
+
+ /**
+ * Get the report with the given package, class and id. Returns nullptr if
+ * that can't be found. The envelope will have been loaded. Returns the
+ * original IncidentReportArgs in *args if args != nullptr.
+ */
+ sp<ReportFile> getReport(const string& pkg, const string& cls, const string& id,
+ IncidentReportArgs* args);
+
+ /**
+ * Returns whether there are more reports after the given timestamp.
+ */
+ bool hasMore(int64_t after);
+
+ /**
+ * Confirm that a particular broadcast receiver has received the data. When all
+ * broadcast receivers for a particular report file have finished, the envelope
+ * and data files will be deleted.
+ */
+ void commit(const sp<ReportFile>& report, const string& pkg, const string& cls);
+
+ /**
+ * Commit all reports the given package.
+ */
+ void commitAll(const string& pkg);
+
+ /**
+ * Remove the envelope and data file from disk, regardless of whether there are
+ * more pending readers or broadcasts, for example in response to an error.
+ */
+ void remove(const sp<ReportFile>& report);
+
+private:
+ string mDirectory;
+ int mMaxFileCount;
+ long mMaxDiskUsageBytes;
+
+ // Held while creating or removing envelope files, which are the file that keeps
+ // the directory consistent.
+ mutex mLock;
+
+ int64_t make_timestamp_ns_locked();
+ bool file_exists_locked(int64_t timestampNs);
+ off_t get_directory_contents_locked(map<string,WorkDirectoryEntry>* files, int64_t after);
+ void clean_directory_locked();
+ void delete_files_for_report_if_necessary(const sp<ReportFile>& report);
+
+ string make_filename(int64_t timestampNs, const string& extension);
+};
+
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
diff --git a/cmds/incidentd/src/incidentd_util.cpp b/cmds/incidentd/src/incidentd_util.cpp
index af685d8..dfaf893 100644
--- a/cmds/incidentd/src/incidentd_util.cpp
+++ b/cmds/incidentd/src/incidentd_util.cpp
@@ -68,7 +68,6 @@
// fork used in multithreaded environment, avoid adding unnecessary code in child process
pid_t pid = fork();
if (pid == 0) {
- VLOG("[In child]cmd %s", argv[0]);
if (input != NULL && (TEMP_FAILURE_RETRY(dup2(input->readFd().get(), STDIN_FILENO)) < 0 ||
!input->close())) {
ALOGW("Failed to dup2 stdin.");
@@ -158,4 +157,4 @@
} // namespace incidentd
} // namespace os
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/cmds/incidentd/src/incidentd_util.h b/cmds/incidentd/src/incidentd_util.h
index 3dac2c4..cc30768 100644
--- a/cmds/incidentd/src/incidentd_util.h
+++ b/cmds/incidentd/src/incidentd_util.h
@@ -78,6 +78,8 @@
status_t kill_child(pid_t pid);
status_t wait_child(pid_t pid);
+status_t start_detached_thread(const function<void ()>& func);
+
} // namespace incidentd
} // namespace os
} // namespace android
diff --git a/cmds/incidentd/src/proto_util.cpp b/cmds/incidentd/src/proto_util.cpp
new file mode 100644
index 0000000..be2f24f
--- /dev/null
+++ b/cmds/incidentd/src/proto_util.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "proto_util.h"
+
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+
+#include <android/util/protobuf.h>
+#include <android/util/ProtoOutputStream.h>
+#include <android-base/file.h>
+
+namespace android {
+namespace os {
+namespace incidentd {
+
+using namespace android::base;
+using namespace android::util;
+using google::protobuf::io::FileOutputStream;
+
+// special section ids
+const int FIELD_ID_INCIDENT_HEADER = 1;
+
+status_t write_header_section(int fd, const vector<uint8_t>& buf) {
+ status_t err;
+ const size_t bufSize = buf.size();
+
+ if (buf.empty()) {
+ return NO_ERROR;
+ }
+
+ err = write_section_header(fd, FIELD_ID_INCIDENT_HEADER, bufSize);
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ err = WriteFully(fd, (uint8_t const*)buf.data(), bufSize);
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ return NO_ERROR;
+}
+
+status_t write_section_header(int fd, int sectionId, size_t size) {
+ uint8_t buf[20];
+ uint8_t* p = write_length_delimited_tag_header(buf, sectionId, size);
+ return WriteFully(fd, buf, p - buf) ? NO_ERROR : -errno;
+}
+
+status_t write_section(int fd, int sectionId, const MessageLite& message) {
+ status_t err;
+
+ err = write_section_header(fd, sectionId, message.ByteSize());
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ FileOutputStream stream(fd);
+ if (!message.SerializeToZeroCopyStream(&stream)) {
+ return stream.GetErrno();
+ } else {
+ return NO_ERROR;
+ }
+}
+
+
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
diff --git a/cmds/incidentd/src/proto_util.h b/cmds/incidentd/src/proto_util.h
new file mode 100644
index 0000000..b9df6cb
--- /dev/null
+++ b/cmds/incidentd/src/proto_util.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#include <utils/Errors.h>
+
+#include <google/protobuf/message_lite.h>
+
+#include <vector>
+
+namespace android {
+namespace os {
+namespace incidentd {
+
+using std::vector;
+using google::protobuf::MessageLite;
+
+/**
+ * Write the IncidentHeaderProto section
+ */
+status_t write_header_section(int fd, const vector<uint8_t>& buf);
+
+/**
+ * Write the prologue for a section in the incident report
+ * (This is the proto length-prefixed field format).
+ */
+status_t write_section_header(int fd, int sectionId, size_t size);
+
+/**
+ * Write the given protobuf object as a section.
+ */
+status_t write_section(int fd, int sectionId, const MessageLite& message);
+
+} // namespace incidentd
+} // namespace os
+} // namespace android
+
+
diff --git a/cmds/incidentd/src/report_directory.cpp b/cmds/incidentd/src/report_directory.cpp
index e2883ba..7d20a74 100644
--- a/cmds/incidentd/src/report_directory.cpp
+++ b/cmds/incidentd/src/report_directory.cpp
@@ -33,63 +33,6 @@
namespace os {
namespace incidentd {
-status_t create_directory(const char* directory) {
- struct stat st;
- status_t err = NO_ERROR;
- char* dir = strdup(directory);
-
- // Skip first slash
- char* d = dir + 1;
-
- // Create directories, assigning them to the system user
- bool last = false;
- while (!last) {
- d = strchr(d, '/');
- if (d != NULL) {
- *d = '\0';
- } else {
- last = true;
- }
- if (stat(dir, &st) == 0) {
- if (!S_ISDIR(st.st_mode)) {
- err = ALREADY_EXISTS;
- goto done;
- }
- } else {
- ALOGE("No such directory %s, something wrong.", dir);
- err = -1;
- goto done;
- }
- if (!last) {
- *d++ = '/';
- }
- }
-
- // Ensure that the final directory is owned by the system with 0770. If it isn't
- // we won't write into it.
- if (stat(directory, &st) != 0) {
- ALOGE("No incident reports today. Can't stat: %s", directory);
- err = -errno;
- goto done;
- }
- if ((st.st_mode & 0777) != 0770) {
- ALOGE("No incident reports today. Mode is %0o on report directory %s", st.st_mode,
- directory);
- err = BAD_VALUE;
- goto done;
- }
- if (st.st_uid != AID_INCIDENTD || st.st_gid != AID_INCIDENTD) {
- ALOGE("No incident reports today. Owner is %d and group is %d on report directory %s",
- st.st_uid, st.st_gid, directory);
- err = BAD_VALUE;
- goto done;
- }
-
-done:
- free(dir);
- return err;
-}
-
static bool stat_mtime_cmp(const std::pair<String8, struct stat>& a,
const std::pair<String8, struct stat>& b) {
return a.second.st_mtime < b.second.st_mtime;
@@ -153,4 +96,4 @@
} // namespace incidentd
} // namespace os
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/cmds/incidentd/src/report_file.proto b/cmds/incidentd/src/report_file.proto
new file mode 100644
index 0000000..7563da2
--- /dev/null
+++ b/cmds/incidentd/src/report_file.proto
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.os.incidentd;
+
+import "frameworks/base/core/proto/android/os/metadata.proto";
+
+message ReportFileProto {
+ /**
+ * Metadata about each of the calls to reportIncident that
+ * initiated the incident report.
+ */
+ message Report {
+ /**
+ * Package name for broadcast receiver to be told when
+ * the report is complete.
+ */
+ optional string pkg = 1;
+
+ /**
+ * Class name for broadcast receiver to be told when
+ * the report is complete.
+ */
+ optional string cls = 2;
+
+ /**
+ * Privacy policy at which this report should be shared.
+ */
+ optional uint32 privacy_policy = 4;
+
+ /**
+ * Whether all available sections should be returned.
+ */
+ optional bool all_sections = 5;
+
+ /**
+ * If all_sections is not true, then this is the
+ * list of sections that were requested.
+ */
+ repeated int32 section = 6;
+
+ /**
+ * Flattened IncidentHeaderProto that was passed with this
+ * request.
+ */
+ repeated bytes header = 7;
+
+ /**
+ * Whether the user has approved this report to be shared with
+ * the given client.
+ */
+ optional bool share_approved = 8;
+ }
+
+ /**
+ * Metadata section recorded while the incident report
+ * was taken.
+ */
+ optional android.os.IncidentMetadata metadata = 1;
+
+ /**
+ * Report data structures for the incident reports.
+ */
+ repeated Report report = 2;
+
+ /**
+ * The file name, relative to the work directory where
+ * the data file is stored. The content of the data file
+ * is an android.os.IncidentProto, without the metadata
+ * or header sections.
+ */
+ optional string data_file = 3;
+
+ /**
+ * The privacy policy to which the file is already filtered.
+ */
+ optional uint32 privacy_policy = 4;
+
+ /**
+ * How big the data file is expected to be. If the size
+ * recorded here and the size on disk mismatch, then we
+ * know there was an error.
+ */
+ optional int64 data_file_size = 5;
+
+ /**
+ * Whether this report has been finished, and is now
+ * ready for broadcast / dropbox / etc.
+ */
+ optional bool completed = 6;
+}
+
diff --git a/cmds/incidentd/tests/FdBuffer_test.cpp b/cmds/incidentd/tests/FdBuffer_test.cpp
index 3f92c2a..7edfadf 100644
--- a/cmds/incidentd/tests/FdBuffer_test.cpp
+++ b/cmds/incidentd/tests/FdBuffer_test.cpp
@@ -50,9 +50,9 @@
void AssertBufferContent(const char* expected) {
int i = 0;
- EncodedBuffer::iterator it = buffer.data();
- while (it.hasNext()) {
- ASSERT_EQ(it.next(), expected[i++]);
+ sp<ProtoReader> reader = buffer.data()->read();
+ while (reader->hasNext()) {
+ ASSERT_EQ(reader->next(), expected[i++]);
}
EXPECT_EQ(expected[i], '\0');
}
@@ -92,8 +92,8 @@
}
TEST_F(FdBufferTest, IterateEmpty) {
- EncodedBuffer::iterator it = buffer.data();
- EXPECT_FALSE(it.hasNext());
+ sp<ProtoReader> reader = buffer.data()->read();
+ EXPECT_FALSE(reader->hasNext());
}
TEST_F(FdBufferTest, ReadAndIterate) {
@@ -102,15 +102,23 @@
ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
int i = 0;
- EncodedBuffer::iterator it = buffer.data();
- while (it.hasNext()) {
- EXPECT_EQ(it.next(), (uint8_t)testdata[i++]);
- }
+ sp<ProtoReader> reader = buffer.data()->read();
- it.rp()->rewind();
- it.rp()->move(buffer.size());
- EXPECT_EQ(it.bytesRead(), testdata.size());
- EXPECT_FALSE(it.hasNext());
+ while (reader->hasNext()) {
+ EXPECT_EQ(reader->next(), (uint8_t)testdata[i++]);
+ }
+}
+
+TEST_F(FdBufferTest, Move) {
+ std::string testdata = "FdBuffer test string";
+ ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
+ ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
+
+ sp<ProtoReader> reader = buffer.data()->read();
+ reader->move(buffer.size());
+
+ EXPECT_EQ(reader->bytesRead(), testdata.size());
+ EXPECT_FALSE(reader->hasNext());
}
TEST_F(FdBufferTest, ReadTimeout) {
@@ -224,7 +232,7 @@
}
}
-TEST_F(FdBufferTest, ReadInStreamMoreThan4MB) {
+TEST_F(FdBufferTest, ReadInStreamMoreThan4MBWithMove) {
const std::string testFile = kTestDataPath + "morethan4MB.txt";
size_t fourMB = (size_t)4 * 1024 * 1024;
unique_fd fd(open(testFile.c_str(), O_RDONLY | O_CLOEXEC));
@@ -250,15 +258,45 @@
EXPECT_FALSE(buffer.timedOut());
EXPECT_TRUE(buffer.truncated());
wait(&pid);
- EncodedBuffer::iterator it = buffer.data();
- it.rp()->move(fourMB);
- EXPECT_EQ(it.bytesRead(), fourMB);
- EXPECT_FALSE(it.hasNext());
+ sp<ProtoReader> reader = buffer.data()->read();
+ reader->move(fourMB);
- it.rp()->rewind();
- while (it.hasNext()) {
- char c = 'A' + (it.bytesRead() % 64 / 8);
- ASSERT_TRUE(it.next() == c);
+ EXPECT_EQ(reader->bytesRead(), fourMB);
+ EXPECT_FALSE(reader->hasNext());
+ }
+}
+
+TEST_F(FdBufferTest, ReadInStreamMoreThan4MBWithNext) {
+ const std::string testFile = kTestDataPath + "morethan4MB.txt";
+ size_t fourMB = (size_t)4 * 1024 * 1024;
+ unique_fd fd(open(testFile.c_str(), O_RDONLY | O_CLOEXEC));
+ ASSERT_NE(fd.get(), -1);
+ int pid = fork();
+ ASSERT_TRUE(pid != -1);
+
+ if (pid == 0) {
+ p2cPipe.writeFd().reset();
+ c2pPipe.readFd().reset();
+ ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
+ p2cPipe.readFd().reset();
+ c2pPipe.writeFd().reset();
+ _exit(EXIT_SUCCESS);
+ } else {
+ p2cPipe.readFd().reset();
+ c2pPipe.writeFd().reset();
+
+ ASSERT_EQ(NO_ERROR,
+ buffer.readProcessedDataInStream(fd, std::move(p2cPipe.writeFd()),
+ std::move(c2pPipe.readFd()), READ_TIMEOUT));
+ EXPECT_EQ(buffer.size(), fourMB);
+ EXPECT_FALSE(buffer.timedOut());
+ EXPECT_TRUE(buffer.truncated());
+ wait(&pid);
+ sp<ProtoReader> reader = buffer.data()->read();
+
+ while (reader->hasNext()) {
+ char c = 'A' + (reader->bytesRead() % 64 / 8);
+ ASSERT_TRUE(reader->next() == c);
}
}
}
diff --git a/cmds/incidentd/tests/PrivacyBuffer_test.cpp b/cmds/incidentd/tests/PrivacyBuffer_test.cpp
deleted file mode 100644
index 871226b..0000000
--- a/cmds/incidentd/tests/PrivacyBuffer_test.cpp
+++ /dev/null
@@ -1,288 +0,0 @@
-// Copyright (C) 2017 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.
-#define DEBUG false
-#include "Log.h"
-
-#include "FdBuffer.h"
-#include "PrivacyBuffer.h"
-
-#include <android-base/file.h>
-#include <android-base/test_utils.h>
-#include <android/os/IncidentReportArgs.h>
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-#include <string.h>
-
-using namespace android;
-using namespace android::base;
-using namespace android::os;
-using namespace android::os::incidentd;
-using ::testing::StrEq;
-using ::testing::Test;
-using ::testing::internal::CaptureStdout;
-using ::testing::internal::GetCapturedStdout;
-
-const uint8_t OTHER_TYPE = 1;
-const uint8_t STRING_TYPE = 9;
-const uint8_t MESSAGE_TYPE = 11;
-const std::string STRING_FIELD_0 = "\x02\viamtestdata";
-const std::string VARINT_FIELD_1 = "\x08\x96\x01"; // 150
-const std::string STRING_FIELD_2 = "\x12\vandroidwins";
-const std::string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff"; // -1
-const std::string FIX32_FIELD_4 = "\x25\xff\xff\xff\xff"; // -1
-const std::string MESSAGE_FIELD_5 = "\x2a\x10" + VARINT_FIELD_1 + STRING_FIELD_2;
-const std::string NEGATIVE_VARINT_FIELD_6 = "\x30\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01"; // -1
-
-class PrivacyBufferTest : public Test {
-public:
- virtual ~PrivacyBufferTest() {
- // Delete in reverse order of construction, to be consistent with
- // regular allocation/deallocation.
- while (!privacies.empty()) {
- delete privacies.back();
- privacies.pop_back();
- }
- }
-
- virtual void SetUp() override { ASSERT_NE(tf.fd, -1); }
-
- void writeToFdBuffer(std::string str) {
- ASSERT_TRUE(WriteStringToFile(str, tf.path));
- ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, 10000));
- ASSERT_EQ(str.size(), buffer.size());
- }
-
- void assertBuffer(PrivacyBuffer& buf, std::string expected) {
- ASSERT_EQ(buf.size(), expected.size());
- CaptureStdout();
- ASSERT_EQ(buf.flush(STDOUT_FILENO), NO_ERROR);
- ASSERT_THAT(GetCapturedStdout(), StrEq(expected));
- }
-
- void assertStrip(uint8_t dest, std::string expected, Privacy* policy) {
- PrivacySpec spec = PrivacySpec::new_spec(dest);
- EncodedBuffer::iterator bufData = buffer.data();
- PrivacyBuffer privacyBuf(policy, bufData);
- ASSERT_EQ(privacyBuf.strip(spec), NO_ERROR);
- assertBuffer(privacyBuf, expected);
- }
-
- void assertStripByFields(uint8_t dest, std::string expected, int size, Privacy* privacy, ...) {
- Privacy* list[size + 1];
- list[0] = privacy;
- va_list args;
- va_start(args, privacy);
- for (int i = 1; i < size; i++) {
- Privacy* p = va_arg(args, Privacy*);
- list[i] = p;
- }
- va_end(args);
- list[size] = NULL;
- assertStrip(dest, expected, create_message_privacy(300, list));
- }
-
- Privacy* create_privacy(uint32_t field_id, uint8_t type, uint8_t dest) {
- Privacy* p = new_uninit_privacy();
- p->field_id = field_id;
- p->type = type;
- p->children = NULL;
- p->dest = dest;
- p->patterns = NULL;
- return p;
- }
-
- Privacy* create_message_privacy(uint32_t field_id, Privacy** children) {
- Privacy* p = new_uninit_privacy();
- p->field_id = field_id;
- p->type = MESSAGE_TYPE;
- p->children = children;
- p->dest = DEST_DEFAULT_VALUE;
- p->patterns = NULL;
- return p;
- }
-
- FdBuffer buffer;
-
-private:
- TemporaryFile tf;
- // Littering this code with unique_ptr (or similar) is ugly, so we just
- // mass-free everything after the test completes.
- std::vector<Privacy*> privacies;
-
- Privacy* new_uninit_privacy() {
- Privacy* p = new Privacy;
- privacies.push_back(p);
- return p;
- }
-};
-
-TEST_F(PrivacyBufferTest, NullPolicy) {
- writeToFdBuffer(STRING_FIELD_0);
- assertStrip(DEST_EXPLICIT, STRING_FIELD_0, NULL);
-}
-
-TEST_F(PrivacyBufferTest, StripUnsetField) {
- writeToFdBuffer(STRING_FIELD_0);
- assertStripByFields(DEST_AUTOMATIC, "", 1, create_privacy(0, STRING_TYPE, DEST_UNSET));
-}
-
-TEST_F(PrivacyBufferTest, StripVarintField) {
- writeToFdBuffer(VARINT_FIELD_1);
- assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(1, OTHER_TYPE, DEST_LOCAL));
-}
-
-TEST_F(PrivacyBufferTest, StripLengthDelimitedField_String) {
- writeToFdBuffer(STRING_FIELD_2);
- assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(2, STRING_TYPE, DEST_LOCAL));
-}
-
-TEST_F(PrivacyBufferTest, StripFixed64Field) {
- writeToFdBuffer(FIX64_FIELD_3);
- assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(3, OTHER_TYPE, DEST_LOCAL));
-}
-
-TEST_F(PrivacyBufferTest, StripFixed32Field) {
- writeToFdBuffer(FIX32_FIELD_4);
- assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(4, OTHER_TYPE, DEST_LOCAL));
-}
-
-TEST_F(PrivacyBufferTest, StripLengthDelimitedField_Message) {
- writeToFdBuffer(MESSAGE_FIELD_5);
- assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(5, MESSAGE_TYPE, DEST_LOCAL));
-}
-
-TEST_F(PrivacyBufferTest, StripNegativeVarint) {
- writeToFdBuffer(NEGATIVE_VARINT_FIELD_6);
- assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(6, OTHER_TYPE, DEST_LOCAL));
-}
-
-TEST_F(PrivacyBufferTest, NoStripVarintField) {
- writeToFdBuffer(VARINT_FIELD_1);
- assertStripByFields(DEST_EXPLICIT, VARINT_FIELD_1, 1,
- create_privacy(1, OTHER_TYPE, DEST_AUTOMATIC));
-}
-
-TEST_F(PrivacyBufferTest, NoStripLengthDelimitedField_String) {
- writeToFdBuffer(STRING_FIELD_2);
- assertStripByFields(DEST_EXPLICIT, STRING_FIELD_2, 1,
- create_privacy(2, STRING_TYPE, DEST_AUTOMATIC));
-}
-
-TEST_F(PrivacyBufferTest, NoStripFixed64Field) {
- writeToFdBuffer(FIX64_FIELD_3);
- assertStripByFields(DEST_EXPLICIT, FIX64_FIELD_3, 1,
- create_privacy(3, OTHER_TYPE, DEST_AUTOMATIC));
-}
-
-TEST_F(PrivacyBufferTest, NoStripFixed32Field) {
- writeToFdBuffer(FIX32_FIELD_4);
- assertStripByFields(DEST_EXPLICIT, FIX32_FIELD_4, 1,
- create_privacy(4, OTHER_TYPE, DEST_AUTOMATIC));
-}
-
-TEST_F(PrivacyBufferTest, NoStripLengthDelimitedField_Message) {
- writeToFdBuffer(MESSAGE_FIELD_5);
- assertStripByFields(DEST_EXPLICIT, MESSAGE_FIELD_5, 1,
- create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC));
-}
-
-TEST_F(PrivacyBufferTest, NoStripNegativeVarintField) {
- writeToFdBuffer(NEGATIVE_VARINT_FIELD_6);
- assertStripByFields(DEST_EXPLICIT, NEGATIVE_VARINT_FIELD_6, 1,
- create_privacy(6, OTHER_TYPE, DEST_AUTOMATIC));
-}
-
-TEST_F(PrivacyBufferTest, StripVarintAndString) {
- writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
- FIX32_FIELD_4);
- std::string expected = STRING_FIELD_0 + FIX64_FIELD_3 + FIX32_FIELD_4;
- assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL),
- create_privacy(2, STRING_TYPE, DEST_LOCAL));
-}
-
-TEST_F(PrivacyBufferTest, StripVarintAndFixed64) {
- writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
- FIX32_FIELD_4);
- std::string expected = STRING_FIELD_0 + STRING_FIELD_2 + FIX32_FIELD_4;
- assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL),
- create_privacy(3, OTHER_TYPE, DEST_LOCAL));
-}
-
-TEST_F(PrivacyBufferTest, StripVarintInNestedMessage) {
- writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5);
- Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
- std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
- assertStripByFields(DEST_EXPLICIT, expected, 1, create_message_privacy(5, list));
-}
-
-TEST_F(PrivacyBufferTest, StripFix64AndVarintInNestedMessage) {
- writeToFdBuffer(STRING_FIELD_0 + FIX64_FIELD_3 + MESSAGE_FIELD_5);
- Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
- std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
- assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(3, OTHER_TYPE, DEST_LOCAL),
- create_message_privacy(5, list));
-}
-
-TEST_F(PrivacyBufferTest, ClearAndStrip) {
- string data = STRING_FIELD_0 + VARINT_FIELD_1;
- writeToFdBuffer(data);
- Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
- EncodedBuffer::iterator bufData = buffer.data();
- PrivacyBuffer privacyBuf(create_message_privacy(300, list), bufData);
- PrivacySpec spec1 = PrivacySpec::new_spec(DEST_EXPLICIT);
- PrivacySpec spec2 = PrivacySpec::new_spec(DEST_LOCAL);
-
- ASSERT_EQ(privacyBuf.strip(spec1), NO_ERROR);
- assertBuffer(privacyBuf, STRING_FIELD_0);
- ASSERT_EQ(privacyBuf.strip(spec2), NO_ERROR);
- assertBuffer(privacyBuf, data);
-}
-
-TEST_F(PrivacyBufferTest, BadDataInFdBuffer) {
- writeToFdBuffer("iambaddata");
- Privacy* list[] = {create_privacy(4, OTHER_TYPE, DEST_AUTOMATIC), NULL};
- EncodedBuffer::iterator bufData = buffer.data();
- PrivacyBuffer privacyBuf(create_message_privacy(300, list), bufData);
- PrivacySpec spec;
- ASSERT_EQ(privacyBuf.strip(spec), BAD_VALUE);
-}
-
-TEST_F(PrivacyBufferTest, BadDataInNestedMessage) {
- writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5 + "aoeoe");
- Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
- Privacy* field5[] = {create_message_privacy(5, list), NULL};
- EncodedBuffer::iterator bufData = buffer.data();
- PrivacyBuffer privacyBuf(create_message_privacy(300, field5), bufData);
- PrivacySpec spec;
- ASSERT_EQ(privacyBuf.strip(spec), BAD_VALUE);
-}
-
-TEST_F(PrivacyBufferTest, SelfRecursionMessage) {
- string input = "\x2a\"" + VARINT_FIELD_1 + STRING_FIELD_2 + MESSAGE_FIELD_5;
- writeToFdBuffer(input);
- Privacy* field5 = create_message_privacy(5, NULL);
- Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), field5, NULL};
- field5->children = list;
- std::string expected = "\x2a\x1c" + STRING_FIELD_2 + "\x2a\xd" + STRING_FIELD_2;
- assertStrip(DEST_EXPLICIT, expected, field5);
-}
-
-TEST_F(PrivacyBufferTest, AutoMessage) {
- writeToFdBuffer(STRING_FIELD_2 + MESSAGE_FIELD_5);
- Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
- Privacy* autoMsg = create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC);
- autoMsg->children = list;
- std::string expected = "\x2a\xd" + STRING_FIELD_2;
- assertStripByFields(DEST_AUTOMATIC, expected, 1, autoMsg);
-}
diff --git a/cmds/incidentd/tests/PrivacyFilter_test.cpp b/cmds/incidentd/tests/PrivacyFilter_test.cpp
new file mode 100644
index 0000000..5c05aac
--- /dev/null
+++ b/cmds/incidentd/tests/PrivacyFilter_test.cpp
@@ -0,0 +1,302 @@
+// Copyright (C) 2017 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.
+#define DEBUG false
+#include "Log.h"
+
+#include "FdBuffer.h"
+#include "PrivacyFilter.h"
+
+#include <android-base/file.h>
+#include <android-base/test_utils.h>
+#include <android/os/IncidentReportArgs.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+#include <string.h>
+
+using namespace android;
+using namespace android::base;
+using namespace android::os;
+using namespace android::os::incidentd;
+using ::testing::StrEq;
+using ::testing::Test;
+using ::testing::internal::CaptureStdout;
+using ::testing::internal::GetCapturedStdout;
+
+const uint8_t OTHER_TYPE = 1;
+const uint8_t STRING_TYPE = 9;
+const uint8_t MESSAGE_TYPE = 11;
+const std::string STRING_FIELD_0 = "\x02\viamtestdata";
+const std::string VARINT_FIELD_1 = "\x08\x96\x01"; // 150
+const std::string STRING_FIELD_2 = "\x12\vandroidwins";
+const std::string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff"; // -1
+const std::string FIX32_FIELD_4 = "\x25\xff\xff\xff\xff"; // -1
+const std::string MESSAGE_FIELD_5 = "\x2a\x10" + VARINT_FIELD_1 + STRING_FIELD_2;
+const std::string NEGATIVE_VARINT_FIELD_6 = "\x30\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01"; // -1
+
+#if 0
+class PrivacyFilterTest : public Test {
+public:
+ virtual ~PrivacyFilterTest() {
+ // Delete in reverse order of construction, to be consistent with
+ // regular allocation/deallocation.
+ while (!privacies.empty()) {
+ delete privacies.back();
+ privacies.pop_back();
+ }
+ }
+
+ virtual void SetUp() override { ASSERT_NE(tf.fd, -1); }
+
+ void writeToFdBuffer(std::string str) {
+ ASSERT_TRUE(WriteStringToFile(str, tf.path));
+ ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, 10000));
+ ASSERT_EQ(str.size(), buffer.size());
+ }
+
+ void assertBuffer(PrivacyFilter& buf, std::string expected) {
+ ASSERT_EQ(buf.size(), expected.size());
+ CaptureStdout();
+ ASSERT_EQ(buf.flush(STDOUT_FILENO), NO_ERROR);
+ ASSERT_THAT(GetCapturedStdout(), StrEq(expected));
+ }
+
+ void assertStrip(uint8_t privacyPolicy, std::string expected, Privacy* policy) {
+ PrivacySpec spec = PrivacySpec::new_spec(privacyPolicy);
+ EncodedBuffer::iterator bufData = buffer.data();
+ PrivacyFilter filter(policy, bufData);
+ ASSERT_EQ(filter.strip(spec), NO_ERROR);
+ assertBuffer(filter, expected);
+ }
+
+ void assertStripByFields(uint8_t privacyPolicy, std::string expected, int size,
+ Privacy* privacy, ...) {
+ Privacy* list[size + 1];
+ list[0] = privacy;
+ va_list args;
+ va_start(args, privacy);
+ for (int i = 1; i < size; i++) {
+ Privacy* p = va_arg(args, Privacy*);
+ list[i] = pPrivacyFilter
+ }
+ va_end(args);
+ list[size] = NULL;
+ assertStrip(privacyPolicy, expected, create_message_privacy(300, list));
+ }
+
+ Privacy* create_privacy(uint32_t field_id, uint8_t type, uint8_t privacyPolicy) {
+ Privacy* p = new_uninit_privacy();
+ p->field_id = field_id;
+ p->type = type;
+ p->children = NULL;
+ p->policy = privacyPolicy;
+ p->patterns = NULL;
+ return p;
+ }
+
+ Privacy* create_message_privacy(uint32_t field_id, Privacy** children) {
+ Privacy* p = new_uninit_privacy();
+ p->field_id = field_id;
+ p->type = MESSAGE_TYPE;
+ p->children = children;
+ p->policy = PRIVACY_POLICY_UNSET;
+ p->patterns = NULL;
+ return p;
+ }
+
+ FdBuffer buffer;
+
+private:
+ TemporaryFile tf;
+ // Littering this code with unique_ptr (or similar) is ugly, so we just
+ // mass-free everything after the test completes.
+ std::vector<Privacy*> privacies;
+
+ Privacy* new_uninit_privacy() {
+ Privacy* p = new Privacy;
+ privacies.push_back(p);
+ return p;
+ }
+};
+
+TEST_F(PrivacyFilterTest, NullPolicy) {
+ writeToFdBuffer(STRING_FIELD_0);
+ assertStrip(PRIVACY_POLICY_EXPLICIT, STRING_FIELD_0, NULL);
+}
+
+TEST_F(PrivacyFilterTest, StripUnsetField) {
+ writeToFdBuffer(STRING_FIELD_0);
+ assertStripByFields(PRIVACY_POLICY_AUTOMATIC, "", 1,
+ create_privacy(0, STRING_TYPE, PRIVACY_POLICY_UNSET));
+}
+
+TEST_F(PrivacyFilterTest, StripVarintField) {
+ writeToFdBuffer(VARINT_FIELD_1);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, "", 1,
+ create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_LOCAL));
+}
+
+TEST_F(PrivacyFilterTest, StripLengthDelimitedField_String) {
+ writeToFdBuffer(STRING_FIELD_2);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, "", 1,
+ create_privacy(2, STRING_TYPE, PRIVACY_POLICY_LOCAL));
+}
+
+TEST_F(PrivacyFilterTest, StripFixed64Field) {
+ writeToFdBuffer(FIX64_FIELD_3);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, "", 1,
+ create_privacy(3, OTHER_TYPE, PRIVACY_POLICY_LOCAL));
+}
+
+TEST_F(PrivacyFilterTest, StripFixed32Field) {
+ writeToFdBuffer(FIX32_FIELD_4);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, "", 1,
+ create_privacy(4, OTHER_TYPE, PRIVACY_POLICY_LOCAL));
+}
+
+TEST_F(PrivacyFilterTest, StripLengthDelimitedField_Message) {
+ writeToFdBuffer(MESSAGE_FIELD_5);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, "", 1,
+ create_privacy(5, MESSAGE_TYPE, PRIVACY_POLICY_LOCAL));
+}
+
+TEST_F(PrivacyFilterTest, StripNegativeVarint) {
+ writeToFdBuffer(NEGATIVE_VARINT_FIELD_6);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, "", 1,
+ create_privacy(6, OTHER_TYPE, PRIVACY_POLICY_LOCAL));
+}
+
+TEST_F(PrivacyFilterTest, NoStripVarintField) {
+ writeToFdBuffer(VARINT_FIELD_1);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, VARINT_FIELD_1, 1,
+ create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_AUTOMATIC));
+}
+
+TEST_F(PrivacyFilterTest, NoStripLengthDelimitedField_String) {
+ writeToFdBuffer(STRING_FIELD_2);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, STRING_FIELD_2, 1,
+ create_privacy(2, STRING_TYPE, PRIVACY_POLICY_AUTOMATIC));
+}
+
+TEST_F(PrivacyFilterTest, NoStripFixed64Field) {
+ writeToFdBuffer(FIX64_FIELD_3);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, FIX64_FIELD_3, 1,
+ create_privacy(3, OTHER_TYPE, PRIVACY_POLICY_AUTOMATIC));
+}
+
+TEST_F(PrivacyFilterTest, NoStripFixed32Field) {
+ writeToFdBuffer(FIX32_FIELD_4);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, FIX32_FIELD_4, 1,
+ create_privacy(4, OTHER_TYPE, PRIVACY_POLICY_AUTOMATIC));
+}
+
+TEST_F(PrivacyFilterTest, NoStripLengthDelimitedField_Message) {
+ writeToFdBuffer(MESSAGE_FIELD_5);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, MESSAGE_FIELD_5, 1,
+ create_privacy(5, MESSAGE_TYPE, PRIVACY_POLICY_AUTOMATIC));
+}
+
+TEST_F(PrivacyFilterTest, NoStripNegativeVarintField) {
+ writeToFdBuffer(NEGATIVE_VARINT_FIELD_6);
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, NEGATIVE_VARINT_FIELD_6, 1,
+ create_privacy(6, OTHER_TYPE, PRIVACY_POLICY_AUTOMATIC));
+}
+
+TEST_F(PrivacyFilterTest, StripVarintAndString) {
+ writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
+ FIX32_FIELD_4);
+ std::string expected = STRING_FIELD_0 + FIX64_FIELD_3 + FIX32_FIELD_4;
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, expected, 2,
+ create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_LOCAL),
+ create_privacy(2, STRING_TYPE, PRIVACY_POLICY_LOCAL));
+}
+
+TEST_F(PrivacyFilterTest, StripVarintAndFixed64) {
+ writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
+ FIX32_FIELD_4);
+ std::string expected = STRING_FIELD_0 + STRING_FIELD_2 + FIX32_FIELD_4;
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, expected, 2,
+ create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_LOCAL),
+ create_privacy(3, OTHER_TYPE, PRIVACY_POLICY_LOCAL));
+}
+
+TEST_F(PrivacyFilterTest, StripVarintInNestedMessage) {
+ writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5);
+ Privacy* list[] = {create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_LOCAL), NULL};
+ std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, expected, 1, create_message_privacy(5, list));
+}
+
+TEST_F(PrivacyFilterTest, StripFix64AndVarintInNestedMessage) {
+ writeToFdBuffer(STRING_FIELD_0 + FIX64_FIELD_3 + MESSAGE_FIELD_5);
+ Privacy* list[] = {create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_LOCAL), NULL};
+ std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
+ assertStripByFields(PRIVACY_POLICY_EXPLICIT, expected, 2,
+ create_privacy(3, OTHER_TYPE, PRIVACY_POLICY_LOCAL),
+ create_message_privacy(5, list));
+}
+
+TEST_F(PrivacyFilterTest, ClearAndStrip) {
+ string data = STRING_FIELD_0 + VARINT_FIELD_1;
+ writeToFdBuffer(data);
+ Privacy* list[] = {create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_LOCAL), NULL};
+ EncodedBuffer::iterator bufData = buffer.data();
+ PrivacyFilter filter(create_message_privacy(300, list), bufData);
+ PrivacySpec spec1 = PrivacySpec::new_spec(PRIVACY_POLICY_EXPLICIT);
+ PrivacySpec spec2 = PrivacySpec::new_spec(PRIVACY_POLICY_LOCAL);
+
+ ASSERT_EQ(filter.strip(spec1), NO_ERROR);
+ assertBuffer(filter, STRING_FIELD_0);
+ ASSERT_EQ(filter.strip(spec2), NO_ERROR);
+ assertBuffer(filter, data);
+}
+
+TEST_F(PrivacyFilterTest, BadDataInFdBuffer) {
+ writeToFdBuffer("iambaddata");
+ Privacy* list[] = {create_privacy(4, OTHER_TYPE, PRIVACY_POLICY_AUTOMATIC), NULL};
+ EncodedBuffer::iterator bufData = buffer.data();
+ PrivacyFilter filter(create_message_privacy(300, list), bufData);
+ PrivacySpec spec;
+ ASSERT_EQ(filter.strip(spec), BAD_VALUE);
+}
+
+TEST_F(PrivacyFilterTest, BadDataInNestedMessage) {
+ writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5 + "aoeoe");
+ Privacy* list[] = {create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_LOCAL), NULL};
+ Privacy* field5[] = {create_message_privacy(5, list), NULL};
+ EncodedBuffer::iterator bufData = buffer.data();
+ PrivacyFilter filter(create_message_privacy(300, field5), bufData);
+ PrivacySpec spec;
+ ASSERT_EQ(filter.strip(spec), BAD_VALUE);
+}
+
+TEST_F(PrivacyFilterTest, SelfRecursionMessage) {
+ string input = "\x2a\"" + VARINT_FIELD_1 + STRING_FIELD_2 + MESSAGE_FIELD_5;
+ writeToFdBuffer(input);
+ Privacy* field5 = create_message_privacy(5, NULL);
+ Privacy* list[] = {create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_LOCAL), field5, NULL};
+ field5->children = list;
+ std::string expected = "\x2a\x1c" + STRING_FIELD_2 + "\x2a\xd" + STRING_FIELD_2;
+ assertStrip(PRIVACY_POLICY_EXPLICIT, expected, field5);
+}
+
+TEST_F(PrivacyFilterTest, AutoMessage) {
+ writeToFdBuffer(STRING_FIELD_2 + MESSAGE_FIELD_5);
+ Privacy* list[] = {create_privacy(1, OTHER_TYPE, PRIVACY_POLICY_LOCAL), NULL};
+ Privacy* autoMsg = create_privacy(5, MESSAGE_TYPE, PRIVACY_POLICY_AUTOMATIC);
+ autoMsg->children = list;
+ std::string expected = "\x2a\xd" + STRING_FIELD_2;
+ assertStripByFields(PRIVACY_POLICY_AUTOMATIC, expected, 1, autoMsg);
+}
+
+#endif
diff --git a/cmds/incidentd/tests/Reporter_test.cpp b/cmds/incidentd/tests/Reporter_test.cpp
index b5e41d7..9becf17 100644
--- a/cmds/incidentd/tests/Reporter_test.cpp
+++ b/cmds/incidentd/tests/Reporter_test.cpp
@@ -17,7 +17,7 @@
#include "Reporter.h"
#include <android/os/BnIncidentReportStatusListener.h>
-#include <frameworks/base/libs/incident/proto/android/os/header.pb.h>
+#include <frameworks/base/core/proto/android/os/header.pb.h>
#include <dirent.h>
#include <string.h>
@@ -36,6 +36,7 @@
using ::testing::Test;
namespace {
+/*
void getHeaderData(const IncidentHeaderProto& headerProto, vector<uint8_t>* out) {
out->clear();
auto serialized = headerProto.SerializeAsString();
@@ -43,6 +44,7 @@
out->resize(serialized.length());
std::copy(serialized.begin(), serialized.end(), out->begin());
}
+*/
}
class TestListener : public IIncidentReportStatusListener {
@@ -82,6 +84,24 @@
return Status::ok();
};
+ int sectionStarted(int sectionId) const {
+ map<int, int>::const_iterator found = startSections.find(sectionId);
+ if (found != startSections.end()) {
+ return found->second;
+ } else {
+ return 0;
+ }
+ };
+
+ int sectionFinished(int sectionId) const {
+ map<int, int>::const_iterator found = finishSections.find(sectionId);
+ if (found != finishSections.end()) {
+ return found->second;
+ } else {
+ return 0;
+ }
+ };
+
protected:
virtual IBinder* onAsBinder() override { return nullptr; };
};
@@ -89,8 +109,7 @@
class ReporterTest : public Test {
public:
virtual void SetUp() {
- reporter = new Reporter(td.path);
- l = new TestListener();
+ listener = new TestListener();
}
vector<string> InspectFiles() {
@@ -115,9 +134,7 @@
protected:
TemporaryDir td;
- ReportRequestSet requests;
- sp<Reporter> reporter;
- sp<TestListener> l;
+ sp<TestListener> listener;
size_t size;
};
@@ -132,18 +149,17 @@
ASSERT_TRUE(args1.containsSection(3));
}
-TEST_F(ReporterTest, ReportRequestSetEmpty) {
- requests.setMainFd(STDOUT_FILENO);
- ASSERT_EQ(requests.mainFd(), STDOUT_FILENO);
-}
-
+/*
TEST_F(ReporterTest, RunReportEmpty) {
+ vector<sp<ReportRequest>> requests;
+ sp<Reporter> reporter = new Reporter(requests, td.path);
+
ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
- EXPECT_EQ(l->startInvoked, 0);
- EXPECT_EQ(l->finishInvoked, 0);
- EXPECT_TRUE(l->startSections.empty());
- EXPECT_TRUE(l->finishSections.empty());
- EXPECT_EQ(l->failedInvoked, 0);
+ EXPECT_EQ(0, listener->startInvoked);
+ EXPECT_EQ(0, listener->finishInvoked);
+ EXPECT_TRUE(listener->startSections.empty());
+ EXPECT_TRUE(listener->finishSections.empty());
+ EXPECT_EQ(0, listener->failedInvoked);
}
TEST_F(ReporterTest, RunReportWithHeaders) {
@@ -157,11 +173,11 @@
vector<uint8_t> out;
getHeaderData(header, &out);
args2.addHeader(out);
- sp<ReportRequest> r1 = new ReportRequest(args1, l, tf.fd);
- sp<ReportRequest> r2 = new ReportRequest(args2, l, tf.fd);
- reporter->batch.add(r1);
- reporter->batch.add(r2);
+ sp<WorkDirectory> workDirectory = new WorkDirectory(td.path);
+ sp<ReportBatch> batch = new ReportBatch();
+ batch->addStreamingReport(args1, listener, tf.fd);
+ sp<Reporter> reporter = new Reporter(workDirectory, batch);
ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
@@ -170,11 +186,11 @@
EXPECT_THAT(result, StrEq("\n\x2"
"\b\f"));
- EXPECT_EQ(l->startInvoked, 2);
- EXPECT_EQ(l->finishInvoked, 2);
- EXPECT_TRUE(l->startSections.empty());
- EXPECT_TRUE(l->finishSections.empty());
- EXPECT_EQ(l->failedInvoked, 0);
+ EXPECT_EQ(listener->startInvoked, 1);
+ EXPECT_EQ(listener->finishInvoked, 1);
+ EXPECT_FALSE(listener->startSections.empty());
+ EXPECT_FALSE(listener->finishSections.empty());
+ EXPECT_EQ(listener->failedInvoked, 0);
}
TEST_F(ReporterTest, RunReportToGivenDirectory) {
@@ -188,8 +204,10 @@
args.addHeader(out);
getHeaderData(header2, &out);
args.addHeader(out);
- sp<ReportRequest> r = new ReportRequest(args, l, -1);
- reporter->batch.add(r);
+
+ vector<sp<ReportRequest>> requests;
+ requests.push_back(new ReportRequest(args, listener, -1));
+ sp<Reporter> reporter = new Reporter(requests, td.path);
ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
vector<string> results = InspectFiles();
@@ -204,14 +222,36 @@
TEST_F(ReporterTest, ReportMetadata) {
IncidentReportArgs args;
args.addSection(1);
- args.setDest(android::os::DEST_EXPLICIT);
- sp<ReportRequest> r = new ReportRequest(args, l, -1);
- reporter->batch.add(r);
+ args.setPrivacyPolicy(android::os::PRIVACY_POLICY_EXPLICIT);
+ vector<sp<ReportRequest>> requests;
+ requests.push_back(new ReportRequest(args, listener, -1));
+ sp<Reporter> reporter = new Reporter(requests, td.path);
ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
- IncidentMetadata metadata = reporter->batch.metadata();
+ IncidentMetadata metadata = reporter->metadata();
EXPECT_EQ(IncidentMetadata_Destination_EXPLICIT, metadata.dest());
EXPECT_EQ(1, metadata.request_size());
EXPECT_TRUE(metadata.use_dropbox());
EXPECT_EQ(0, metadata.sections_size());
}
+
+TEST_F(ReporterTest, RunReportLocal_1_2) {
+ IncidentReportArgs args;
+ args.addSection(1);
+ args.addSection(2);
+ args.setPrivacyPolicy(android::os::PRIVACY_POLICY_LOCAL);
+
+ vector<sp<ReportRequest>> requests;
+ requests.push_back(new ReportRequest(args, listener, -1));
+ sp<Reporter> reporter = new Reporter(requests, td.path);
+
+ ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
+
+ EXPECT_EQ(1, listener->sectionStarted(1));
+ EXPECT_EQ(1, listener->sectionFinished(1));
+ EXPECT_EQ(1, listener->sectionStarted(2));
+ EXPECT_EQ(1, listener->sectionFinished(2));
+
+ // TODO: validate that a file was created in the directory
+}
+*/
diff --git a/cmds/incidentd/tests/Section_test.cpp b/cmds/incidentd/tests/Section_test.cpp
index 24454ed..858f7d0 100644
--- a/cmds/incidentd/tests/Section_test.cpp
+++ b/cmds/incidentd/tests/Section_test.cpp
@@ -20,7 +20,8 @@
#include <android-base/test_utils.h>
#include <android/os/IncidentReportArgs.h>
#include <android/util/protobuf.h>
-#include <frameworks/base/libs/incident/proto/android/os/header.pb.h>
+#include <frameworks/base/core/proto/android/os/incident.pb.h>
+#include <frameworks/base/core/proto/android/os/header.pb.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <string.h>
@@ -62,7 +63,6 @@
protected:
TemporaryFile tf;
- ReportRequestSet requests;
const std::string kTestPath = GetExecutableDirectory();
const std::string kTestDataPath = kTestPath + "/testdata/";
@@ -74,7 +74,8 @@
virtual ~SimpleListener(){};
virtual Status onReportStarted() { return Status::ok(); };
- virtual Status onReportSectionStatus(int /*section*/, int /*status*/) { return Status::ok(); };
+ virtual Status onReportSectionStatus(int /*section*/, int /*status*/)
+ { return Status::ok(); };
virtual Status onReportFinished() { return Status::ok(); };
virtual Status onReportFailed() { return Status::ok(); };
@@ -82,67 +83,30 @@
virtual IBinder* onAsBinder() override { return nullptr; };
};
-namespace {
-void getHeaderData(const IncidentHeaderProto& headerProto, vector<uint8_t>* out) {
- out->clear();
- auto serialized = headerProto.SerializeAsString();
- if (serialized.empty()) return;
- out->resize(serialized.length());
- std::copy(serialized.begin(), serialized.end(), out->begin());
-}
-}
-
-TEST_F(SectionTest, HeaderSection) {
- HeaderSection hs;
-
- IncidentReportArgs args1, args2;
- args1.addSection(1);
- args1.addSection(2);
- args2.setAll(true);
-
- IncidentHeaderProto head1, head2;
- head1.set_reason("axe");
- head2.set_reason("pup");
-
- vector<uint8_t> out;
- getHeaderData(head1, &out);
- args1.addHeader(out);
-
- getHeaderData(head2, &out);
- args1.addHeader(out);
-
- getHeaderData(head2, &out);
- args2.addHeader(out);
-
- requests.add(new ReportRequest(args1, new SimpleListener(), -1));
- requests.add(new ReportRequest(args2, new SimpleListener(), tf.fd));
- requests.setMainFd(STDOUT_FILENO);
-
- std::string content;
- CaptureStdout();
- ASSERT_EQ(NO_ERROR, hs.Execute(&requests));
- EXPECT_THAT(GetCapturedStdout(), StrEq("\n\x5"
- "\x12\x3"
- "axe\n\x05\x12\x03pup"));
-
- EXPECT_TRUE(ReadFileToString(tf.path, &content));
- EXPECT_THAT(content, StrEq("\n\x05\x12\x03pup"));
-}
-
+/*
TEST_F(SectionTest, MetadataSection) {
MetadataSection ms;
- const std::string testFile = kTestDataPath + "metadata.txt";
- std::string expect;
- ASSERT_TRUE(ReadFileToString(testFile, &expect));
- requests.setMainFd(STDOUT_FILENO);
- requests.setMainDest(android::os::DEST_LOCAL);
- requests.sectionStats(1)->set_success(true);
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
+
+ requestSet.setMainPrivacyPolicy(android::os::PRIVACY_POLICY_LOCAL);
+ requestSet.editSectionStats(1)->set_success(true);
CaptureStdout();
- ASSERT_EQ(NO_ERROR, ms.Execute(&requests));
- // Notice message_lite.h ParseFromString doesn't work so we just match the bytes directly.
- EXPECT_THAT(GetCapturedStdout(), StrEq(expect));
+ ASSERT_EQ(NO_ERROR, ms.Execute(&requestSet));
+
+ string out = GetCapturedStdout();
+ IncidentProto expectedIncident;
+ expectedIncident.ParseFromArray(out.data(), out.size());
+ ASSERT_TRUE(expectedIncident.has_metadata());
+ const IncidentMetadata& expectedMetadata = expectedIncident.metadata();
+ ASSERT_EQ(IncidentMetadata::LOCAL, expectedMetadata.dest());
+ ASSERT_EQ(1, expectedMetadata.sections_size());
+ ASSERT_EQ(1, expectedMetadata.sections(0).id());
+ ASSERT_TRUE(expectedMetadata.sections(0).has_success());
+ ASSERT_TRUE(expectedMetadata.sections(0).success());
}
TEST_F(SectionTest, FileSection) {
@@ -150,27 +114,35 @@
ASSERT_TRUE(WriteStringToFile("iamtestdata", tf.path));
- requests.setMainFd(STDOUT_FILENO);
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
CaptureStdout();
- ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
// The input string is reversed in incident helper
// The length is 11, in 128Varint it is "0000 1011" -> \v
EXPECT_THAT(GetCapturedStdout(), StrEq("\xa\vatadtsetmai"));
}
TEST_F(SectionTest, FileSectionNotExist) {
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+
FileSection fs1(NOOP_PARSER, "notexist", QUICK_TIMEOUT_MS);
- ASSERT_EQ(NO_ERROR, fs1.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, fs1.Execute(&requestSet));
FileSection fs2(NOOP_PARSER, "notexist", QUICK_TIMEOUT_MS);
- ASSERT_EQ(NO_ERROR, fs2.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, fs2.Execute(&requestSet));
}
TEST_F(SectionTest, FileSectionTimeout) {
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+
FileSection fs(TIMEOUT_PARSER, tf.path, QUICK_TIMEOUT_MS);
- ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
- ASSERT_TRUE(requests.sectionStats(TIMEOUT_PARSER)->timed_out());
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
+ ASSERT_TRUE(requestSet.getSectionStats(TIMEOUT_PARSER)->timed_out());
}
TEST_F(SectionTest, GZipSection) {
@@ -178,10 +150,12 @@
const std::string testGzFile = testFile + ".gz";
GZipSection gs(NOOP_PARSER, "/tmp/nonexist", testFile.c_str(), NULL);
- requests.setMainFd(tf.fd);
- requests.setMainDest(android::os::DEST_LOCAL);
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(tf.fd);
+ requestSet.setMainPrivacyPolicy(android::os::PRIVACY_POLICY_LOCAL);
- ASSERT_EQ(NO_ERROR, gs.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, gs.Execute(&requestSet));
std::string expected, gzFile, actual;
ASSERT_TRUE(ReadFileToString(testGzFile, &gzFile));
ASSERT_TRUE(ReadFileToString(tf.path, &actual));
@@ -200,8 +174,10 @@
TEST_F(SectionTest, GZipSectionNoFileFound) {
GZipSection gs(NOOP_PARSER, "/tmp/nonexist1", "/tmp/nonexist2", NULL);
- requests.setMainFd(STDOUT_FILENO);
- ASSERT_EQ(NO_ERROR, gs.Execute(&requests));
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
+ ASSERT_EQ(NO_ERROR, gs.Execute(&requestSet));
}
TEST_F(SectionTest, CommandSectionConstructor) {
@@ -220,51 +196,65 @@
TEST_F(SectionTest, CommandSectionEcho) {
CommandSection cs(REVERSE_PARSER, "/system/bin/echo", "about", NULL);
- requests.setMainFd(STDOUT_FILENO);
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
CaptureStdout();
- ASSERT_EQ(NO_ERROR, cs.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, cs.Execute(&requestSet));
EXPECT_THAT(GetCapturedStdout(), StrEq("\xa\x06\ntuoba"));
}
TEST_F(SectionTest, CommandSectionCommandTimeout) {
CommandSection cs(NOOP_PARSER, QUICK_TIMEOUT_MS, "/system/bin/yes", NULL);
- ASSERT_EQ(NO_ERROR, cs.Execute(&requests));
- ASSERT_TRUE(requests.sectionStats(NOOP_PARSER)->timed_out());
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ ASSERT_EQ(NO_ERROR, cs.Execute(&requestSet));
+ ASSERT_TRUE(requestSet.getSectionStats(NOOP_PARSER)->timed_out());
}
TEST_F(SectionTest, CommandSectionIncidentHelperTimeout) {
CommandSection cs(TIMEOUT_PARSER, QUICK_TIMEOUT_MS, "/system/bin/echo", "about", NULL);
- requests.setMainFd(STDOUT_FILENO);
- ASSERT_EQ(NO_ERROR, cs.Execute(&requests));
- ASSERT_TRUE(requests.sectionStats(TIMEOUT_PARSER)->timed_out());
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
+ ASSERT_EQ(NO_ERROR, cs.Execute(&requestSet));
+ ASSERT_TRUE(requestSet.getSectionStats(TIMEOUT_PARSER)->timed_out());
}
TEST_F(SectionTest, CommandSectionBadCommand) {
CommandSection cs(NOOP_PARSER, "echoo", "about", NULL);
- ASSERT_EQ(NAME_NOT_FOUND, cs.Execute(&requests));
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ ASSERT_EQ(NAME_NOT_FOUND, cs.Execute(&requestSet));
}
TEST_F(SectionTest, CommandSectionBadCommandAndTimeout) {
CommandSection cs(TIMEOUT_PARSER, QUICK_TIMEOUT_MS, "nonexistcommand", "-opt", NULL);
// timeout will return first
- ASSERT_EQ(NO_ERROR, cs.Execute(&requests));
- ASSERT_TRUE(requests.sectionStats(TIMEOUT_PARSER)->timed_out());
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ ASSERT_EQ(NO_ERROR, cs.Execute(&requestSet));
+ ASSERT_TRUE(requestSet.getSectionStats(TIMEOUT_PARSER)->timed_out());
}
TEST_F(SectionTest, LogSectionBinary) {
LogSection ls(1, LOG_ID_EVENTS);
- requests.setMainFd(STDOUT_FILENO);
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
CaptureStdout();
- ASSERT_EQ(NO_ERROR, ls.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, ls.Execute(&requestSet));
std::string results = GetCapturedStdout();
EXPECT_FALSE(results.empty());
}
TEST_F(SectionTest, LogSectionSystem) {
LogSection ls(1, LOG_ID_SYSTEM);
- requests.setMainFd(STDOUT_FILENO);
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
CaptureStdout();
- ASSERT_EQ(NO_ERROR, ls.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, ls.Execute(&requestSet));
std::string results = GetCapturedStdout();
EXPECT_FALSE(results.empty());
}
@@ -274,10 +264,12 @@
ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, tf.path));
- requests.setMainFd(STDOUT_FILENO);
+ vector<sp<ReportRequest>> requests;
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
CaptureStdout();
- ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
}
@@ -287,13 +279,16 @@
IncidentReportArgs args;
args.setAll(true);
- args.setDest(0);
+ args.setPrivacyPolicy(0);
sp<ReportRequest> badFdRequest = new ReportRequest(args, new SimpleListener(), 1234567);
- requests.add(badFdRequest);
- requests.setMainFd(STDOUT_FILENO);
+
+ vector<sp<ReportRequest>> requests;
+ requests.push_back(badFdRequest);
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
CaptureStdout();
- ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
EXPECT_EQ(badFdRequest->err, -EBADF);
}
@@ -304,9 +299,13 @@
IncidentReportArgs args;
args.setAll(true);
- args.setDest(0);
- requests.add(new ReportRequest(args, new SimpleListener(), -1));
- EXPECT_EQ(fs.Execute(&requests), -EBADF);
+ args.setPrivacyPolicy(0);
+
+ vector<sp<ReportRequest>> requests;
+ requests.push_back(new ReportRequest(args, new SimpleListener(), -1));
+ ReportRequestSet requestSet(requests);
+
+ EXPECT_EQ(fs.Execute(&requestSet), -EBADF);
}
TEST_F(SectionTest, TestMultipleRequests) {
@@ -320,17 +319,20 @@
IncidentReportArgs args1, args2, args3;
args1.setAll(true);
- args1.setDest(android::os::DEST_LOCAL);
+ args1.setPrivacyPolicy(android::os::PRIVACY_POLICY_LOCAL);
args2.setAll(true);
- args2.setDest(android::os::DEST_EXPLICIT);
+ args2.setPrivacyPolicy(android::os::PRIVACY_POLICY_EXPLICIT);
sp<SimpleListener> l = new SimpleListener();
- requests.add(new ReportRequest(args1, l, output1.fd));
- requests.add(new ReportRequest(args2, l, output2.fd));
- requests.add(new ReportRequest(args3, l, output3.fd));
- requests.setMainFd(STDOUT_FILENO);
+
+ vector<sp<ReportRequest>> requests;
+ requests.push_back(new ReportRequest(args1, l, output1.fd));
+ requests.push_back(new ReportRequest(args2, l, output2.fd));
+ requests.push_back(new ReportRequest(args3, l, output3.fd));
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
CaptureStdout();
- ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
std::string content, expect;
@@ -361,18 +363,21 @@
IncidentReportArgs args1, args2, args3;
args1.setAll(true);
- args1.setDest(android::os::DEST_EXPLICIT);
+ args1.setPrivacyPolicy(android::os::PRIVACY_POLICY_EXPLICIT);
args2.setAll(true);
- args2.setDest(android::os::DEST_EXPLICIT);
+ args2.setPrivacyPolicy(android::os::PRIVACY_POLICY_EXPLICIT);
args3.setAll(true);
sp<SimpleListener> l = new SimpleListener();
- requests.add(new ReportRequest(args1, l, output1.fd));
- requests.add(new ReportRequest(args2, l, output2.fd));
- requests.add(new ReportRequest(args3, l, output3.fd));
- requests.setMainFd(STDOUT_FILENO);
+
+ vector<sp<ReportRequest>> requests;
+ requests.push_back(new ReportRequest(args1, l, output1.fd));
+ requests.push_back(new ReportRequest(args2, l, output2.fd));
+ requests.push_back(new ReportRequest(args3, l, output3.fd));
+ ReportRequestSet requestSet(requests);
+ requestSet.setMainFd(STDOUT_FILENO);
CaptureStdout();
- ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
+ ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
std::string content, expect;
@@ -390,3 +395,4 @@
EXPECT_TRUE(ReadFileToString(output3.path, &content));
EXPECT_THAT(content, StrEq(string("\x02") + c + STRING_FIELD_2));
}
+*/
diff --git a/cmds/incidentd/tests/section_list.cpp b/cmds/incidentd/tests/section_list.cpp
index 1d7f2b6..3a45af0 100644
--- a/cmds/incidentd/tests/section_list.cpp
+++ b/cmds/incidentd/tests/section_list.cpp
@@ -1,19 +1,65 @@
// This file is a dummy section_list.cpp used for test only.
#include "section_list.h"
+#include "frameworks/base/cmds/incidentd/tests/test_proto.pb.h"
+
+
namespace android {
namespace os {
namespace incidentd {
-const Section* SECTION_LIST[] = {NULL};
+class TestSection: public Section {
+public:
+ TestSection(int id);
+ ~TestSection();
+ virtual status_t Execute(ReportWriter* writer) const;
+};
-Privacy sub_field_1{1, 1, NULL, DEST_LOCAL, NULL};
-Privacy sub_field_2{2, 9, NULL, DEST_AUTOMATIC, NULL};
+TestSection::TestSection(int id)
+ :Section(id, 5000 /* ms timeout */) {
+}
+
+TestSection::~TestSection() {
+}
+
+status_t TestSection::Execute(ReportWriter* writer) const {
+ uint8_t buf[1024];
+ status_t err;
+
+ TestSectionProto proto;
+ proto.set_field_1(this->id);
+ proto.set_field_2(this->id * 10);
+
+ // Not infinitely scalable, but we know that our TestSectionProto will always
+ // fit in this many bytes.
+ if (!proto.SerializeToArray(buf, sizeof(buf))) {
+ return -1;
+ }
+ FdBuffer buffer;
+ err = buffer.write(buf, proto.ByteSize());
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ return writer->writeSection(buffer);
+}
+
+TestSection section1(1);
+TestSection section2(2);
+
+const Section* SECTION_LIST[] = {
+ §ion1,
+ §ion2,
+ NULL
+};
+
+Privacy sub_field_1{1, 1, NULL, PRIVACY_POLICY_LOCAL, NULL};
+Privacy sub_field_2{2, 9, NULL, PRIVACY_POLICY_AUTOMATIC, NULL};
Privacy* list[] = {&sub_field_1, &sub_field_2, NULL};
-Privacy field_0{0, 11, list, DEST_EXPLICIT, NULL};
-Privacy field_1{1, 9, NULL, DEST_AUTOMATIC, NULL};
+Privacy field_0{0, 11, list, PRIVACY_POLICY_EXPLICIT, NULL};
+Privacy field_1{1, 9, NULL, PRIVACY_POLICY_AUTOMATIC, NULL};
Privacy* final_list[] = {&field_0, &field_1};
@@ -23,4 +69,4 @@
} // namespace incidentd
} // namespace os
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/services/net/java/android/net/ApfCapabilitiesParcelable.aidl b/cmds/incidentd/tests/test_proto.proto
similarity index 63%
copy from services/net/java/android/net/ApfCapabilitiesParcelable.aidl
copy to cmds/incidentd/tests/test_proto.proto
index f0645d2..f57070b 100644
--- a/services/net/java/android/net/ApfCapabilitiesParcelable.aidl
+++ b/cmds/incidentd/tests/test_proto.proto
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2017 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.
@@ -14,10 +14,15 @@
* limitations under the License.
*/
-package android.net;
+syntax = "proto2";
-parcelable ApfCapabilitiesParcelable {
- int apfVersionSupported;
- int maximumApfProgramSize;
- int apfPacketFormat;
-}
\ No newline at end of file
+package android.os.incidentd;
+
+message TestSectionProto {
+ // The id of the section, written by TestSection.
+ optional int32 field_1 = 1;
+
+ // The id of the section, times 10, written by TestSection.
+ optional int32 field_2 = 2;
+}
+
diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp
index ce07d6d..8cd409e 100644
--- a/cmds/statsd/Android.bp
+++ b/cmds/statsd/Android.bp
@@ -118,6 +118,7 @@
static_libs: [
"libhealthhalutils",
+ "libplatformprotos",
],
shared_libs: [
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index a6699e7..286e76e 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -407,12 +407,12 @@
outData->clear();
outData->resize(proto.size());
size_t pos = 0;
- auto iter = proto.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&((*outData)[pos]), iter.readBuffer(), toRead);
+ sp<android::util::ProtoReader> reader = proto.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&((*outData)[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
}
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index f78ae38..52ecdc8 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -50,6 +50,7 @@
using android::util::FIELD_COUNT_REPEATED;
using android::util::FIELD_TYPE_INT64;
using android::util::FIELD_TYPE_MESSAGE;
+using android::util::ProtoReader;
namespace android {
namespace os {
@@ -1220,12 +1221,12 @@
experimentIdsProtoBuffer.resize(proto.size());
size_t pos = 0;
- auto iter = proto.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&(experimentIdsProtoBuffer[pos]), iter.readBuffer(), toRead);
+ sp<ProtoReader> reader = proto.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&(experimentIdsProtoBuffer[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
}
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index c2b81e4..5528c33 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -257,7 +257,7 @@
}
// Pulled events will start at field 10000.
- // Next: 10057
+ // Next: 10058
oneof pulled {
WifiBytesTransfer wifi_bytes_transfer = 10000;
WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001;
@@ -316,6 +316,7 @@
GpuStatsGlobalInfo gpu_stats_global_info = 10054;
GpuStatsAppInfo gpu_stats_app_info = 10055;
SystemIonHeapSize system_ion_heap_size = 10056;
+ AppsOnExternalStorageInfo apps_on_external_storage_info = 10057;
}
// DO NOT USE field numbers above 100,000 in AOSP.
@@ -5556,6 +5557,9 @@
// Normalized screen position of the bubble stack. The range is between 0 and 1.
optional float normalized_x_position = 7;
optional float normalized_y_position = 8;
+
+ // Whether the bubble is unread. If it is unread, a dot is shown in the bubble stack icon.
+ optional bool is_unread = 9;
}
/**
@@ -5866,3 +5870,15 @@
optional int32 eventId = 1;
optional android.stats.connectivity.NetworkStackEventData network_stack_event = 2 [(log_mode) = MODE_BYTES];
}
+
+/**
+ * Logs the apps that are installed on the external storage.
+ * Pulled from:
+ * StatsCompanionService
+ */
+message AppsOnExternalStorageInfo {
+ // The type of the external storage.
+ optional android.stats.storage.ExternalStorageType external_storage_type = 1;
+ // The name of the package that is installed on the external storage.
+ optional string package_name = 2;
+}
diff --git a/cmds/statsd/src/external/GpuStatsPuller.cpp b/cmds/statsd/src/external/GpuStatsPuller.cpp
index 130bd85..3fa932f 100644
--- a/cmds/statsd/src/external/GpuStatsPuller.cpp
+++ b/cmds/statsd/src/external/GpuStatsPuller.cpp
@@ -29,6 +29,8 @@
namespace os {
namespace statsd {
+using android::util::ProtoReader;
+
GpuStatsPuller::GpuStatsPuller(const int tagId) : StatsPuller(tagId) {
}
@@ -116,11 +118,11 @@
if (!proto.size()) return "";
std::string byteString;
- auto iter = proto.data();
- while (iter.readBuffer() != nullptr) {
- const size_t toRead = iter.currentToRead();
- byteString.append((char*)iter.readBuffer(), toRead);
- iter.rp()->move(toRead);
+ sp<ProtoReader> reader = proto.data();
+ while (reader->readBuffer() != nullptr) {
+ const size_t toRead = reader->currentToRead();
+ byteString.append((char*)reader->readBuffer(), toRead);
+ reader->move(toRead);
}
if (byteString.size() != proto.size()) return "";
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index 2abfc24..13eee5d 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -251,6 +251,9 @@
// GpuStatsAppInfo
{android::util::GPU_STATS_APP_INFO,
{.puller = new GpuStatsPuller(android::util::GPU_STATS_APP_INFO)}},
+ // AppsOnExternalStorageInfo
+ {android::util::APPS_ON_EXTERNAL_STORAGE_INFO,
+ {.puller = new StatsCompanionServicePuller(android::util::APPS_ON_EXTERNAL_STORAGE_INFO)}},
};
StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) {
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index 9a00637..29100aa 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -60,6 +60,9 @@
const int FIELD_ID_LOG_LOSS_STATS_TIME = 1;
const int FIELD_ID_LOG_LOSS_STATS_COUNT = 2;
const int FIELD_ID_LOG_LOSS_STATS_ERROR = 3;
+const int FIELD_ID_LOG_LOSS_STATS_TAG = 4;
+const int FIELD_ID_LOG_LOSS_STATS_UID = 5;
+const int FIELD_ID_LOG_LOSS_STATS_PID = 6;
const int FIELD_ID_CONFIG_STATS_UID = 1;
const int FIELD_ID_CONFIG_STATS_ID = 2;
@@ -183,12 +186,13 @@
noteConfigResetInternalLocked(key);
}
-void StatsdStats::noteLogLost(int32_t wallClockTimeSec, int32_t count, int32_t lastError) {
+void StatsdStats::noteLogLost(int32_t wallClockTimeSec, int32_t count, int32_t lastError,
+ int32_t lastTag, int32_t uid, int32_t pid) {
lock_guard<std::mutex> lock(mLock);
if (mLogLossStats.size() == kMaxLoggerErrors) {
mLogLossStats.pop_front();
}
- mLogLossStats.emplace_back(wallClockTimeSec, count, lastError);
+ mLogLossStats.emplace_back(wallClockTimeSec, count, lastError, lastTag, uid, pid);
}
void StatsdStats::noteBroadcastSent(const ConfigKey& key) {
@@ -716,8 +720,11 @@
}
for (const auto& loss : mLogLossStats) {
- dprintf(out, "Log loss: %lld (wall clock sec) - %d (count) %d (last error)\n",
- (long long)loss.mWallClockSec, loss.mCount, loss.mLastError);
+ dprintf(out,
+ "Log loss: %lld (wall clock sec) - %d (count), %d (last error), %d (last tag), %d "
+ "(uid), %d (pid)\n",
+ (long long)loss.mWallClockSec, loss.mCount, loss.mLastError, loss.mLastTag,
+ loss.mUid, loss.mPid);
}
}
@@ -891,6 +898,9 @@
proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOG_LOSS_STATS_TIME, error.mWallClockSec);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOG_LOSS_STATS_COUNT, error.mCount);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOG_LOSS_STATS_ERROR, error.mLastError);
+ proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOG_LOSS_STATS_TAG, error.mLastTag);
+ proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOG_LOSS_STATS_UID, error.mUid);
+ proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOG_LOSS_STATS_PID, error.mPid);
proto.end(token);
}
@@ -904,12 +914,12 @@
output->resize(bufferSize);
size_t pos = 0;
- auto it = proto.data();
- while (it.readBuffer() != NULL) {
- size_t toRead = it.currentToRead();
- std::memcpy(&((*output)[pos]), it.readBuffer(), toRead);
+ sp<android::util::ProtoReader> reader = proto.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&((*output)[pos]), reader->readBuffer(), toRead);
pos += toRead;
- it.rp()->move(toRead);
+ reader->move(toRead);
}
if (reset) {
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index 7c2d846..434920e 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -336,7 +336,8 @@
/**
* Records statsd skipped an event.
*/
- void noteLogLost(int32_t wallClockTimeSec, int32_t count, int lastError);
+ void noteLogLost(int32_t wallClockTimeSec, int32_t count, int32_t lastError,
+ int32_t lastAtomTag, int32_t uid, int32_t pid);
/**
* Records that the pull of an atom has failed
@@ -503,13 +504,22 @@
std::map<int64_t, AtomMetricStats> mAtomMetricStats;
struct LogLossStats {
- LogLossStats(int32_t sec, int32_t count, int32_t error)
- : mWallClockSec(sec), mCount(count), mLastError(error) {
+ LogLossStats(int32_t sec, int32_t count, int32_t error, int32_t tag, int32_t uid,
+ int32_t pid)
+ : mWallClockSec(sec),
+ mCount(count),
+ mLastError(error),
+ mLastTag(tag),
+ mUid(uid),
+ mPid(pid) {
}
int32_t mWallClockSec;
int32_t mCount;
// error code defined in linux/errno.h
int32_t mLastError;
+ int32_t mLastTag;
+ int32_t mUid;
+ int32_t mPid;
};
// Timestamps when we detect log loss, and the number of logs lost.
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp
index 5435c84..69816cb 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp
@@ -90,12 +90,12 @@
std::unique_ptr<std::vector<uint8_t>> buffer(new std::vector<uint8_t>(bufferSize));
size_t pos = 0;
- auto it = protoOutput.data();
- while (it.readBuffer() != NULL) {
- size_t toRead = it.currentToRead();
- std::memcpy(&((*buffer)[pos]), it.readBuffer(), toRead);
+ sp<android::util::ProtoReader> reader = protoOutput.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&((*buffer)[pos]), reader->readBuffer(), toRead);
pos += toRead;
- it.rp()->move(toRead);
+ reader->move(toRead);
}
return buffer;
diff --git a/cmds/statsd/src/socket/StatsSocketListener.cpp b/cmds/statsd/src/socket/StatsSocketListener.cpp
index 6bb8cda..aed926d 100755
--- a/cmds/statsd/src/socket/StatsSocketListener.cpp
+++ b/cmds/statsd/src/socket/StatsSocketListener.cpp
@@ -106,13 +106,21 @@
// Note that all normal stats logs are in the format of event_list, so there won't be confusion.
//
// TODO(b/80538532): In addition to log it in StatsdStats, we should properly reset the config.
- if (n == sizeof(android_log_event_int_t)) {
- android_log_event_int_t* int_event = reinterpret_cast<android_log_event_int_t*>(ptr);
- if (int_event->payload.type == EVENT_TYPE_INT) {
- ALOGE("Found dropped events: %d error %d", int_event->payload.data,
- int_event->header.tag);
- StatsdStats::getInstance().noteLogLost((int32_t)getWallClockSec(),
- int_event->payload.data, int_event->header.tag);
+ if (n == sizeof(android_log_event_long_t)) {
+ android_log_event_long_t* long_event = reinterpret_cast<android_log_event_long_t*>(ptr);
+ if (long_event->payload.type == EVENT_TYPE_LONG) {
+ int64_t composed_long = long_event->payload.data;
+
+ // format:
+ // |last_tag|dropped_count|
+ int32_t dropped_count = (int32_t)(0xffffffff & composed_long);
+ int32_t last_atom_tag = (int32_t)((0xffffffff00000000 & (uint64_t)composed_long) >> 32);
+
+ ALOGE("Found dropped events: %d error %d last atom tag %d from uid %d", dropped_count,
+ long_event->header.tag, last_atom_tag, cred->uid);
+ StatsdStats::getInstance().noteLogLost((int32_t)getWallClockSec(), dropped_count,
+ long_event->header.tag, last_atom_tag, cred->uid,
+ cred->pid);
return true;
}
}
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index 166e087..967c3525 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -455,6 +455,9 @@
optional int32 detected_time_sec = 1;
optional int32 count = 2;
optional int32 last_error = 3;
+ optional int32 last_tag = 4;
+ optional int32 uid = 5;
+ optional int32 pid = 6;
}
repeated LogLossStats detected_log_loss = 16;
}
diff --git a/cmds/statsd/src/stats_log_util.h b/cmds/statsd/src/stats_log_util.h
index 59d4865..cdef874 100644
--- a/cmds/statsd/src/stats_log_util.h
+++ b/cmds/statsd/src/stats_log_util.h
@@ -80,11 +80,11 @@
template<class T>
bool parseProtoOutputStream(util::ProtoOutputStream& protoOutput, T* message) {
std::string pbBytes;
- auto iter = protoOutput.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- pbBytes.append(reinterpret_cast<const char*>(iter.readBuffer()), toRead);
- iter.rp()->move(toRead);
+ sp<android::util::ProtoReader> reader = protoOutput.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ pbBytes.append(reinterpret_cast<const char*>(reader->readBuffer()), toRead);
+ reader->move(toRead);
}
return message->ParseFromArray(pbBytes.c_str(), pbBytes.size());
}
diff --git a/cmds/statsd/src/subscriber/IncidentdReporter.cpp b/cmds/statsd/src/subscriber/IncidentdReporter.cpp
index 7c2d242..ff1cb4f 100644
--- a/cmds/statsd/src/subscriber/IncidentdReporter.cpp
+++ b/cmds/statsd/src/subscriber/IncidentdReporter.cpp
@@ -120,12 +120,12 @@
protoData->resize(headerProto.size());
size_t pos = 0;
- auto iter = headerProto.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&((*protoData)[pos]), iter.readBuffer(), toRead);
+ sp<android::util::ProtoReader> reader = headerProto.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&((*protoData)[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
}
} // namespace
@@ -152,15 +152,15 @@
uint8_t dest;
switch (config.dest()) {
case IncidentdDetails_Destination_AUTOMATIC:
- dest = android::os::DEST_AUTOMATIC;
+ dest = android::os::PRIVACY_POLICY_AUTOMATIC;
break;
case IncidentdDetails_Destination_EXPLICIT:
- dest = android::os::DEST_EXPLICIT;
+ dest = android::os::PRIVACY_POLICY_EXPLICIT;
break;
default:
- dest = android::os::DEST_AUTOMATIC;
+ dest = android::os::PRIVACY_POLICY_AUTOMATIC;
}
- incidentReport.setDest(dest);
+ incidentReport.setPrivacyPolicy(dest);
incidentReport.setReceiverPkg(config.receiver_pkg());
diff --git a/cmds/statsd/tests/FieldValue_test.cpp b/cmds/statsd/tests/FieldValue_test.cpp
index a9305ac..f1cad92 100644
--- a/cmds/statsd/tests/FieldValue_test.cpp
+++ b/cmds/statsd/tests/FieldValue_test.cpp
@@ -24,6 +24,8 @@
#ifdef __ANDROID__
+using android::util::ProtoReader;
+
namespace android {
namespace os {
namespace statsd {
@@ -252,12 +254,12 @@
vector<uint8_t> outData;
outData.resize(protoOut.size());
size_t pos = 0;
- auto iter = protoOut.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&(outData[pos]), iter.readBuffer(), toRead);
+ sp<ProtoReader> reader = protoOut.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
DimensionsValue result;
@@ -343,12 +345,12 @@
vector<uint8_t> outData;
outData.resize(protoOut.size());
size_t pos = 0;
- auto iter = protoOut.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&(outData[pos]), iter.readBuffer(), toRead);
+ sp<ProtoReader> reader = protoOut.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
DimensionsValue result;
@@ -405,12 +407,12 @@
vector<uint8_t> outData;
outData.resize(protoOut.size());
size_t pos = 0;
- auto iter = protoOut.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&(outData[pos]), iter.readBuffer(), toRead);
+ sp<ProtoReader> reader = protoOut.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
DimensionsValueTuple result;
@@ -458,12 +460,12 @@
vector<uint8_t> outData;
outData.resize(protoOutput.size());
size_t pos = 0;
- auto iter = protoOutput.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&(outData[pos]), iter.readBuffer(), toRead);
+ sp<ProtoReader> reader = protoOutput.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
Atom result;
diff --git a/cmds/statsd/tests/LogEvent_test.cpp b/cmds/statsd/tests/LogEvent_test.cpp
index eec3c73..b03517e 100644
--- a/cmds/statsd/tests/LogEvent_test.cpp
+++ b/cmds/statsd/tests/LogEvent_test.cpp
@@ -26,6 +26,7 @@
using std::string;
using util::ProtoOutputStream;
+using util::ProtoReader;
TEST(LogEventTest, TestLogParsing) {
LogEvent event1(1, 2000);
@@ -590,12 +591,12 @@
std::vector<uint8_t> outData;
outData.resize(proto.size());
size_t pos = 0;
- auto iter = proto.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&(outData[pos]), iter.readBuffer(), toRead);
+ sp<ProtoReader> reader = proto.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
std::string result_str(outData.begin(), outData.end());
@@ -629,12 +630,12 @@
std::vector<uint8_t> outData;
outData.resize(proto.size());
size_t pos = 0;
- auto iter = proto.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&(outData[pos]), iter.readBuffer(), toRead);
+ sp<ProtoReader> reader = proto.data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
std::string result_str(outData.begin(), outData.end());
diff --git a/cmds/statsd/tests/UidMap_test.cpp b/cmds/statsd/tests/UidMap_test.cpp
index c04a40c..d9fa4e9 100644
--- a/cmds/statsd/tests/UidMap_test.cpp
+++ b/cmds/statsd/tests/UidMap_test.cpp
@@ -33,6 +33,7 @@
namespace statsd {
using android::util::ProtoOutputStream;
+using android::util::ProtoReader;
#ifdef __ANDROID__
const string kApp1 = "app1.sharing.1";
@@ -179,12 +180,12 @@
vector<uint8_t> bytes;
bytes.resize(proto->size());
size_t pos = 0;
- auto iter = proto->data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&((bytes)[pos]), iter.readBuffer(), toRead);
+ sp<ProtoReader> reader = proto->data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&((bytes)[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
results->ParseFromArray(bytes.data(), bytes.size());
}
diff --git a/cmds/statsd/tests/external/IncidentReportArgs_test.cpp b/cmds/statsd/tests/external/IncidentReportArgs_test.cpp
index c170b12..38bc194 100644
--- a/cmds/statsd/tests/external/IncidentReportArgs_test.cpp
+++ b/cmds/statsd/tests/external/IncidentReportArgs_test.cpp
@@ -36,7 +36,7 @@
args.addHeader(header1);
args.addHeader(header2);
- args.setDest(1);
+ args.setPrivacyPolicy(1);
args.setReceiverPkg("com.android.os");
args.setReceiverCls("com.android.os.Receiver");
@@ -56,10 +56,10 @@
sections.insert(1000);
sections.insert(1001);
EXPECT_EQ(sections, args2.sections());
- EXPECT_EQ(1, args2.dest());
+ EXPECT_EQ(1, args2.getPrivacyPolicy());
- EXPECT_EQ(String16("com.android.os"), args2.receiverPkg());
- EXPECT_EQ(String16("com.android.os.Receiver"), args2.receiverCls());
+ EXPECT_EQ(string("com.android.os"), args2.receiverPkg());
+ EXPECT_EQ(string("com.android.os.Receiver"), args2.receiverCls());
vector<vector<uint8_t>> headers;
headers.push_back(header1);
@@ -69,4 +69,4 @@
} // namespace statsd
} // namespace os
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index 90b9e81..afa05a9 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -26,6 +26,7 @@
using namespace testing;
using android::sp;
+using android::util::ProtoReader;
using std::make_shared;
using std::set;
using std::shared_ptr;
@@ -2730,12 +2731,12 @@
vector<uint8_t> bytes;
bytes.resize(proto->size());
size_t pos = 0;
- auto iter = proto->data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&((bytes)[pos]), iter.readBuffer(), toRead);
+ sp<ProtoReader> reader = proto->data();
+ while (reader->readBuffer() != NULL) {
+ size_t toRead = reader->currentToRead();
+ std::memcpy(&((bytes)[pos]), reader->readBuffer(), toRead);
pos += toRead;
- iter.rp()->move(toRead);
+ reader->move(toRead);
}
StatsLogReport report;
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 16fe7db..65f1080 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -346,6 +346,9 @@
void unregisterUserSwitchObserver(in IUserSwitchObserver observer);
int[] getRunningUserIds();
+ // Request a heap dump for the system server.
+ void requestSystemServerHeapDump();
+
// Deprecated - This method is only used by a few internal components and it will soon be
// replaced by a proper bug report API (which will be restricted to a few, pre-defined apps).
// No new code should be calling it.
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index d634aa5..5549d6b 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -16,12 +16,14 @@
package android.app;
+import static android.annotation.Dimension.DP;
import static android.graphics.drawable.Icon.TYPE_BITMAP;
import static com.android.internal.util.ContrastColorUtil.satisfiesTextContrast;
import android.annotation.ColorInt;
import android.annotation.DimenRes;
+import android.annotation.Dimension;
import android.annotation.DrawableRes;
import android.annotation.IdRes;
import android.annotation.IntDef;
@@ -8594,15 +8596,18 @@
/**
* @return the ideal height, in DPs, for the floating window that app content defined by
- * {@link #getIntent()} for this bubble.
+ * {@link #getIntent()} for this bubble. A value of 0 indicates a desired height has not
+ * been set.
*/
+ @Dimension(unit = DP)
public int getDesiredHeight() {
return mDesiredHeight;
}
/**
* @return the resId of ideal height for the floating window that app content defined by
- * {@link #getIntent()} for this bubble.
+ * {@link #getIntent()} for this bubble. A value of 0 indicates a res value has not
+ * been provided for the desired height.
*/
@DimenRes
public int getDesiredHeightResId() {
@@ -8733,7 +8738,7 @@
* be used instead.
*/
@NonNull
- public BubbleMetadata.Builder setDesiredHeight(int height) {
+ public BubbleMetadata.Builder setDesiredHeight(@Dimension(unit = DP) int height) {
mDesiredHeight = Math.max(height, 0);
mDesiredHeightResId = 0;
return this;
diff --git a/core/java/android/app/prediction/AppTarget.java b/core/java/android/app/prediction/AppTarget.java
index 826c149..ed45b2f 100644
--- a/core/java/android/app/prediction/AppTarget.java
+++ b/core/java/android/app/prediction/AppTarget.java
@@ -223,7 +223,7 @@
*/
@NonNull
public Builder setTarget(@NonNull String packageName, @NonNull UserHandle user) {
- if (mPackageName == null) {
+ if (mPackageName != null) {
throw new IllegalArgumentException("Target is already set");
}
mPackageName = Preconditions.checkNotNull(packageName);
diff --git a/core/java/android/app/usage/EventList.java b/core/java/android/app/usage/EventList.java
index aaae57e5..8c03405 100644
--- a/core/java/android/app/usage/EventList.java
+++ b/core/java/android/app/usage/EventList.java
@@ -103,4 +103,18 @@
}
return result;
}
+
+ /**
+ * Merge the {@link UsageEvents.Event events} in the given {@link EventList list} into this
+ * list while keeping the list sorted based on the event {@link
+ * UsageEvents.Event#mTimeStamp timestamps}.
+ *
+ * @param events The event list to merge
+ */
+ public void merge(EventList events) {
+ final int size = events.size();
+ for (int i = 0; i < size; i++) {
+ insert(events.get(i));
+ }
+ }
}
diff --git a/core/java/android/content/ComponentName.java b/core/java/android/content/ComponentName.java
index a5460e9..18147b5 100644
--- a/core/java/android/content/ComponentName.java
+++ b/core/java/android/content/ComponentName.java
@@ -339,6 +339,8 @@
}
public void writeToParcel(Parcel out, int flags) {
+ // WARNING: If you modify this function, also update
+ // frameworks/base/libs/services/src/content/ComponentName.cpp.
out.writeString(mPackage);
out.writeString(mClass);
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 961faa0c..b190b34 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -6916,6 +6916,7 @@
*/
@SystemApi
@TestApi
+ @Nullable
public String getIncidentReportApproverPackageName() {
throw new UnsupportedOperationException(
"getIncidentReportApproverPackageName not implemented in subclass");
diff --git a/services/net/java/android/net/StaticIpConfigurationParcelable.aidl b/core/java/android/net/StaticIpConfiguration.aidl
similarity index 78%
rename from services/net/java/android/net/StaticIpConfigurationParcelable.aidl
rename to core/java/android/net/StaticIpConfiguration.aidl
index 6fffb42..8aac701 100644
--- a/services/net/java/android/net/StaticIpConfigurationParcelable.aidl
+++ b/core/java/android/net/StaticIpConfiguration.aidl
@@ -17,11 +17,4 @@
package android.net;
-import android.net.LinkAddress;
-
-parcelable StaticIpConfigurationParcelable {
- LinkAddress ipAddress;
- String gateway;
- String[] dnsServers;
- String domains;
-}
+@JavaOnlyStableParcelable parcelable StaticIpConfiguration;
\ No newline at end of file
diff --git a/services/net/java/android/net/StaticIpConfigurationParcelable.aidl b/core/java/android/net/apf/ApfCapabilities.aidl
similarity index 75%
copy from services/net/java/android/net/StaticIpConfigurationParcelable.aidl
copy to core/java/android/net/apf/ApfCapabilities.aidl
index 6fffb42..7c4d4c2 100644
--- a/services/net/java/android/net/StaticIpConfigurationParcelable.aidl
+++ b/core/java/android/net/apf/ApfCapabilities.aidl
@@ -15,13 +15,6 @@
** limitations under the License.
*/
-package android.net;
+package android.net.apf;
-import android.net.LinkAddress;
-
-parcelable StaticIpConfigurationParcelable {
- LinkAddress ipAddress;
- String gateway;
- String[] dnsServers;
- String domains;
-}
+@JavaOnlyStableParcelable parcelable ApfCapabilities;
\ No newline at end of file
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index 41691d7..43ac574 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -104,6 +104,13 @@
}
/**
+ * Check whether application is profileable
+ */
+ private static boolean isProfileable(Context context) {
+ return context.getApplicationInfo().isProfileableByShell();
+ }
+
+ /**
* Store the layer paths available to the loader.
*/
public void setLayerPaths(ClassLoader classLoader,
@@ -153,11 +160,11 @@
String layerPaths = "";
// Only enable additional debug functionality if the following conditions are met:
- // 1. App is debuggable or device is rooted
+ // 1. App is debuggable, profileable, or device is rooted
// 2. ENABLE_GPU_DEBUG_LAYERS is true
// 3. Package name is equal to GPU_DEBUG_APP
- if (isDebuggable(context) || (getCanLoadSystemLibraries() == 1)) {
+ if (isDebuggable(context) || isProfileable(context) || (getCanLoadSystemLibraries() == 1)) {
final int enable = coreSettings.getInt(Settings.Global.ENABLE_GPU_DEBUG_LAYERS, 0);
diff --git a/core/java/android/os/IIncidentManager.aidl b/core/java/android/os/IIncidentManager.aidl
index b67b99f..5e024b9 100644
--- a/core/java/android/os/IIncidentManager.aidl
+++ b/core/java/android/os/IIncidentManager.aidl
@@ -17,32 +17,57 @@
package android.os;
import android.os.IIncidentReportStatusListener;
+import android.os.IncidentManager;
import android.os.IncidentReportArgs;
/**
* Binder interface to report system health incidents.
* {@hide}
*/
-oneway interface IIncidentManager {
+interface IIncidentManager {
/**
* Takes a report with the given args, reporting status to the optional listener.
*
* When the report is completed, the system report listener will be notified.
*/
- void reportIncident(in IncidentReportArgs args);
+ oneway void reportIncident(in IncidentReportArgs args);
/**
* Takes a report with the given args, reporting status to the optional listener.
*
* When the report is completed, the system report listener will be notified.
*/
- void reportIncidentToStream(in IncidentReportArgs args,
+ oneway void reportIncidentToStream(in IncidentReportArgs args,
@nullable IIncidentReportStatusListener listener,
FileDescriptor stream);
/**
* Tell the incident daemon that the android system server is up and running.
*/
- void systemRunning();
+ oneway void systemRunning();
+
+ /**
+ * List the incident reports for the given ComponentName. This is called
+ * via IncidentCompanion, which validates that the package name matches
+ * the caller.
+ */
+ List<String> getIncidentReportList(String pkg, String cls);
+
+ /**
+ * Get the IncidentReport object.
+ */
+ IncidentManager.IncidentReport getIncidentReport(String pkg, String cls, String id);
+
+ /**
+ * Reduce the refcount on this receiver. This is called
+ * via IncidentCompanion, which validates that the package name matches
+ * the caller.
+ */
+ void deleteIncidentReports(String pkg, String cls, String id);
+
+ /**
+ * Delete all incident reports for this package.
+ */
+ void deleteAllIncidentReports(String pkg);
}
diff --git a/core/java/android/os/IncidentManager.java b/core/java/android/os/IncidentManager.java
index 0bdf6f1..08afe31 100644
--- a/core/java/android/os/IncidentManager.java
+++ b/core/java/android/os/IncidentManager.java
@@ -75,6 +75,13 @@
public static final String URI_PARAM_ID = "id";
/**
+ * Query parameter for the uris for the incident report id.
+ *
+ * @hide
+ */
+ public static final String URI_PARAM_REPORT_ID = "r";
+
+ /**
* Query parameter for the uris for the pending report id.
*
* @hide
@@ -97,6 +104,13 @@
public static final String URI_PARAM_FLAGS = "flags";
/**
+ * Query parameter for the uris for the pending report id.
+ *
+ * @hide
+ */
+ public static final String URI_PARAM_RECEIVER_CLASS = "receiver";
+
+ /**
* Do the confirmation with a dialog instead of the default, which is a notification.
* It is possible for the dialog to be downgraded to a notification in some cases.
*/
@@ -243,12 +257,12 @@
@SystemApi
@TestApi
public static class IncidentReport implements Parcelable, Closeable {
- private final long mTimestampMs;
+ private final long mTimestampNs;
private final int mPrivacyPolicy;
private ParcelFileDescriptor mFileDescriptor;
public IncidentReport(Parcel in) {
- mTimestampMs = in.readLong();
+ mTimestampNs = in.readLong();
mPrivacyPolicy = in.readInt();
if (in.readInt() != 0) {
mFileDescriptor = ParcelFileDescriptor.CREATOR.createFromParcel(in);
@@ -272,10 +286,10 @@
/**
* Get the time at which this incident report was taken, in wall clock time
- * ({@link System#uptimeMillis System.uptimeMillis()} time base).
+ * ({@link System#currenttimeMillis System.currenttimeMillis()} time base).
*/
public long getTimestamp() {
- return mTimestampMs;
+ return mTimestampNs / 1000000;
}
/**
@@ -310,7 +324,7 @@
* @inheritDoc
*/
public void writeToParcel(Parcel out, int flags) {
- out.writeLong(mTimestampMs);
+ out.writeLong(mTimestampNs);
out.writeInt(mPrivacyPolicy);
if (mFileDescriptor != null) {
out.writeInt(1);
@@ -397,8 +411,8 @@
public void requestAuthorization(int callingUid, String callingPackage, int flags,
AuthListener listener) {
try {
- getCompanionServiceLocked().authorizeReport(callingUid, callingPackage, flags,
- listener.mBinder);
+ getCompanionServiceLocked().authorizeReport(callingUid, callingPackage, null, null,
+ flags, listener.mBinder);
} catch (RemoteException ex) {
// System process going down
throw new RuntimeException(ex);
@@ -477,7 +491,19 @@
android.Manifest.permission.PACKAGE_USAGE_STATS
})
public @NonNull List<Uri> getIncidentReportList(String receiverClass) {
- throw new RuntimeException("implement me");
+ List<String> strings;
+ try {
+ strings = getCompanionServiceLocked().getIncidentReportList(
+ mContext.getPackageName(), receiverClass);
+ } catch (RemoteException ex) {
+ throw new RuntimeException("System server or incidentd going down", ex);
+ }
+ final int size = strings.size();
+ ArrayList<Uri> result = new ArrayList(size);
+ for (int i = 0; i < size; i++) {
+ result.add(Uri.parse(strings.get(i)));
+ }
+ return result;
}
/**
@@ -493,20 +519,74 @@
android.Manifest.permission.PACKAGE_USAGE_STATS
})
public @Nullable IncidentReport getIncidentReport(Uri uri) {
- throw new RuntimeException("implement me");
+ final String pkg = uri.getQueryParameter(URI_PARAM_CALLING_PACKAGE);
+ if (pkg == null) {
+ throw new RuntimeException("Invalid URI: No "
+ + URI_PARAM_CALLING_PACKAGE + " parameter. " + uri);
+ }
+
+ final String cls = uri.getQueryParameter(URI_PARAM_RECEIVER_CLASS);
+ if (cls == null) {
+ throw new RuntimeException("Invalid URI: No "
+ + URI_PARAM_RECEIVER_CLASS + " parameter. " + uri);
+ }
+
+ final String id = uri.getQueryParameter(URI_PARAM_REPORT_ID);
+ if (cls == null) {
+ // If there's no report id, it's a bug report, so we can't return the incident
+ // report.
+ return null;
+ }
+
+ try {
+ return getCompanionServiceLocked().getIncidentReport(pkg, cls, id);
+ } catch (RemoteException ex) {
+ throw new RuntimeException("System server or incidentd going down", ex);
+ }
}
/**
* Delete the incident report with the given URI id.
*
- * @param uri Identifier of the incident report.
+ * @param uri Identifier of the incident report. Pass null to delete all
+ * incident reports owned by this application.
*/
@RequiresPermission(allOf = {
android.Manifest.permission.DUMP,
android.Manifest.permission.PACKAGE_USAGE_STATS
})
public void deleteIncidentReports(Uri uri) {
- throw new RuntimeException("implement me");
+ if (uri == null) {
+ try {
+ getCompanionServiceLocked().deleteAllIncidentReports(mContext.getPackageName());
+ } catch (RemoteException ex) {
+ throw new RuntimeException("System server or incidentd going down", ex);
+ }
+ } else {
+ final String pkg = uri.getQueryParameter(URI_PARAM_CALLING_PACKAGE);
+ if (pkg == null) {
+ throw new RuntimeException("Invalid URI: No "
+ + URI_PARAM_CALLING_PACKAGE + " parameter. " + uri);
+ }
+
+ final String cls = uri.getQueryParameter(URI_PARAM_RECEIVER_CLASS);
+ if (cls == null) {
+ throw new RuntimeException("Invalid URI: No "
+ + URI_PARAM_RECEIVER_CLASS + " parameter. " + uri);
+ }
+
+ final String id = uri.getQueryParameter(URI_PARAM_REPORT_ID);
+ if (cls == null) {
+ throw new RuntimeException("Invalid URI: No "
+ + URI_PARAM_REPORT_ID + " parameter. " + uri);
+ }
+
+ try {
+ getCompanionServiceLocked().deleteIncidentReports(pkg, cls, id);
+ } catch (RemoteException ex) {
+ throw new RuntimeException("System server or incidentd going down", ex);
+ }
+ }
}
private void reportIncidentInternal(IncidentReportArgs args) {
diff --git a/core/java/android/os/image/DynamicSystemClient.java b/core/java/android/os/image/DynamicSystemClient.java
index 87367ac..fa2c480 100644
--- a/core/java/android/os/image/DynamicSystemClient.java
+++ b/core/java/android/os/image/DynamicSystemClient.java
@@ -26,6 +26,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -45,20 +46,21 @@
* <p>This class contains methods and constants used to start a {@code DynamicSystem} installation,
* and a listener for status updates.</p>
*
- * <p>{@code DynamicSystem} allows user to run certified system images in a non destructive manner
- * without needing to prior OEM unlock. While running in {@code DynamicSystem}, persitent storage
- * for factory reset protection (FRP) remains unchanged. The new system is installed in a
- * temporarily allocated partition. After the installation is completed, the device will be running
- * in the new system on next reboot. Then, when the user reboots the device again, it will leave
- * {@code DynamicSystem} and go back into the original system. Since the userdata for
- * {@code DynamicSystem} is also newly created during the installation, running in
- * {@code DynamicSystem} doesn't change user's app data.</p>
+ * <p>{@code DynamicSystem} allows users to run certified system images in a non destructive manner
+ * without needing to prior OEM unlock. It creates a temporary system partition to install the new
+ * system image, and a temporary data partition for the newly installed system to run with.</p>
+ *
+ * After the installation is completed, the device will be running in the new system on next the
+ * reboot. Then, when the user reboots the device again, it will leave {@code DynamicSystem} and go
+ * back to the original system. While running in {@code DynamicSystem}, persitent storage for
+ * factory reset protection (FRP) remains unchanged. Since the user is running the new system with
+ * a temporarily created data partition, their original user data are kept unchanged.</p>
*
* <p>With {@link #setOnStatusChangedListener}, API users can register an
- * {@link #OnStatusChangedListener} and get status updates and cause when the installation is
+ * {@link #OnStatusChangedListener} to get status updates and their causes when the installation is
* started, stopped, or cancelled. It also sends progress updates during the installation. With
- * {@link #start}, API users can start an installation with the {@link Uri} to a gzipped system
- * image. The {@link Uri} can be a web URL or a content Uri to a local path.</p>
+ * {@link #start}, API users can start an installation with the {@link Uri} to a unsparsed and
+ * gzipped system image. The {@link Uri} can be a web URL or a content Uri to a local path.</p>
*
* @hide
*/
@@ -207,12 +209,6 @@
* Intent Keys
*/
/**
- * Intent key: URL to system image.
- * @hide
- */
- public static final String KEY_SYSTEM_URL = "KEY_SYSTEM_URL";
-
- /**
* Intent key: Size of system image, in bytes.
* @hide
*/
@@ -317,7 +313,7 @@
* allows it to send status updates to {@link #OnStatusChangedListener}. It is recommanded
* to bind before calling {@link #start} and get status updates.
*/
- @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
+ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM)
public void bind() {
Intent intent = new Intent();
intent.setClassName("com.android.dynsystem",
@@ -332,7 +328,7 @@
* Unbind from {@code DynamicSystem} installation service. Unbinding from the installation
* service stops it from sending following status updates.
*/
- @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
+ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM)
public void unbind() {
if (!mBound) {
return;
@@ -365,8 +361,8 @@
* @param systemUrl A network URL or a file URL to system image.
* @param systemSize size of system image.
*/
- @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
- public void start(@NonNull String systemUrl, @BytesLong long systemSize) {
+ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM)
+ public void start(@NonNull Uri systemUrl, @BytesLong long systemSize) {
start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
}
@@ -382,17 +378,17 @@
* @param systemSize size of system image.
* @param userdataSize bytes reserved for userdata.
*/
- @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
- public void start(@NonNull String systemUrl, @BytesLong long systemSize,
+ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM)
+ public void start(@NonNull Uri systemUrl, @BytesLong long systemSize,
@BytesLong long userdataSize) {
Intent intent = new Intent();
intent.setClassName("com.android.dynsystem",
"com.android.dynsystem.VerificationActivity");
+ intent.setData(systemUrl);
intent.setAction(ACTION_START_INSTALL);
- intent.putExtra(KEY_SYSTEM_URL, systemUrl);
intent.putExtra(KEY_SYSTEM_SIZE, systemSize);
intent.putExtra(KEY_USERDATA_SIZE, userdataSize);
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index f6fcdb0..56c2f4c 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -135,6 +135,7 @@
@SystemService(Context.STORAGE_SERVICE)
public class StorageManager {
private static final String TAG = "StorageManager";
+ private static final boolean LOCAL_LOGV = Log.isLoggable(TAG, Log.VERBOSE);
/** {@hide} */
public static final String PROP_PRIMARY_PHYSICAL = "ro.vold.primary_physical";
@@ -1652,13 +1653,11 @@
/**
* Check that given app holds both permission and appop.
- *
- * @return {@code null} if the permission and appop are held, otherwise
- * returns a string indicating why access was denied.
+ * @hide
*/
- private boolean checkPermissionAndAppOp(boolean enforce, int pid, int uid, String packageName,
- String permission, int op) {
- if (mContext.checkPermission(permission, pid, uid) != PERMISSION_GRANTED) {
+ public static boolean checkPermissionAndAppOp(Context context, boolean enforce,
+ int pid, int uid, String packageName, String permission, int op) {
+ if (context.checkPermission(permission, pid, uid) != PERMISSION_GRANTED) {
if (enforce) {
throw new SecurityException(
"Permission " + permission + " denied for package " + packageName);
@@ -1667,7 +1666,7 @@
}
}
- final AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class);
+ final AppOpsManager appOps = context.getSystemService(AppOpsManager.class);
final int mode = appOps.noteOpNoThrow(op, uid, packageName);
switch (mode) {
case AppOpsManager.MODE_ALLOWED:
@@ -1688,6 +1687,11 @@
}
}
+ private boolean checkPermissionAndAppOp(boolean enforce,
+ int pid, int uid, String packageName, String permission, int op) {
+ return checkPermissionAndAppOp(mContext, enforce, pid, uid, packageName, permission, op);
+ }
+
// Callers must hold both the old and new permissions, so that we can
// handle obscure cases like when an app targets Q but was installed on
// a device that was originally running on P before being upgraded to Q.
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 702dc74..1cab250 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1542,6 +1542,18 @@
= "android.settings.CHANNEL_NOTIFICATION_SETTINGS";
/**
+ * Activity Action: Show notification bubble settings for a single app.
+ * See {@link NotificationManager#areBubblesAllowed()}.
+ * <p>
+ * Input: {@link #EXTRA_APP_PACKAGE}, the package to display.
+ * <p>
+ * Output: Nothing.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_APP_NOTIFICATION_BUBBLE_SETTINGS
+ = "android.settings.APP_NOTIFICATION_BUBBLE_SETTINGS";
+
+ /**
* Activity Extra: The package owner of the notification channel settings to display.
* <p>
* This must be passed as an extra field to the {@link #ACTION_CHANNEL_NOTIFICATION_SETTINGS}.
@@ -12395,6 +12407,19 @@
public static final String EMERGENCY_AFFORDANCE_NEEDED = "emergency_affordance_needed";
/**
+ * Whether to enable automatic system server heap dumps. This only works on userdebug or
+ * eng builds, not on user builds. This is set by the user and overrides the config value.
+ * 1 means enable, 0 means disable.
+ *
+ * @hide
+ */
+ public static final String ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS =
+ "enable_automatic_system_server_heap_dumps";
+
+ private static final Validator ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_VALIDATOR =
+ new SettingsValidators.DiscreteValueValidator(new String[] {"0", "1"});
+
+ /**
* See RIL_PreferredNetworkType in ril.h
* @hide
*/
@@ -13464,24 +13489,6 @@
"hidden_api_blacklist_exemptions";
/**
- * Sampling rate for hidden API access event logs with libmetricslogger, as an integer in
- * the range 0 to 0x10000 inclusive.
- *
- * @hide
- */
- public static final String HIDDEN_API_ACCESS_LOG_SAMPLING_RATE =
- "hidden_api_access_log_sampling_rate";
-
- /**
- * Sampling rate for hidden API access event logging with statslog, as an integer in the
- * range 0 to 0x10000 inclusive.
- *
- * @hide
- */
- public static final String HIDDEN_API_ACCESS_STATSLOG_SAMPLING_RATE =
- "hidden_api_access_statslog_sampling_rate";
-
- /**
* Hidden API enforcement policy for apps.
*
* Values correspond to @{@link
@@ -13565,6 +13572,7 @@
EMERGENCY_TONE,
CALL_AUTO_RETRY,
DOCK_AUDIO_MEDIA_ENABLED,
+ ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS,
ENCODED_SURROUND_OUTPUT,
ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS,
LOW_POWER_MODE_TRIGGER_LEVEL,
@@ -13607,6 +13615,8 @@
VALIDATORS.put(EMERGENCY_TONE, EMERGENCY_TONE_VALIDATOR);
VALIDATORS.put(CALL_AUTO_RETRY, CALL_AUTO_RETRY_VALIDATOR);
VALIDATORS.put(DOCK_AUDIO_MEDIA_ENABLED, DOCK_AUDIO_MEDIA_ENABLED_VALIDATOR);
+ VALIDATORS.put(ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS,
+ ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_VALIDATOR);
VALIDATORS.put(ENCODED_SURROUND_OUTPUT, ENCODED_SURROUND_OUTPUT_VALIDATOR);
VALIDATORS.put(ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS,
ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS_VALIDATOR);
diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java
index c35423f..d32bdad 100644
--- a/core/java/android/service/quicksettings/TileService.java
+++ b/core/java/android/service/quicksettings/TileService.java
@@ -87,6 +87,10 @@
* This intent may also define a {@link Intent#EXTRA_COMPONENT_NAME} value
* to indicate the {@link ComponentName} that caused the preferences to be
* opened.
+ * <p>
+ * To ensure that the activity can only be launched through quick settings
+ * UI provided by this service, apps can protect it with the
+ * BIND_QUICK_SETTINGS_TILE permission.
*/
@SdkConstant(SdkConstantType.INTENT_CATEGORY)
public static final String ACTION_QS_TILE_PREFERENCES
diff --git a/core/java/android/view/MenuInflater.java b/core/java/android/view/MenuInflater.java
index a3cd0ba..8b3b10f 100644
--- a/core/java/android/view/MenuInflater.java
+++ b/core/java/android/view/MenuInflater.java
@@ -23,7 +23,7 @@
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
-import android.graphics.PorterDuff;
+import android.graphics.BlendMode;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
@@ -308,7 +308,7 @@
private CharSequence itemTitleCondensed;
private int itemIconResId;
private ColorStateList itemIconTintList = null;
- private PorterDuff.Mode itemIconTintMode = null;
+ private BlendMode mItemIconBlendMode = null;
private char itemAlphabeticShortcut;
private int itemAlphabeticModifiers;
private char itemNumericShortcut;
@@ -401,12 +401,12 @@
itemTitleCondensed = a.getText(com.android.internal.R.styleable.MenuItem_titleCondensed);
itemIconResId = a.getResourceId(com.android.internal.R.styleable.MenuItem_icon, 0);
if (a.hasValue(com.android.internal.R.styleable.MenuItem_iconTintMode)) {
- itemIconTintMode = Drawable.parseTintMode(a.getInt(
+ mItemIconBlendMode = Drawable.parseBlendMode(a.getInt(
com.android.internal.R.styleable.MenuItem_iconTintMode, -1),
- itemIconTintMode);
+ mItemIconBlendMode);
} else {
// Reset to null so that it's not carried over to the next item
- itemIconTintMode = null;
+ mItemIconBlendMode = null;
}
if (a.hasValue(com.android.internal.R.styleable.MenuItem_iconTint)) {
itemIconTintList = a.getColorStateList(
@@ -487,8 +487,8 @@
item.setShowAsAction(itemShowAsAction);
}
- if (itemIconTintMode != null) {
- item.setIconTintMode(itemIconTintMode);
+ if (mItemIconBlendMode != null) {
+ item.setIconTintMode(mItemIconBlendMode);
}
if (itemIconTintList != null) {
diff --git a/core/java/android/view/MenuItem.java b/core/java/android/view/MenuItem.java
index ad160cb..3785310 100644
--- a/core/java/android/view/MenuItem.java
+++ b/core/java/android/view/MenuItem.java
@@ -18,11 +18,13 @@
import android.annotation.DrawableRes;
import android.annotation.LayoutRes;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringRes;
import android.app.Activity;
import android.content.Intent;
import android.content.res.ColorStateList;
+import android.graphics.BlendMode;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.view.ContextMenu.ContextMenuInfo;
@@ -268,8 +270,33 @@
* @attr ref android.R.styleable#MenuItem_iconTintMode
* @see #setIconTintList(ColorStateList)
* @see Drawable#setTintMode(PorterDuff.Mode)
+ * @see Drawable#setTintMode(BlendMode)
+ *
+ * @deprecated use {@link #setIconTintMode(BlendMode)} instead
*/
- public default MenuItem setIconTintMode(@Nullable PorterDuff.Mode tintMode) { return this; }
+ @Deprecated
+ default @NonNull MenuItem setIconTintMode(@Nullable PorterDuff.Mode tintMode) {
+ return this;
+ }
+
+ /**
+ * Specifies the blending mode used to apply the tint specified by
+ * {@link #setIconTintList(ColorStateList)} to this item's icon. The default mode is
+ * {@link BlendMode#SRC_IN}.
+ *
+ * @param blendMode the blending mode used to apply the tint, may be
+ * {@code null} to clear tint
+ * @attr ref android.R.styleable#MenuItem_iconTintMode
+ * @see #setIconTintList(ColorStateList)
+ */
+ default @NonNull MenuItem setIconTintMode(@Nullable BlendMode blendMode) {
+ PorterDuff.Mode mode = BlendMode.blendModeToPorterDuffMode(blendMode);
+ if (mode != null) {
+ return setIconTintMode(mode);
+ } else {
+ return this;
+ }
+ }
/**
* Returns the blending mode used to apply the tint to this item's icon, if specified.
@@ -277,9 +304,31 @@
* @return the blending mode used to apply the tint to this item's icon
* @attr ref android.R.styleable#MenuItem_iconTintMode
* @see #setIconTintMode(PorterDuff.Mode)
+ * @see #setIconTintMode(BlendMode)
+ *
+ * @deprecated Use {@link #getIconTintBlendMode()} instead
*/
+ @Deprecated
@Nullable
public default PorterDuff.Mode getIconTintMode() { return null; }
+
+ /**
+ * Returns the blending mode used to apply the tint to this item's icon, if specified.
+ *
+ * @return the blending mode used to apply the tint to this item's icon
+ * @attr ref android.R.styleable#MenuItem_iconTintMode
+ * @see #setIconTintMode(BlendMode)
+ *
+ */
+ @Nullable
+ default BlendMode getIconTintBlendMode() {
+ PorterDuff.Mode mode = getIconTintMode();
+ if (mode != null) {
+ return BlendMode.fromValue(mode.nativeInt);
+ } else {
+ return null;
+ }
+ }
/**
* Change the Intent associated with this item. By default there is no
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 2357db4..c34613e 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -50,6 +50,7 @@
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
+import android.graphics.BlendMode;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Insets;
@@ -4506,7 +4507,7 @@
static class TintInfo {
ColorStateList mTintList;
- PorterDuff.Mode mTintMode;
+ BlendMode mBlendMode;
boolean mHasTintMode;
boolean mHasTintList;
}
@@ -5687,7 +5688,7 @@
if (mBackgroundTint == null) {
mBackgroundTint = new TintInfo();
}
- mBackgroundTint.mTintMode = Drawable.parseTintMode(a.getInt(
+ mBackgroundTint.mBlendMode = Drawable.parseBlendMode(a.getInt(
R.styleable.View_backgroundTintMode, -1), null);
mBackgroundTint.mHasTintMode = true;
break;
@@ -5707,7 +5708,7 @@
break;
case R.styleable.View_foregroundTintMode:
if (targetSdkVersion >= Build.VERSION_CODES.M || this instanceof FrameLayout) {
- setForegroundTintMode(Drawable.parseTintMode(a.getInt(attr, -1), null));
+ setForegroundTintMode(Drawable.parseBlendMode(a.getInt(attr, -1), null));
}
break;
case R.styleable.View_foregroundTint:
@@ -23266,7 +23267,7 @@
/**
* Applies a tint to the background drawable. Does not modify the current tint
- * mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
+ * mode, which is {@link BlendMode#SRC_IN} by default.
* <p>
* Subsequent calls to {@link #setBackground(Drawable)} will automatically
* mutate the drawable and apply the specified tint and tint mode using
@@ -23311,12 +23312,36 @@
* @attr ref android.R.styleable#View_backgroundTintMode
* @see #getBackgroundTintMode()
* @see Drawable#setTintMode(PorterDuff.Mode)
+ *
+ * @deprecated use @setBackgroundTintMode(BlendMode) instead
*/
+ @Deprecated
public void setBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+ BlendMode mode = null;
+ if (tintMode != null) {
+ mode = BlendMode.fromValue(tintMode.nativeInt);
+ }
+
+ setBackgroundTintMode(mode);
+ }
+
+ /**
+ * Specifies the blending mode used to apply the tint specified by
+ * {@link #setBackgroundTintList(ColorStateList)}} to the background
+ * drawable. The default mode is {@link BlendMode#SRC_IN}.
+ *
+ * @param blendMode the blending mode used to apply the tint, may be
+ * {@code null} to clear tint
+ * @attr ref android.R.styleable#View_backgroundTintMode
+ * @see #getBackgroundTintMode()
+ * @see Drawable#setTintMode(BlendMode)
+ */
+ public void setBackgroundTintMode(@Nullable BlendMode blendMode) {
if (mBackgroundTint == null) {
mBackgroundTint = new TintInfo();
}
- mBackgroundTint.mTintMode = tintMode;
+
+ mBackgroundTint.mBlendMode = blendMode;
mBackgroundTint.mHasTintMode = true;
applyBackgroundTint();
@@ -23329,12 +23354,34 @@
* @return the blending mode used to apply the tint to the background
* drawable
* @attr ref android.R.styleable#View_backgroundTintMode
- * @see #setBackgroundTintMode(PorterDuff.Mode)
+ * @see #setBackgroundTintMode(BlendMode)
+ *
+ * @deprecated use #getBackgroundBlendMode() instead
*/
@Nullable
@InspectableProperty
+ @Deprecated
public PorterDuff.Mode getBackgroundTintMode() {
- return mBackgroundTint != null ? mBackgroundTint.mTintMode : null;
+ PorterDuff.Mode porterDuffMode;
+ if (mBackgroundTint != null && mBackgroundTint.mBlendMode != null) {
+ porterDuffMode = BlendMode.blendModeToPorterDuffMode(mBackgroundTint.mBlendMode);
+ } else {
+ porterDuffMode = null;
+ }
+ return porterDuffMode;
+ }
+
+ /**
+ * Return the blending mode used to apply the tint to the background
+ * drawable, if specified.
+ *
+ * @return the blending mode used to apply the tint to the background
+ * drawable, null if no blend has previously been configured
+ * @attr ref android.R.styleable#View_backgroundTintMode
+ * @see #setBackgroundTintMode(BlendMode)
+ */
+ public @Nullable BlendMode getBackgroundBlendMode() {
+ return mBackgroundTint != null ? mBackgroundTint.mBlendMode : null;
}
private void applyBackgroundTint() {
@@ -23348,7 +23395,7 @@
}
if (tintInfo.mHasTintMode) {
- mBackground.setTintMode(tintInfo.mTintMode);
+ mBackground.setTintMode(tintInfo.mBlendMode);
}
// The drawable (or one of its children) may not have been
@@ -23532,15 +23579,37 @@
* @attr ref android.R.styleable#View_foregroundTintMode
* @see #getForegroundTintMode()
* @see Drawable#setTintMode(PorterDuff.Mode)
+ *
+ * @deprecated use #setForegroundTintMode(BlendMode)
*/
+ @Deprecated
public void setForegroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+ BlendMode mode = null;
+ if (tintMode != null) {
+ mode = BlendMode.fromValue(tintMode.nativeInt);
+ }
+ setForegroundTintMode(mode);
+ }
+
+ /**
+ * Specifies the blending mode used to apply the tint specified by
+ * {@link #setForegroundTintList(ColorStateList)}} to the background
+ * drawable. The default mode is {@link BlendMode#SRC_IN}.
+ *
+ * @param blendMode the blending mode used to apply the tint, may be
+ * {@code null} to clear tint
+ * @attr ref android.R.styleable#View_foregroundTintMode
+ * @see #getForegroundTintMode()
+ * @see Drawable#setTintMode(BlendMode)
+ */
+ public void setForegroundTintMode(@Nullable BlendMode blendMode) {
if (mForegroundInfo == null) {
mForegroundInfo = new ForegroundInfo();
}
if (mForegroundInfo.mTintInfo == null) {
mForegroundInfo.mTintInfo = new TintInfo();
}
- mForegroundInfo.mTintInfo.mTintMode = tintMode;
+ mForegroundInfo.mTintInfo.mBlendMode = blendMode;
mForegroundInfo.mTintInfo.mHasTintMode = true;
applyForegroundTint();
@@ -23554,12 +23623,35 @@
* drawable
* @attr ref android.R.styleable#View_foregroundTintMode
* @see #setForegroundTintMode(PorterDuff.Mode)
+ *
+ * @deprecated use #getForegroundBlendMode() instead
*/
@InspectableProperty
@Nullable
+ @Deprecated
public PorterDuff.Mode getForegroundTintMode() {
+ BlendMode blendMode = mForegroundInfo != null && mForegroundInfo.mTintInfo != null
+ ? mForegroundInfo.mTintInfo.mBlendMode : null;
+ if (blendMode != null) {
+ return BlendMode.blendModeToPorterDuffMode(blendMode);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Return the blending mode used to apply the tint to the foreground
+ * drawable, if specified.
+ *
+ * @return the blending mode used to apply the tint to the foreground
+ * drawable
+ * @attr ref android.R.styleable#View_foregroundTintMode
+ * @see #setForegroundTintMode(BlendMode)
+ *
+ */
+ public @Nullable BlendMode getForegroundBlendMode() {
return mForegroundInfo != null && mForegroundInfo.mTintInfo != null
- ? mForegroundInfo.mTintInfo.mTintMode : null;
+ ? mForegroundInfo.mTintInfo.mBlendMode : null;
}
private void applyForegroundTint() {
@@ -23574,7 +23666,7 @@
}
if (tintInfo.mHasTintMode) {
- mForegroundInfo.mDrawable.setTintMode(tintInfo.mTintMode);
+ mForegroundInfo.mDrawable.setTintMode(tintInfo.mBlendMode);
}
// The drawable (or one of its children) may not have been
diff --git a/core/java/android/widget/TEST_MAPPING b/core/java/android/widget/TEST_MAPPING
index ee378ff..99a6cdc 100644
--- a/core/java/android/widget/TEST_MAPPING
+++ b/core/java/android/widget/TEST_MAPPING
@@ -1,12 +1,7 @@
{
- "presubmit": [
+ "imports": [
{
- "name": "CtsWidgetTestCases",
- "options": [
- {
- "instrumentation-arg": "size:=small"
- }
- ]
+ "path": "cts/tests/tests/widget"
}
]
}
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 4f5678a..f29174b 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -163,6 +163,8 @@
*/
private static final int NO_DIRECT_SHARE_ANIM_IN_MILLIS = 200;
+ private static final float DIRECT_SHARE_EXPANSION_RATE = 0.7f;
+
// TODO(b/121287224): Re-evaluate this limit
private static final int SHARE_TARGET_QUERY_PACKAGE_LIMIT = 20;
@@ -435,9 +437,13 @@
mChooserRowServiceSpacing = getResources()
.getDimensionPixelSize(R.dimen.chooser_service_spacing);
- // expand/shrink direct share 4 -> 8 viewgroup
- if (mResolverDrawerLayout != null && isSendAction(target)) {
- mResolverDrawerLayout.setOnScrollChangeListener(this::handleScroll);
+ if (mResolverDrawerLayout != null) {
+ mResolverDrawerLayout.addOnLayoutChangeListener(this::handleLayoutChange);
+
+ // expand/shrink direct share 4 -> 8 viewgroup
+ if (isSendAction(target)) {
+ mResolverDrawerLayout.setOnScrollChangeListener(this::handleScroll);
+ }
}
if (DEBUG) {
@@ -878,18 +884,9 @@
mChooserListAdapter.addServiceResults(null, Lists.newArrayList(mCallerChooserTargets));
}
mChooserRowAdapter = new ChooserRowAdapter(mChooserListAdapter);
- mChooserRowAdapter.registerDataSetObserver(new OffsetDataSetObserver(adapterView));
if (listView != null) {
listView.setItemsCanFocus(true);
- listView.addOnLayoutChangeListener(
- (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
- if (mChooserRowAdapter.calculateMaxTargetsPerRow(right - left)) {
- adapterView.setAdapter(mChooserRowAdapter);
- }
- });
}
-
- adapterView.setAdapter(mChooserRowAdapter);
}
@Override
@@ -1728,6 +1725,66 @@
}
}
+ /*
+ * Need to dynamically adjust how many icons can fit per row before we add them,
+ * which also means setting the correct offset to initially show the content
+ * preview area + 2 rows of targets
+ */
+ private void handleLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
+ int oldTop, int oldRight, int oldBottom) {
+ if (mChooserRowAdapter == null || mAdapterView == null) {
+ return;
+ }
+
+ if (mChooserRowAdapter.calculateMaxTargetsPerRow(right - left)
+ || mAdapterView.getAdapter() == null) {
+ mAdapterView.setAdapter(mChooserRowAdapter);
+
+ getMainThreadHandler().post(() -> {
+ if (mResolverDrawerLayout == null || mChooserRowAdapter == null) {
+ return;
+ }
+
+ int offset = 0;
+ int rowsToShow = mChooserRowAdapter.getContentPreviewRowCount()
+ + mChooserRowAdapter.getServiceTargetRowCount()
+ + mChooserRowAdapter.getCallerTargetRowCount();
+
+ // then this is most likely not a SEND_* action, so check
+ // the app target count
+ if (rowsToShow == 0) {
+ rowsToShow = mChooserRowAdapter.getCount();
+ }
+
+ // still zero? then use a default height and leave, which
+ // can happen when there are no targets to show
+ if (rowsToShow == 0) {
+ offset = getResources().getDimensionPixelSize(
+ R.dimen.chooser_max_collapsed_height);
+ mResolverDrawerLayout.setCollapsibleHeightReserved(offset);
+ return;
+ }
+
+ int lastHeight = 0;
+ rowsToShow = Math.max(3, rowsToShow);
+ for (int i = 0; i < Math.min(rowsToShow, mAdapterView.getChildCount()); i++) {
+ lastHeight = mAdapterView.getChildAt(i).getHeight();
+ offset += lastHeight;
+ }
+
+ if (lastHeight != 0 && isSendAction(getTargetIntent())) {
+ // make sure to leave room for direct share 4->8 expansion
+ int expansionArea =
+ (int) (mResolverDrawerLayout.getUncollapsibleHeight()
+ / DIRECT_SHARE_EXPANSION_RATE);
+ offset = Math.min(offset, bottom - top - lastHeight - expansionArea);
+ }
+
+ mResolverDrawerLayout.setCollapsibleHeightReserved(offset);
+ });
+ }
+ }
+
public class ChooserListAdapter extends ResolveListAdapter {
public static final int TARGET_BAD = -1;
public static final int TARGET_CALLER = 0;
@@ -2541,7 +2598,6 @@
getRow(0).measure(spec, spec);
getRow(1).measure(spec, spec);
- // uses ChooserActiivty state variables to track height
mDirectShareMinHeight = getRow(0).getMeasuredHeight();
mDirectShareCurrHeight = mDirectShareCurrHeight > 0
? mDirectShareCurrHeight : mDirectShareMinHeight;
@@ -2574,18 +2630,18 @@
}
public void handleScroll(AbsListView view, int y, int oldy, int maxTargetsPerRow) {
- // only expand if we have more than 4 targets, and delay that decision until
- // they start to scroll
if (mHideDirectShareExpansion) {
return;
}
+ // only expand if we have more than maxTargetsPerRow, and delay that decision
+ // until they start to scroll
if (mChooserListAdapter.getSelectableServiceTargetCount() <= maxTargetsPerRow) {
mHideDirectShareExpansion = true;
return;
}
- int yDiff = (int) ((oldy - y) * 0.7f);
+ int yDiff = (int) ((oldy - y) * DIRECT_SHARE_EXPANSION_RATE);
int prevHeight = mDirectShareCurrHeight;
mDirectShareCurrHeight = Math.min(mDirectShareCurrHeight + yDiff,
@@ -2593,27 +2649,31 @@
mDirectShareCurrHeight = Math.max(mDirectShareCurrHeight, mDirectShareMinHeight);
yDiff = mDirectShareCurrHeight - prevHeight;
- if (view == null || view.getChildCount() == 0) {
+ if (view == null || view.getChildCount() == 0 || yDiff == 0) {
return;
}
- int index = mChooserRowAdapter.getContentPreviewRowCount();
+ // locate the item to expand, and offset the rows below that one
+ boolean foundExpansion = false;
+ for (int i = 0; i < view.getChildCount(); i++) {
+ View child = view.getChildAt(i);
- ViewGroup expansionGroup = (ViewGroup) view.getChildAt(index);
- int widthSpec = MeasureSpec.makeMeasureSpec(expansionGroup.getWidth(),
- MeasureSpec.EXACTLY);
- int heightSpec = MeasureSpec.makeMeasureSpec(mDirectShareCurrHeight,
- MeasureSpec.EXACTLY);
- expansionGroup.measure(widthSpec, heightSpec);
- expansionGroup.getLayoutParams().height = expansionGroup.getMeasuredHeight();
- expansionGroup.layout(expansionGroup.getLeft(), expansionGroup.getTop(),
- expansionGroup.getRight(),
- expansionGroup.getTop() + expansionGroup.getMeasuredHeight());
+ if (foundExpansion) {
+ child.offsetTopAndBottom(yDiff);
+ } else {
+ if (child.getTag() != null && child.getTag() instanceof DirectShareViewHolder) {
+ int widthSpec = MeasureSpec.makeMeasureSpec(child.getWidth(),
+ MeasureSpec.EXACTLY);
+ int heightSpec = MeasureSpec.makeMeasureSpec(mDirectShareCurrHeight,
+ MeasureSpec.EXACTLY);
+ child.measure(widthSpec, heightSpec);
+ child.getLayoutParams().height = child.getMeasuredHeight();
+ child.layout(child.getLeft(), child.getTop(), child.getRight(),
+ child.getTop() + child.getMeasuredHeight());
- // reposition list items
- int items = view.getChildCount();
- for (int i = index + 1; i < items; i++) {
- view.getChildAt(i).offsetTopAndBottom(yDiff);
+ foundExpansion = true;
+ }
+ }
}
}
}
@@ -2771,47 +2831,6 @@
}
}
- class OffsetDataSetObserver extends DataSetObserver {
- private final AbsListView mListView;
- private int mCachedViewType = -1;
- private View mCachedView;
-
- public OffsetDataSetObserver(AbsListView listView) {
- mListView = listView;
- }
-
- @Override
- public void onChanged() {
- if (mResolverDrawerLayout == null) {
- return;
- }
-
- final int chooserTargetRows = mChooserRowAdapter.getServiceTargetRowCount();
- int offset = 0;
- for (int i = 0; i < chooserTargetRows; i++) {
- final int pos = mChooserRowAdapter.getContentPreviewRowCount() + i;
- final int vt = mChooserRowAdapter.getItemViewType(pos);
- if (vt != mCachedViewType) {
- mCachedView = null;
- }
- final View v = mChooserRowAdapter.getView(pos, mCachedView, mListView);
- int height = ((RowViewHolder) (v.getTag())).getMeasuredRowHeight();
-
- offset += (int) (height);
-
- if (vt >= 0) {
- mCachedViewType = vt;
- mCachedView = v;
- } else {
- mCachedViewType = -1;
- }
- }
-
- mResolverDrawerLayout.setCollapsibleHeightReserved(offset);
- }
- }
-
-
/**
* Used internally to round image corners while obeying view padding.
*/
diff --git a/core/java/com/android/internal/app/DumpHeapActivity.java b/core/java/com/android/internal/app/DumpHeapActivity.java
index 0ce501e..e04e870 100644
--- a/core/java/com/android/internal/app/DumpHeapActivity.java
+++ b/core/java/com/android/internal/app/DumpHeapActivity.java
@@ -37,6 +37,10 @@
public static final String KEY_PROCESS = "process";
/** The size limit the process reached */
public static final String KEY_SIZE = "size";
+ /** Whether the user initiated the dump or not. */
+ public static final String KEY_IS_USER_INITIATED = "is_user_initiated";
+ /** Whether the process is a system process (eg: Android System) or not. */
+ public static final String KEY_IS_SYSTEM_PROCESS = "is_system_process";
/** Optional name of package to directly launch */
public static final String KEY_DIRECT_LAUNCH = "direct_launch";
@@ -59,6 +63,8 @@
mProcess = getIntent().getStringExtra(KEY_PROCESS);
mSize = getIntent().getLongExtra(KEY_SIZE, 0);
+ final boolean isUserInitiated = getIntent().getBooleanExtra(KEY_IS_USER_INITIATED, false);
+ final boolean isSystemProcess = getIntent().getBooleanExtra(KEY_IS_SYSTEM_PROCESS, false);
String directLaunch = getIntent().getStringExtra(KEY_DIRECT_LAUNCH);
if (directLaunch != null) {
@@ -81,11 +87,19 @@
}
}
+ final int messageId;
+ if (isUserInitiated) {
+ messageId = com.android.internal.R.string.dump_heap_ready_text;
+ } else if (isSystemProcess) {
+ messageId = com.android.internal.R.string.dump_heap_system_text;
+ } else {
+ messageId = com.android.internal.R.string.dump_heap_text;
+ }
AlertDialog.Builder b = new AlertDialog.Builder(this,
android.R.style.Theme_Material_Light_Dialog_Alert);
b.setTitle(com.android.internal.R.string.dump_heap_title);
- b.setMessage(getString(com.android.internal.R.string.dump_heap_text,
- mProcess, DebugUtils.sizeValueToString(mSize, null)));
+ b.setMessage(getString(
+ messageId, mProcess, DebugUtils.sizeValueToString(mSize, null)));
b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
index 9722fcb..a160b57 100644
--- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java
+++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
@@ -868,6 +868,13 @@
setMeasuredDimension(sourceWidth, heightSize);
}
+ /**
+ * @return The space reserved by views with 'alwaysShow=true'
+ */
+ public int getUncollapsibleHeight() {
+ return mUncollapsibleHeight;
+ }
+
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int width = getWidth();
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index e0b7629..59cc5ec 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -39,7 +39,6 @@
static jfieldID gBitmap_nativePtr;
static jmethodID gBitmap_constructorMethodID;
static jmethodID gBitmap_reinitMethodID;
-static jmethodID gBitmap_getAllocationByteCountMethodID;
namespace android {
@@ -193,11 +192,6 @@
info.width(), info.height(), isPremultiplied);
}
-int getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap)
-{
- return env->CallIntMethod(javaBitmap, gBitmap_getAllocationByteCountMethodID);
-}
-
jobject createBitmap(JNIEnv* env, Bitmap* bitmap,
int bitmapCreateFlags, jbyteArray ninePatchChunk, jobject ninePatchInsets,
int density) {
@@ -1227,7 +1221,6 @@
gBitmap_nativePtr = GetFieldIDOrDie(env, gBitmap_class, "mNativePtr", "J");
gBitmap_constructorMethodID = GetMethodIDOrDie(env, gBitmap_class, "<init>", "(JIIIZ[BLandroid/graphics/NinePatch$InsetStruct;Z)V");
gBitmap_reinitMethodID = GetMethodIDOrDie(env, gBitmap_class, "reinit", "(IIZ)V");
- gBitmap_getAllocationByteCountMethodID = GetMethodIDOrDie(env, gBitmap_class, "getAllocationByteCount", "()I");
return android::RegisterMethodsOrDie(env, "android/graphics/Bitmap", gBitmapMethods,
NELEM(gBitmapMethods));
}
diff --git a/core/jni/android/graphics/Bitmap.h b/core/jni/android/graphics/Bitmap.h
index 06877915..8cfef19 100644
--- a/core/jni/android/graphics/Bitmap.h
+++ b/core/jni/android/graphics/Bitmap.h
@@ -56,8 +56,6 @@
void reinitBitmap(JNIEnv* env, jobject javaBitmap, const SkImageInfo& info,
bool isPremultiplied);
-int getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap);
-
} // namespace bitmap
} // namespace android
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 47b1548..f510e24 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -327,10 +327,10 @@
reuseBitmap = &bitmap::toBitmap(env, javaBitmap);
if (reuseBitmap->isImmutable()) {
ALOGW("Unable to reuse an immutable bitmap as an image decoder target.");
- javaBitmap = NULL;
+ javaBitmap = nullptr;
reuseBitmap = nullptr;
} else {
- existingBufferSize = bitmap::getBitmapAllocationByteCount(env, javaBitmap);
+ existingBufferSize = reuseBitmap->getAllocationByteCount();
}
}
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index 9c07e2d..8a632a1 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -162,7 +162,7 @@
if (recycledBitmap->isImmutable()) {
ALOGW("Warning: Reusing an immutable bitmap as an image decoder target.");
}
- recycledBytes = bitmap::getBitmapAllocationByteCount(env, javaBitmap);
+ recycledBytes = recycledBitmap->getAllocationByteCount();
}
SkBitmapRegionDecoder* brd = reinterpret_cast<SkBitmapRegionDecoder*>(brdHandle);
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index c8f81e2..88713d1 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -144,6 +144,7 @@
static jclass gAudioMixingRuleClass;
static struct {
jfieldID mCriteria;
+ jfieldID mAllowPrivilegedPlaybackCapture;
// other fields unused by JNI
} gAudioMixingRuleFields;
@@ -1868,6 +1869,8 @@
jobject jRule = env->GetObjectField(jAudioMix, gAudioMixFields.mRule);
jobject jRuleCriteria = env->GetObjectField(jRule, gAudioMixingRuleFields.mCriteria);
+ nAudioMix->mAllowPrivilegedPlaybackCapture =
+ env->GetBooleanField(jRule, gAudioMixingRuleFields.mAllowPrivilegedPlaybackCapture);
env->DeleteLocalRef(jRule);
jobjectArray jCriteria = (jobjectArray)env->CallObjectMethod(jRuleCriteria,
gArrayListMethods.toArray);
@@ -2456,6 +2459,8 @@
gAudioMixingRuleClass = MakeGlobalRefOrDie(env, audioMixingRuleClass);
gAudioMixingRuleFields.mCriteria = GetFieldIDOrDie(env, audioMixingRuleClass, "mCriteria",
"Ljava/util/ArrayList;");
+ gAudioMixingRuleFields.mAllowPrivilegedPlaybackCapture =
+ GetFieldIDOrDie(env, audioMixingRuleClass, "mAllowPrivilegedPlaybackCapture", "Z");
jclass audioMixMatchCriterionClass =
FindClassOrDie(env, "android/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion");
diff --git a/core/jni/android_view_CompositionSamplingListener.cpp b/core/jni/android_view_CompositionSamplingListener.cpp
index 7141e6e..1c885e3 100644
--- a/core/jni/android_view_CompositionSamplingListener.cpp
+++ b/core/jni/android_view_CompositionSamplingListener.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "CompositionSamplingListener"
#include "android_util_Binder.h"
+#include "core_jni_helpers.h"
#include <nativehelper/JNIHelp.h>
@@ -122,6 +123,7 @@
LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
jclass clazz = env->FindClass("android/view/CompositionSamplingListener");
+ gListenerClassInfo.mClass = MakeGlobalRefOrDie(env, clazz);
gListenerClassInfo.mDispatchOnSampleCollected = env->GetStaticMethodID(
clazz, "dispatchOnSampleCollected", "(Landroid/view/CompositionSamplingListener;F)V");
return 0;
diff --git a/core/proto/android/app/alarmmanager.proto b/core/proto/android/app/alarmmanager.proto
index 58df922..fe27636 100644
--- a/core/proto/android/app/alarmmanager.proto
+++ b/core/proto/android/app/alarmmanager.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
import "frameworks/base/core/proto/android/app/pendingintent.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
diff --git a/core/proto/android/app/notification.proto b/core/proto/android/app/notification.proto
index a6f13d7..bf0b352 100644
--- a/core/proto/android/app/notification.proto
+++ b/core/proto/android/app/notification.proto
@@ -19,7 +19,7 @@
package android.app;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.app.Notification object.
diff --git a/core/proto/android/app/notification_channel.proto b/core/proto/android/app/notification_channel.proto
index 435d32f..c835b90 100644
--- a/core/proto/android/app/notification_channel.proto
+++ b/core/proto/android/app/notification_channel.proto
@@ -20,7 +20,7 @@
package android.app;
import "frameworks/base/core/proto/android/media/audioattributes.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.app.NotificationChannel object.
diff --git a/core/proto/android/app/notification_channel_group.proto b/core/proto/android/app/notification_channel_group.proto
index 6d6ceb2..c064bb12 100644
--- a/core/proto/android/app/notification_channel_group.proto
+++ b/core/proto/android/app/notification_channel_group.proto
@@ -20,7 +20,7 @@
package android.app;
import "frameworks/base/core/proto/android/app/notification_channel.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.app.NotificationChannelGroup object.
diff --git a/core/proto/android/app/notificationmanager.proto b/core/proto/android/app/notificationmanager.proto
index 27204cc..b88315e 100644
--- a/core/proto/android/app/notificationmanager.proto
+++ b/core/proto/android/app/notificationmanager.proto
@@ -19,7 +19,7 @@
package android.app;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.app.NotificationManager.Policy object.
diff --git a/core/proto/android/app/pendingintent.proto b/core/proto/android/app/pendingintent.proto
index 04ce850..b8e61a3 100644
--- a/core/proto/android/app/pendingintent.proto
+++ b/core/proto/android/app/pendingintent.proto
@@ -20,7 +20,7 @@
package android.app;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.app.PendingIntent object.
diff --git a/core/proto/android/app/profilerinfo.proto b/core/proto/android/app/profilerinfo.proto
index 20fa3ad..d318533 100644
--- a/core/proto/android/app/profilerinfo.proto
+++ b/core/proto/android/app/profilerinfo.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.app;
diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto
index 0c53fb2..bf33ac6 100644
--- a/core/proto/android/app/settings_enums.proto
+++ b/core/proto/android/app/settings_enums.proto
@@ -2325,4 +2325,7 @@
// Settings > app > bubble settings
APP_BUBBLE_SETTINGS = 1700;
+
+ // OPEN: Settings > System > Aware > Info dialog
+ DIALOG_AWARE_STATUS = 1701;
}
diff --git a/core/proto/android/app/window_configuration.proto b/core/proto/android/app/window_configuration.proto
index 6cc1a40..18439da 100644
--- a/core/proto/android/app/window_configuration.proto
+++ b/core/proto/android/app/window_configuration.proto
@@ -20,7 +20,7 @@
package android.app;
import "frameworks/base/core/proto/android/graphics/rect.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/** Proto representation for WindowConfiguration.java class. */
message WindowConfigurationProto {
diff --git a/core/proto/android/content/clipdata.proto b/core/proto/android/content/clipdata.proto
index 4f1c308..72bbb2a 100644
--- a/core/proto/android/content/clipdata.proto
+++ b/core/proto/android/content/clipdata.proto
@@ -21,7 +21,7 @@
import "frameworks/base/core/proto/android/content/clipdescription.proto";
import "frameworks/base/core/proto/android/content/intent.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// An android.content.ClipData object.
message ClipDataProto {
diff --git a/core/proto/android/content/clipdescription.proto b/core/proto/android/content/clipdescription.proto
index bc0e940..7145563 100644
--- a/core/proto/android/content/clipdescription.proto
+++ b/core/proto/android/content/clipdescription.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
import "frameworks/base/core/proto/android/os/persistablebundle.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// An android.content.ClipDescription object.
message ClipDescriptionProto {
diff --git a/core/proto/android/content/component_name.proto b/core/proto/android/content/component_name.proto
index 232d685..5cd0b05 100644
--- a/core/proto/android/content/component_name.proto
+++ b/core/proto/android/content/component_name.proto
@@ -19,7 +19,7 @@
package android.content;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.content.ComponentName object.
diff --git a/core/proto/android/content/configuration.proto b/core/proto/android/content/configuration.proto
index 06f9735..57ced09 100644
--- a/core/proto/android/content/configuration.proto
+++ b/core/proto/android/content/configuration.proto
@@ -21,7 +21,7 @@
import "frameworks/base/core/proto/android/app/window_configuration.proto";
import "frameworks/base/core/proto/android/content/locale.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android Configuration object.
diff --git a/core/proto/android/content/featureinfo.proto b/core/proto/android/content/featureinfo.proto
index 87bf404..1473ba9 100644
--- a/core/proto/android/content/featureinfo.proto
+++ b/core/proto/android/content/featureinfo.proto
@@ -16,7 +16,7 @@
syntax = "proto2";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
diff --git a/core/proto/android/content/intent.proto b/core/proto/android/content/intent.proto
index 99ed687..2de538d 100644
--- a/core/proto/android/content/intent.proto
+++ b/core/proto/android/content/intent.proto
@@ -21,7 +21,7 @@
import "frameworks/base/core/proto/android/content/component_name.proto";
import "frameworks/base/core/proto/android/os/patternmatcher.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Next Tag: 13
message IntentProto {
diff --git a/core/proto/android/content/locale.proto b/core/proto/android/content/locale.proto
index 86743bf..d8af754 100644
--- a/core/proto/android/content/locale.proto
+++ b/core/proto/android/content/locale.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.content;
diff --git a/core/proto/android/content/package_item_info.proto b/core/proto/android/content/package_item_info.proto
index ebb2fa6..4a7d043 100644
--- a/core/proto/android/content/package_item_info.proto
+++ b/core/proto/android/content/package_item_info.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.content.pm;
diff --git a/core/proto/android/graphics/point.proto b/core/proto/android/graphics/point.proto
index 04d879f..8180a06 100644
--- a/core/proto/android/graphics/point.proto
+++ b/core/proto/android/graphics/point.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.graphics;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
diff --git a/core/proto/android/graphics/rect.proto b/core/proto/android/graphics/rect.proto
index c216b2b..0bb0494 100644
--- a/core/proto/android/graphics/rect.proto
+++ b/core/proto/android/graphics/rect.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.graphics;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
diff --git a/core/proto/android/internal/locallog.proto b/core/proto/android/internal/locallog.proto
index df0b90b..ecf76a1 100644
--- a/core/proto/android/internal/locallog.proto
+++ b/core/proto/android/internal/locallog.proto
@@ -19,7 +19,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message LocalLogProto {
option (.android.msg_privacy).dest = DEST_EXPLICIT;
diff --git a/core/proto/android/media/audioattributes.proto b/core/proto/android/media/audioattributes.proto
index d679d9c..288b555 100644
--- a/core/proto/android/media/audioattributes.proto
+++ b/core/proto/android/media/audioattributes.proto
@@ -19,7 +19,7 @@
package android.media;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.media.AudioAttributes object.
diff --git a/core/proto/android/net/network.proto b/core/proto/android/net/network.proto
index e13ca9f..ca9ae61 100644
--- a/core/proto/android/net/network.proto
+++ b/core/proto/android/net/network.proto
@@ -19,7 +19,7 @@
package android.net;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.net.Network object.
diff --git a/core/proto/android/net/networkcapabilities.proto b/core/proto/android/net/networkcapabilities.proto
index 0338bf8..be0cad1 100644
--- a/core/proto/android/net/networkcapabilities.proto
+++ b/core/proto/android/net/networkcapabilities.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.net.NetworkCapabilities object.
diff --git a/core/proto/android/net/networkrequest.proto b/core/proto/android/net/networkrequest.proto
index d260b13..b35a020 100644
--- a/core/proto/android/net/networkrequest.proto
+++ b/core/proto/android/net/networkrequest.proto
@@ -21,7 +21,7 @@
option java_multiple_files = true;
import "frameworks/base/core/proto/android/net/networkcapabilities.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* An android.net.NetworkRequest object.
diff --git a/core/proto/android/os/backtrace.proto b/core/proto/android/os/backtrace.proto
index 8bbae17..31ff241 100644
--- a/core/proto/android/os/backtrace.proto
+++ b/core/proto/android/os/backtrace.proto
@@ -19,7 +19,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message BackTraceProto {
option (android.msg_privacy).dest = DEST_EXPLICIT;
diff --git a/core/proto/android/os/batterystats.proto b/core/proto/android/os/batterystats.proto
index 516fa7b..892ebf7 100644
--- a/core/proto/android/os/batterystats.proto
+++ b/core/proto/android/os/batterystats.proto
@@ -22,7 +22,7 @@
import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/os/powermanager.proto";
import "frameworks/base/core/proto/android/telephony/enums.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message BatteryStatsProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/os/batterytype.proto b/core/proto/android/os/batterytype.proto
index 2388c1e..82e194f 100644
--- a/core/proto/android/os/batterytype.proto
+++ b/core/proto/android/os/batterytype.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message BatteryTypeProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/os/bundle.proto b/core/proto/android/os/bundle.proto
index 5556936..dc59329 100644
--- a/core/proto/android/os/bundle.proto
+++ b/core/proto/android/os/bundle.proto
@@ -19,7 +19,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// An android.os.Bundle object.
message BundleProto {
diff --git a/core/proto/android/os/cpufreq.proto b/core/proto/android/os/cpufreq.proto
index 46f4901..b86da1a 100644
--- a/core/proto/android/os/cpufreq.proto
+++ b/core/proto/android/os/cpufreq.proto
@@ -17,7 +17,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.os;
diff --git a/core/proto/android/os/cpuinfo.proto b/core/proto/android/os/cpuinfo.proto
index ce69fc9..7477db4 100644
--- a/core/proto/android/os/cpuinfo.proto
+++ b/core/proto/android/os/cpuinfo.proto
@@ -17,7 +17,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.os;
diff --git a/libs/incident/proto/android/os/header.proto b/core/proto/android/os/header.proto
similarity index 100%
rename from libs/incident/proto/android/os/header.proto
rename to core/proto/android/os/header.proto
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index a5350c9..dfb6c08 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -22,7 +22,9 @@
import "frameworks/base/core/proto/android/os/cpufreq.proto";
import "frameworks/base/core/proto/android/os/cpuinfo.proto";
import "frameworks/base/core/proto/android/os/data.proto";
+import "frameworks/base/core/proto/android/os/header.proto";
import "frameworks/base/core/proto/android/os/kernelwake.proto";
+import "frameworks/base/core/proto/android/os/metadata.proto";
import "frameworks/base/core/proto/android/os/pagetypeinfo.proto";
import "frameworks/base/core/proto/android/os/procrank.proto";
import "frameworks/base/core/proto/android/os/ps.proto";
@@ -49,10 +51,8 @@
import "frameworks/base/core/proto/android/service/usb.proto";
import "frameworks/base/core/proto/android/util/event_log_tags.proto";
import "frameworks/base/core/proto/android/util/log.proto";
-import "frameworks/base/libs/incident/proto/android/os/header.proto";
-import "frameworks/base/libs/incident/proto/android/os/metadata.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
-import "frameworks/base/libs/incident/proto/android/section.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/section.proto";
package android.os;
diff --git a/core/proto/android/os/kernelwake.proto b/core/proto/android/os/kernelwake.proto
index 5021a06..885e62d 100644
--- a/core/proto/android/os/kernelwake.proto
+++ b/core/proto/android/os/kernelwake.proto
@@ -17,7 +17,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.os;
diff --git a/core/proto/android/os/looper.proto b/core/proto/android/os/looper.proto
index b9b8cf5..d1ef7bc 100644
--- a/core/proto/android/os/looper.proto
+++ b/core/proto/android/os/looper.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
import "frameworks/base/core/proto/android/os/messagequeue.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message LooperProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/os/message.proto b/core/proto/android/os/message.proto
index 8aaec70..9b48b67 100644
--- a/core/proto/android/os/message.proto
+++ b/core/proto/android/os/message.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.os;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
message MessageProto {
diff --git a/core/proto/android/os/messagequeue.proto b/core/proto/android/os/messagequeue.proto
index 61bbee7..9800865 100644
--- a/core/proto/android/os/messagequeue.proto
+++ b/core/proto/android/os/messagequeue.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
import "frameworks/base/core/proto/android/os/message.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message MessageQueueProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/libs/incident/proto/android/os/metadata.proto b/core/proto/android/os/metadata.proto
similarity index 95%
rename from libs/incident/proto/android/os/metadata.proto
rename to core/proto/android/os/metadata.proto
index 3b0e9c9..6242b27 100644
--- a/libs/incident/proto/android/os/metadata.proto
+++ b/core/proto/android/os/metadata.proto
@@ -27,7 +27,7 @@
// The id of the incident report.
optional int64 report_id = 1;
- // The sequence number of the report.
+ // No longer filled in as of Qt.
optional int32 sequence_number = 2;
// privacy level of the incident report.
@@ -38,8 +38,10 @@
}
optional Destination dest = 3;
+ // No longer filled in as of Qt.
optional int32 request_size = 4;
+ // No longer filled in as of Qt.
optional bool use_dropbox = 5;
// stats of each section taken in this incident report.
diff --git a/core/proto/android/os/pagetypeinfo.proto b/core/proto/android/os/pagetypeinfo.proto
index 65e7139..c795e2e 100644
--- a/core/proto/android/os/pagetypeinfo.proto
+++ b/core/proto/android/os/pagetypeinfo.proto
@@ -17,7 +17,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.os;
diff --git a/core/proto/android/os/patternmatcher.proto b/core/proto/android/os/patternmatcher.proto
index 520f2f5..ab2010d 100644
--- a/core/proto/android/os/patternmatcher.proto
+++ b/core/proto/android/os/patternmatcher.proto
@@ -16,7 +16,7 @@
syntax = "proto2";
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.os;
diff --git a/core/proto/android/os/persistablebundle.proto b/core/proto/android/os/persistablebundle.proto
index 712f87c..785250c7 100644
--- a/core/proto/android/os/persistablebundle.proto
+++ b/core/proto/android/os/persistablebundle.proto
@@ -19,7 +19,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// An android.os.PersistableBundle object.
message PersistableBundleProto {
diff --git a/core/proto/android/os/powermanager.proto b/core/proto/android/os/powermanager.proto
index 20b0a74..52b092c 100644
--- a/core/proto/android/os/powermanager.proto
+++ b/core/proto/android/os/powermanager.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
import "frameworks/base/core/proto/android/os/worksource.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message PowerManagerProto {
/* User activity events in PowerManager.java. */
diff --git a/core/proto/android/os/procrank.proto b/core/proto/android/os/procrank.proto
index f7edaf4..62f75bb 100644
--- a/core/proto/android/os/procrank.proto
+++ b/core/proto/android/os/procrank.proto
@@ -19,7 +19,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Memory usage of running processes
message ProcrankProto {
diff --git a/core/proto/android/os/ps.proto b/core/proto/android/os/ps.proto
index e032b57..993bfb6 100644
--- a/core/proto/android/os/ps.proto
+++ b/core/proto/android/os/ps.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message PsProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/os/statsdata.proto b/core/proto/android/os/statsdata.proto
index 25d76b8..b89b606 100644
--- a/core/proto/android/os/statsdata.proto
+++ b/core/proto/android/os/statsdata.proto
@@ -19,7 +19,7 @@
package android.os;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Dump of statsd report data (dumpsys stats --proto).
message StatsDataDumpProto {
diff --git a/core/proto/android/os/system_properties.proto b/core/proto/android/os/system_properties.proto
index 1f63be9..d06e1a6 100644
--- a/core/proto/android/os/system_properties.proto
+++ b/core/proto/android/os/system_properties.proto
@@ -18,7 +18,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.os;
diff --git a/core/proto/android/os/worksource.proto b/core/proto/android/os/worksource.proto
index 0a9c2ed..1763d44 100644
--- a/core/proto/android/os/worksource.proto
+++ b/core/proto/android/os/worksource.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.os;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
diff --git a/libs/incident/proto/android/privacy.proto b/core/proto/android/privacy.proto
similarity index 100%
rename from libs/incident/proto/android/privacy.proto
rename to core/proto/android/privacy.proto
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index 76a3b5d..e43b6a0 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -23,7 +23,7 @@
import "frameworks/base/core/proto/android/providers/settings/global.proto";
import "frameworks/base/core/proto/android/providers/settings/secure.proto";
import "frameworks/base/core/proto/android/providers/settings/system.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message SettingsServiceDumpProto {
option (android.msg_privacy).dest = DEST_EXPLICIT;
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index 62df6e7..d124feb 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
import "frameworks/base/core/proto/android/providers/settings/common.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Note: it's a conscious decision to add each setting as a separate field. This
// allows annotating each setting with its own privacy tag.
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 27a18ee..91d5bc8 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
import "frameworks/base/core/proto/android/providers/settings/common.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Note: it's a conscious decision to add each setting as a separate field. This
// allows annotating each setting with its own privacy tag.
diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto
index 41a7498..f8143de8 100644
--- a/core/proto/android/providers/settings/system.proto
+++ b/core/proto/android/providers/settings/system.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
import "frameworks/base/core/proto/android/providers/settings/common.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Note: it's a conscious decision to add each setting as a separate field. This
// allows annotating each setting with its own privacy tag.
diff --git a/libs/incident/proto/android/section.proto b/core/proto/android/section.proto
similarity index 100%
rename from libs/incident/proto/android/section.proto
rename to core/proto/android/section.proto
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index 79a5dd7..a7d4734 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -34,7 +34,7 @@
import "frameworks/base/core/proto/android/server/intentresolver.proto";
import "frameworks/base/core/proto/android/server/windowmanagerservice.proto";
import "frameworks/base/core/proto/android/util/common.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
@@ -756,6 +756,7 @@
optional string file = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
optional int32 pid = 3;
optional int32 uid = 4;
+ optional bool is_user_initiated = 5;
}
optional Dump dump = 2;
}
diff --git a/core/proto/android/server/alarmmanagerservice.proto b/core/proto/android/server/alarmmanagerservice.proto
index b74f28d..490f729 100644
--- a/core/proto/android/server/alarmmanagerservice.proto
+++ b/core/proto/android/server/alarmmanagerservice.proto
@@ -21,7 +21,7 @@
import "frameworks/base/core/proto/android/internal/locallog.proto";
import "frameworks/base/core/proto/android/os/worksource.proto";
import "frameworks/base/core/proto/android/server/forceappstandbytracker.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package com.android.server;
diff --git a/core/proto/android/server/animationadapter.proto b/core/proto/android/server/animationadapter.proto
index 0bcc488..70627ed 100644
--- a/core/proto/android/server/animationadapter.proto
+++ b/core/proto/android/server/animationadapter.proto
@@ -18,7 +18,7 @@
import "frameworks/base/core/proto/android/graphics/point.proto";
import "frameworks/base/core/proto/android/view/remote_animation_target.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package com.android.server.wm;
option java_multiple_files = true;
diff --git a/core/proto/android/server/appwindowthumbnail.proto b/core/proto/android/server/appwindowthumbnail.proto
index a1be721..f22cdc5 100644
--- a/core/proto/android/server/appwindowthumbnail.proto
+++ b/core/proto/android/server/appwindowthumbnail.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
import "frameworks/base/core/proto/android/server/surfaceanimator.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package com.android.server.wm;
option java_multiple_files = true;
diff --git a/core/proto/android/server/face.proto b/core/proto/android/server/face.proto
index 6ecf328..8b77586 100644
--- a/core/proto/android/server/face.proto
+++ b/core/proto/android/server/face.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package com.android.server.biometrics.face;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
option java_outer_classname = "FaceServiceProto";
diff --git a/core/proto/android/server/fingerprint.proto b/core/proto/android/server/fingerprint.proto
index c5eb85c..a264f18 100644
--- a/core/proto/android/server/fingerprint.proto
+++ b/core/proto/android/server/fingerprint.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package com.android.server.biometrics.fingerprint;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
option java_outer_classname = "FingerprintServiceProto";
diff --git a/core/proto/android/server/forceappstandbytracker.proto b/core/proto/android/server/forceappstandbytracker.proto
index 54f30c3..89424bc 100644
--- a/core/proto/android/server/forceappstandbytracker.proto
+++ b/core/proto/android/server/forceappstandbytracker.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
import "frameworks/base/core/proto/android/server/statlogger.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package com.android.server;
diff --git a/core/proto/android/server/intentresolver.proto b/core/proto/android/server/intentresolver.proto
index e67723e..7ac50e0 100644
--- a/core/proto/android/server/intentresolver.proto
+++ b/core/proto/android/server/intentresolver.proto
@@ -19,7 +19,7 @@
package com.android.server;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message IntentResolverProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 6c9d13a..1e0b0d8 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -30,7 +30,7 @@
import "frameworks/base/core/proto/android/os/persistablebundle.proto";
import "frameworks/base/core/proto/android/server/forceappstandbytracker.proto";
import "frameworks/base/core/proto/android/server/job/enums.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Next tag: 21
message JobSchedulerServiceDumpProto {
diff --git a/core/proto/android/server/powermanagerservice.proto b/core/proto/android/server/powermanagerservice.proto
index 9bf1825..091e1c2 100644
--- a/core/proto/android/server/powermanagerservice.proto
+++ b/core/proto/android/server/powermanagerservice.proto
@@ -28,7 +28,7 @@
import "frameworks/base/core/proto/android/providers/settings.proto";
import "frameworks/base/core/proto/android/server/wirelesschargerdetector.proto";
import "frameworks/base/core/proto/android/view/enums.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message PowerManagerServiceDumpProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/server/rolemanagerservice.proto b/core/proto/android/server/rolemanagerservice.proto
index 3453a66..146522c 100644
--- a/core/proto/android/server/rolemanagerservice.proto
+++ b/core/proto/android/server/rolemanagerservice.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message RoleManagerServiceDumpProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/server/statlogger.proto b/core/proto/android/server/statlogger.proto
index 65b1af7..8593da8 100644
--- a/core/proto/android/server/statlogger.proto
+++ b/core/proto/android/server/statlogger.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Dump from StatLogger.
message StatLoggerProto {
diff --git a/core/proto/android/server/surfaceanimator.proto b/core/proto/android/server/surfaceanimator.proto
index e3e8baa..15f4714 100644
--- a/core/proto/android/server/surfaceanimator.proto
+++ b/core/proto/android/server/surfaceanimator.proto
@@ -18,7 +18,7 @@
import "frameworks/base/core/proto/android/server/animationadapter.proto";
import "frameworks/base/core/proto/android/view/surfacecontrol.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package com.android.server.wm;
option java_multiple_files = true;
diff --git a/core/proto/android/server/usagestatsservice.proto b/core/proto/android/server/usagestatsservice.proto
index 050ec7a..f26eefa 100644
--- a/core/proto/android/server/usagestatsservice.proto
+++ b/core/proto/android/server/usagestatsservice.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package com.android.server.usage;
import "frameworks/base/core/proto/android/content/configuration.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index 3767ed5..dbd2191 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -27,7 +27,7 @@
import "frameworks/base/core/proto/android/view/enums.proto";
import "frameworks/base/core/proto/android/view/surface.proto";
import "frameworks/base/core/proto/android/view/windowlayoutparams.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package com.android.server.wm;
diff --git a/core/proto/android/server/wirelesschargerdetector.proto b/core/proto/android/server/wirelesschargerdetector.proto
index 2118deb..1c98fb9 100644
--- a/core/proto/android/server/wirelesschargerdetector.proto
+++ b/core/proto/android/server/wirelesschargerdetector.proto
@@ -19,7 +19,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message WirelessChargerDetectorProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/service/adb.proto b/core/proto/android/service/adb.proto
index 0060813..493f9b8 100644
--- a/core/proto/android/service/adb.proto
+++ b/core/proto/android/service/adb.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
option java_outer_classname = "AdbServiceProto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message AdbServiceDumpProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/service/battery.proto b/core/proto/android/service/battery.proto
index 34cb229..586411f 100644
--- a/core/proto/android/service/battery.proto
+++ b/core/proto/android/service/battery.proto
@@ -21,7 +21,7 @@
option java_outer_classname = "BatteryServiceProto";
import "frameworks/base/core/proto/android/os/enums.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message BatteryServiceDumpProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/service/batterystats.proto b/core/proto/android/service/batterystats.proto
index 25b47d3..3ae45ca 100644
--- a/core/proto/android/service/batterystats.proto
+++ b/core/proto/android/service/batterystats.proto
@@ -21,7 +21,7 @@
option java_outer_classname = "BatteryStatsServiceProto";
import "frameworks/base/core/proto/android/os/batterystats.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Dump of batterystats aggregate data (dumpsys batterystats --proto).
message BatteryStatsServiceDumpProto {
diff --git a/core/proto/android/service/diskstats.proto b/core/proto/android/service/diskstats.proto
index 1012eb0..f79de39 100644
--- a/core/proto/android/service/diskstats.proto
+++ b/core/proto/android/service/diskstats.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.service.diskstats;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
option java_outer_classname = "DiskStatsServiceProto";
diff --git a/core/proto/android/service/graphicsstats.proto b/core/proto/android/service/graphicsstats.proto
index bb32495..11f0467 100644
--- a/core/proto/android/service/graphicsstats.proto
+++ b/core/proto/android/service/graphicsstats.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
option java_outer_classname = "GraphicsStatsServiceProto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// This file is based on frameworks/base/libs/hwui/protos/graphicsstats.proto.
// Please try to keep the two files in sync.
diff --git a/core/proto/android/service/netstats.proto b/core/proto/android/service/netstats.proto
index 02d4483..8ebb4a9 100644
--- a/core/proto/android/service/netstats.proto
+++ b/core/proto/android/service/netstats.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.service;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
option java_outer_classname = "NetworkStatsServiceProto";
diff --git a/core/proto/android/service/notification.proto b/core/proto/android/service/notification.proto
index 4ef26dd..1ec05fb 100644
--- a/core/proto/android/service/notification.proto
+++ b/core/proto/android/service/notification.proto
@@ -25,7 +25,7 @@
import "frameworks/base/core/proto/android/app/notificationmanager.proto";
import "frameworks/base/core/proto/android/content/component_name.proto";
import "frameworks/base/core/proto/android/media/audioattributes.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message NotificationServiceDumpProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/service/package.proto b/core/proto/android/service/package.proto
index 7f96d70..6ffa0c9 100644
--- a/core/proto/android/service/package.proto
+++ b/core/proto/android/service/package.proto
@@ -18,7 +18,7 @@
package android.service.pm;
import "frameworks/base/core/proto/android/content/featureinfo.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
option java_outer_classname = "PackageServiceProto";
diff --git a/core/proto/android/service/print.proto b/core/proto/android/service/print.proto
index a449156..abf1b29 100644
--- a/core/proto/android/service/print.proto
+++ b/core/proto/android/service/print.proto
@@ -21,7 +21,7 @@
option java_outer_classname = "PrintServiceProto";
import "frameworks/base/core/proto/android/content/component_name.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message PrintServiceDumpProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/service/procstats.proto b/core/proto/android/service/procstats.proto
index da801ff..f49a044 100644
--- a/core/proto/android/service/procstats.proto
+++ b/core/proto/android/service/procstats.proto
@@ -22,7 +22,7 @@
import "frameworks/base/core/proto/android/util/common.proto";
import "frameworks/base/core/proto/android/service/procstats_enum.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* Data from ProcStatsService Dumpsys
diff --git a/core/proto/android/service/runtime.proto b/core/proto/android/service/runtime.proto
index ecbccef..440264d 100644
--- a/core/proto/android/service/runtime.proto
+++ b/core/proto/android/service/runtime.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.service.runtime;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
option java_outer_classname = "RuntimeServiceProto";
diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto
index 367c540..2e1de79 100644
--- a/core/proto/android/service/usb.proto
+++ b/core/proto/android/service/usb.proto
@@ -22,7 +22,7 @@
import "frameworks/base/core/proto/android/content/component_name.proto";
import "frameworks/base/core/proto/android/service/enums.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
message UsbServiceDumpProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/util/common.proto b/core/proto/android/util/common.proto
index f8f7885..aad24d1 100644
--- a/core/proto/android/util/common.proto
+++ b/core/proto/android/util/common.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.util;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
diff --git a/core/proto/android/util/event_log_tags.proto b/core/proto/android/util/event_log_tags.proto
index 457219f..40bab9e 100644
--- a/core/proto/android/util/event_log_tags.proto
+++ b/core/proto/android/util/event_log_tags.proto
@@ -19,7 +19,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
// Proto representation of event.logtags.
// Usually sit in /system/etc/event-log-tags.
diff --git a/core/proto/android/util/log.proto b/core/proto/android/util/log.proto
index 416c055..09870ae 100644
--- a/core/proto/android/util/log.proto
+++ b/core/proto/android/util/log.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.util;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
diff --git a/core/proto/android/view/displaycutout.proto b/core/proto/android/view/displaycutout.proto
index 0a33101..ff98e99 100644
--- a/core/proto/android/view/displaycutout.proto
+++ b/core/proto/android/view/displaycutout.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
import "frameworks/base/core/proto/android/graphics/rect.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.view;
option java_multiple_files = true;
diff --git a/core/proto/android/view/displayinfo.proto b/core/proto/android/view/displayinfo.proto
index 29757fc..49c0a29 100644
--- a/core/proto/android/view/displayinfo.proto
+++ b/core/proto/android/view/displayinfo.proto
@@ -17,7 +17,7 @@
syntax = "proto2";
package android.view;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
option java_multiple_files = true;
diff --git a/core/proto/android/view/remote_animation_target.proto b/core/proto/android/view/remote_animation_target.proto
index 808c514..24d2785 100644
--- a/core/proto/android/view/remote_animation_target.proto
+++ b/core/proto/android/view/remote_animation_target.proto
@@ -23,7 +23,7 @@
import "frameworks/base/core/proto/android/graphics/point.proto";
import "frameworks/base/core/proto/android/graphics/rect.proto";
import "frameworks/base/core/proto/android/view/surfacecontrol.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/** Proto representation for android.view.RemoteAnimationTarget.java class. */
message RemoteAnimationTargetProto {
diff --git a/core/proto/android/view/surfacecontrol.proto b/core/proto/android/view/surfacecontrol.proto
index 8a252be..cbb243b 100644
--- a/core/proto/android/view/surfacecontrol.proto
+++ b/core/proto/android/view/surfacecontrol.proto
@@ -19,7 +19,7 @@
option java_multiple_files = true;
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
/**
* Represents a {@link android.view.SurfaceControl} object.
diff --git a/core/proto/android/view/windowlayoutparams.proto b/core/proto/android/view/windowlayoutparams.proto
index 8a011e9..075ebcf 100644
--- a/core/proto/android/view/windowlayoutparams.proto
+++ b/core/proto/android/view/windowlayoutparams.proto
@@ -18,7 +18,7 @@
import "frameworks/base/core/proto/android/graphics/pixelformat.proto";
import "frameworks/base/core/proto/android/view/display.proto";
-import "frameworks/base/libs/incident/proto/android/privacy.proto";
+import "frameworks/base/core/proto/android/privacy.proto";
package android.view;
option java_multiple_files = true;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 8bfa038..cffa46c 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -116,6 +116,7 @@
<protected-broadcast android:name="android.app.action.BUGREPORT_SHARE" />
<protected-broadcast android:name="android.app.action.SHOW_DEVICE_MONITORING_DIALOG" />
<protected-broadcast android:name="android.intent.action.PENDING_INCIDENT_REPORTS_CHANGED" />
+ <protected-broadcast android:name="android.intent.action.INCIDENT_REPORT_READY" />
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_UPDATE_OPTIONS" />
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_DELETED" />
@@ -266,6 +267,7 @@
<protected-broadcast android:name="android.intent.action.HEADSET_PLUG" />
<protected-broadcast android:name="android.media.action.HDMI_AUDIO_PLUG" />
<protected-broadcast android:name="android.media.action.MICROPHONE_MUTE_CHANGED" />
+ <protected-broadcast android:name="android.media.action.SPEAKERPHONE_STATE_CHANGED" />
<protected-broadcast android:name="android.media.AUDIO_BECOMING_NOISY" />
<protected-broadcast android:name="android.media.RINGER_MODE_CHANGED" />
@@ -1853,6 +1855,11 @@
<permission android:name="android.permission.MANAGE_DYNAMIC_SYSTEM"
android:protectionLevel="signature" />
+ <!-- @SystemApi Allows an application to install a DynamicSystem image and get status updates.
+ @hide -->
+ <permission android:name="android.permission.INSTALL_DYNAMIC_SYSTEM"
+ android:protectionLevel="signature|privileged" />
+
<!-- @SystemApi Allows access to Broadcast Radio
@hide This is not a third-party API (intended for system apps).-->
<permission android:name="android.permission.ACCESS_BROADCAST_RADIO"
@@ -3555,10 +3562,30 @@
android:protectionLevel="signature" />
<!-- Allows an application to capture audio output.
+ Use the {@code CAPTURE_MEDIA_OUTPUT} permission if only the {@code USAGE_UNKNOWN}),
+ {@code USAGE_MEDIA}) or {@code USAGE_GAME}) usages are intended to be captured.
<p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows an application to capture the audio played by other apps
+ that have set an allow capture policy of
+ {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_SYSTEM}.
+
+ Without this permission, only audio with an allow capture policy of
+ {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_ALL} can be used.
+
+ There are strong restriction listed at
+ {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_SYSTEM}
+ on what an app can do with the captured audio.
+
+ See {@code CAPTURE_AUDIO_OUTPUT} for capturing audio use cases other than media playback.
+
+ <p>Not for use by third-party applications.</p>
+ @hide -->
+ <permission android:name="android.permission.CAPTURE_MEDIA_OUTPUT"
+ android:protectionLevel="signature|privileged" />
+
<!-- @SystemApi Allows an application to capture audio for hotword detection.
<p>Not for use by third-party applications.</p>
@hide -->
diff --git a/core/res/res/drawable/ic_drag_handle.xml b/core/res/res/drawable/ic_drag_handle.xml
index 67ab84d..9b0e204 100644
--- a/core/res/res/drawable/ic_drag_handle.xml
+++ b/core/res/res/drawable/ic_drag_handle.xml
@@ -13,11 +13,9 @@
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="24.0dp"
- android:height="24.0dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M20.0,9.0L4.0,9.0l0.0,2.0l16.0,0.0L20.0,9.0zM4.0,15.0l16.0,0.0l0.0,-2.0L4.0,13.0l0.0,2.0z"/>
-</vector>
\ No newline at end of file
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle" >
+ <solid android:color="#FFFFFFFF" />
+ <corners android:radius="2dp" />
+</shape>
diff --git a/core/res/res/layout/chooser_grid.xml b/core/res/res/layout/chooser_grid.xml
index 2860ee4..1f80417 100644
--- a/core/res/res/layout/chooser_grid.xml
+++ b/core/res/res/layout/chooser_grid.xml
@@ -20,7 +20,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:maxCollapsedHeight="288dp"
+ android:maxCollapsedHeight="0dp"
android:maxCollapsedHeightSmall="56dp"
android:id="@id/contentPanel">
@@ -32,12 +32,12 @@
<ImageView
android:id="@+id/drag"
- android:layout_width="48dp"
- android:layout_height="wrap_content"
+ android:layout_width="32dp"
+ android:layout_height="4dp"
android:src="@drawable/ic_drag_handle"
android:clickable="true"
- android:paddingTop="@dimen/chooser_edge_margin_normal"
- android:tint="?android:attr/textColorSecondary"
+ android:layout_marginTop="@dimen/chooser_view_spacing"
+ android:tint="@color/lighter_gray"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true" />
@@ -62,8 +62,8 @@
android:textAppearance="?attr/textAppearanceMedium"
android:textSize="20sp"
android:gravity="center"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
+ android:paddingTop="@dimen/chooser_view_spacing"
+ android:paddingBottom="@dimen/chooser_view_spacing"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:layout_below="@id/profile_button"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 78c0b80..bb8f3d6 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi-oproepe"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Af"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Verkies Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Verkies mobiel"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Net Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nie aangestuur nie"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Foutverslag"</string>
<string name="global_action_logout" msgid="935179188218826050">"Beëindig sessie"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skermkiekie"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Neem foutverslag"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Dit sal inligting oor die huidige toestand van jou toestel insamel om as \'n e-posboodskap te stuur. Dit sal \'n tydjie neem vandat die foutverslag begin is totdat dit reg is om gestuur te word; wees asseblief geduldig."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiewe verslag"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Gebruik dit in die meeste gevalle. Maak dit vir jou moontlik om die vordering van die verslag na te spoor, meer besonderhede oor die probleem in te voer en skermkiekies te neem. Dit sal dalk sommige afdelings wat minder gebruik word en waarvoor verslagdoening lank duur, weglaat."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Ligging"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"toegang te verkry tot hierdie toestel se ligging"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Gee <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang tot hierdie toestel se ligging?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Die program sal net toegang tot die ligging hê terwyl jy die program gebruik."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Gee <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> altyd toegang tot toestelligging?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Die program sal altyd toegang tot die ligging hê, selfs wanneer jy nie die program gebruik nie."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"by jou kalender in te gaan"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Gee <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang tot jou kalender?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Gee <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang tot jou musiek?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Foto\'s en video\'s"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"toegang tot jou foto\'s en video\'s"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Laat <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toe om by jou foto\'s en video\'s in te gaan, insluitend gemerkte liggings?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Venster-inhoud ophaal"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die inhoud ondersoek van \'n venster waarmee jy interaksie het."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Verken deur raak aanskakel"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Laat die program toe om met kortveldkommunikasie- (NFC) merkers, kaarte en lesers te kommunikeer."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"deaktiveer jou skermslot"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Laat die program toe om die sleutelslot en enige verwante wagwoordsekuriteit te deaktiveer. Byvoorbeeld, die foon deaktiveer die sleutelslot wanneer ’n oproep inkom, en atkiveer dit dan weer wanneer die oproep eindig."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"versoek skermslot-kompleksiteit"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Laat die program toe om die skermslot-kompleksiteitvlak (hoog, medium, laag of geen) te leer, wat die moontlike omvang van die lengte en soort skermslot aandui. Hierdie program kan ook aan gebruikers voorstel dat hulle die skermslot na \'n sekere vlak toe opdateer, maar gebruikers kan dit vrylik ignoreer en weggaan. Let daarop dat die skermslot nie in skoonteks geberg word nie sodat die program nie die presiese wagwoord ken nie."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"gebruik biometriese hardeware"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Laat die program toe om biometriese hardeware vir stawing te gebruik"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"bestuur vingerafdrukhardeware"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Laat program toe om metodes te benut om gesigtemplate vir gebruik by te voeg en uit te vee."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gebruik gesigstawinghardeware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Laat die program toe om gesigstawinghardeware vir stawing te gebruik"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Kon nie gesig verwerk nie. Probeer weer."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Gesig is te helder. Probeer met minder lig."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Gesig is te donker. Maak ligbron oop."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Beweeg sensor verder weg van gesig af."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Bring sensor nader aan gesig."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Beweeg sensor na bo."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Beweeg sensor na onder."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Beweeg sensor na regs."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Beweeg sensor na links."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Kyk na die sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Geen gesig bespeur nie."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Te veel beweging."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Skryf jou gesig asseblief weer in."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Ander gesig is bespeur."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Te eenders. Verander asseblief jou pose."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Kyk asseblief meer reguit na die kamera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Kyk asseblief meer reguit na die kamera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Hou asseblief jou kop regop."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Ontbloot asseblief jou gesig."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Gesighardeware is nie beskikbaar nie."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Gesiguittelling is bereik. Probeer weer."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Gesig kan nie geberg word nie."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Gesighandeling is gekanselleer."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Gesigstawing is deur gebruiker gekanselleer."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogings. Probeer later weer."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Te veel pogings. Gesigstawingsensor is gedeaktiveer."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Probeer weer."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Geen gesigte is geregistreer nie."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Hierdie toestel het nie \'n gesigstawingsensor nie."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Gesig <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Maak <xliff:g id="NEW_APP">%1$s</xliff:g> oop"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> sal toemaak sonder om te stoor"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> het berginglimiet oorskry"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Hoopstorting is ingesamel. Tik om te deel."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Deel hoopstorting?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Die proses <xliff:g id="PROC">%1$s</xliff:g> het sy prosesberginglimiet van <xliff:g id="SIZE">%2$s</xliff:g> oorskry. \'n Hoopstorting is beskikbaar wat jy met sy ontwikkelaar kan deel. Pas op: Hierdie hoopstorting kan enige van jou persoonlike inligting bevat waartoe die program toegang het."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Kies \'n handeling vir teks"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Luiervolume"</string>
<string name="volume_music" msgid="5421651157138628171">"Mediavolume"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerke te sien"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Koppel"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netwerke"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"\'n Wi‑Fi-netwerk voorgestel deur <xliff:g id="NAME">%s</xliff:g> is beskikbaar"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Wil jy koppel aan netwerke wat <xliff:g id="NAME">%s</xliff:g> voorgestel het?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nee"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi sal outomaties aanskakel"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Meld by netwerk aan"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi‑Fi het geen internettoegang nie"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tik vir opsies"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Gekoppel"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Veranderings aan jou warmkolinstellings"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Jou warmkolband het verander."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Hierdie toestel steun nie jou voorkeur vir net 5 GHz nie. Hierdie toestel sal in plaas daarvan die 5 GHz-band gebruik wanneer dit beskikbaar is."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-ontfouter gekoppel"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tik om USB-ontfouting af te skakel"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Kies om USB-ontfouting te deaktiveer."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Vloeistof of vuilgoed in USB-poort"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-poort is outomaties gedeaktiveer. Tik om meer te wete te kom."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Veilig om USB-poort te gebruik"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tik om werkprofiel te ontsluit"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Gekoppel aan <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tik om lêers te bekyk"</string>
- <string name="pin_target" msgid="3052256031352291362">"Speld vas"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Ontspeld"</string>
<string name="app_info" msgid="6856026610594615344">"Programinligting"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Begin tans demonstrasie …"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Roetinemodus-inligtingkennisgewing"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery kan afloop voordat dit normaalweg gelaai word"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterybespaarder is geaktiveer om batterylewe te verleng"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Vouer"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android-program"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Lêer"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index cabca7f..b42fd20 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"የWi-Fi ጥሪ"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ጠፍቷል"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ተመርጧል"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"የተንቀሳቃሽ ስልክ ተመራጭ ነው"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi ብቻ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>፡አልተላለፈም"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"የሳንካ ሪፖርት"</string>
<string name="global_action_logout" msgid="935179188218826050">"ክፍለ-ጊዜን አብቃ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ቅጽበታዊ ገጽ እይታ"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"የሳንካ ሪፖርት ውሰድ"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"ይሄ እንደ የኢሜይል መልዕክት አድርጎ የሚልከውን ስለመሣሪያዎ የአሁኑ ሁኔታ መረጃ ይሰበስባል። የሳንካ ሪፖርቱን ከመጀመር ጀምሮ እስኪላክ ድረስ ትንሽ ጊዜ ይወስዳል፤ እባክዎ ይታገሱ።"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"መስተጋብራዊ ሪፖርት"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"በአብዛኛዎቹ ሁኔታዎች ላይ ይህን ይጠቀሙ። የሪፖርቱን ሂደት እንዲከታተሉ፣ ስለችግሩ ተጨማሪ ዝርዝሮችን እንዲያስገቡ እና ቅጽበታዊ ገጽ እይታዎችን እንዲያነሱ ያስችልዎታል። ሪፖርት ለማድረግ ረዥም ጊዜ የሚወስዱ አንዳንድ ብዙም ጥቅም ላይ የማይውሉ ክፍሎችን ሊያልፋቸው ይችላል።"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"መገኛ አካባቢ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"የዚህን መሣሪያ አካባቢ ይድረሱበት"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የዚህ መሣሪያ አካባቢን እንዲደርስ ይፈቀድለት?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"መተግበሪያው እርስዎ ሲጠቀሙበት ብቻ ነው የአካባቢው መዳረሻ የሚኖረው።"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ሁልጊዜ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> የዚህ መሣሪያ አካባቢን እንዲደርስ ይፈቀድለት?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"መተግበሪያው ሁልጊዜ የአካባቢው መዳረሽ ይኖረዋል፣ እርስዎ መተግበሪያውን እየተጠቀሙ ባይሆኑም እንኳ።"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ቀን መቁጠሪያ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"የእርስዎን ቀን መቁጠሪያ ይድረሱበት"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ቀን መቁጠሪያዎን እንዲደርስ ይፈቀድለት?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ቀን ሙዚቃዎን እንዲደርስ ይፈቀድለት?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ፎቶዎች እና ቪዲዮዎች"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"የእርስዎን ፎቶዎች እና ቪዲዮዎች መድረስ"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"የእርስዎን ፎቶዎች እና ቪዲዮዎች መለያ ስያሜ የተደረገባቸውን መገኛ አካባቢዎች ጨምሮ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> እንዲደርስ ይፈቀድለት?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"የመስኮት ይዘት ሰርስረው ያውጡ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"መስተጋበር የሚፈጥሩት የመስኮት ይዘት ይመርምሩ።"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"በመንካት ያስሱን ያብሩ"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ከቅርብ ግኑኙነት መስክ (NFC) መለያዎች፣ ካርዶች እና አንባቢ ጋር ለማገናኘት ለመተግበሪያው ይፈቅዳሉ።"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"የማያ ገጽዎን መቆለፊያ ያሰናክሉ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"መተግበሪያው መቆለፊያውና ማንኛውም የተጎዳኘ የይለፍ ቃል ደህንነት እንዲያሰናክል ይፈቅድለታል። ለምሳሌ ስልኩ ገቢ የስልክ ጥሪ በሚቀበልበት ጊዜ መቆለፊያውን ያሰናክልና ከዚያም ጥሪው ሲጠናቀቅ መቆለፊያውን በድጋሚ ያነቃዋል።"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"የማያ ገጽ መቆለፊያ ውስብስብነትን ጠይቅ"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"መተግበሪያው የማያ ገጽ መቆለፊያው ውስብስብነት ደረጃ (ከፍተኛ፣ መካከለኛ፣ ዝቅተኛ ወይም ምንም) እንዲያውቅ ያስችለዋል፣ ይህም ሊሆኑ የሚችለው የማያ ገጽ መቆለፊያው ርዝመት እና አይነት ክልል ያመለክታል። መተግበሪያው እንዲሁም ለተጠቃሚዎች የማያ ገጽ መቆለፊያውን ወደተወሰነ ደረጃ እንዲያዘምኑት ሊጠቁማቸው ይችላል። የማያ ገጽ መቆለፊያው በስነጣ አልባ ጽሑፍ እንደማይከማች ልብ ይበሉ፣ በዚህም መተግበሪያው ትክክለኛውን የይለፍ ቃል አያውቅም።"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ባዮሜትራዊ ሃርድዌርን መጠቀም"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"መተግበሪያው የባዮሜትራዊ ሃርድዌር ለማረጋገጥ ስራ እንዲጠቀም ያስችለዋል"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"የጣት አሻራ ሃርድዌርን አስተዳድር"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"የፊት ማረጋገጫ ሃርድዌር ይጠቀሙ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"መተግበሪያው የማረጋገጫ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"ፊትን መሥራት አልተቻለም። እባክዎ እንደገና ይሞክሩ።"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"ፊት ከልክ በላይ ብሩህ ነው። እባክዎ በዝቅተኛ ብርሃን ውስጥ ይሞክሩት።"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"ፊት ከልክ በላይ ጨለም ያለ ነው። እባክዎ የብርሃን ምንጩን ይግለጹት።"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"እባክዎ ዳሳሹን ከፊት አሁንም ያርቁት።"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"እባክዎ ዳሳሹን ወደ ፊት ያስጠጉት።"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"እባክዎ ዳሳሽን ከፍ ያድርጉት።"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"እባክዎ ዳሳሽን ዝቅ ያድርጉት።"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"እባክዎ ዳስሽን ወደ ቀኝ ያንቀሳቅሱት።"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"እባክዎ ዳስሽን ወደ ግራ ያንቀሳቅሱት።"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"እባክዎ ዳሳሹ ላይ ይመልከቱ።"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"ምንም መልክ አልተገኘም።"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"ከልክ በላይ ብዙ እንቅስቃሴ።"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"እባክዎ ፊትዎን እንደገና ያስመዝግቡ"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"የተለየ ፊት ተገኝቷል።"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"በጣም ይመሳሰላል፣ እባክዎ የእርስዎን ፎቶ አነሳስ ይለውጡ"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"እባክዎ ወደ ካሜራው በቀጥታ ይመልከቱ።"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"እባክዎ ወደ ካሜራው በቀጥታ ይመልከቱ።"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"እባክዎ ጭንቅላትዎን ቀጥ ያድርጉ።"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"እባክዎ ከፊትዎ ላይ ያለውን ጨርቅ ያንሱ።"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"የፊት ሃርድዌር አይገኝም።"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"የፊት ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"ፊት ሊከማች አይችልም።"</string>
<string name="face_error_canceled" msgid="283945501061931023">"የፊት ሥርዓተ ክወና ተሰርዟል።"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"ፊትን ማረጋገጥ በተጠቃሚ ተሰርዟል።"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"በጣም ብዙ ሙከራዎች። የፊት ማረጋገጫ ተሰናክሏል።"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"እንደገና ይሞክሩ።"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"ምንም ፊት አልተመዘገበም።"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"ይህ መሣሪያ የፊት ማረጋገጫ ዳሳሽ የለውም።"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"ፊት <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g>ን ይክፈቱ"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ሳያስቀምጥ ይዘጋል"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> የማህደረ ትውስታ ገደብን አልፏል"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"የቆሻሻ ቁልል ተሰብስቧል። ለማጋራት መታ ያድርጉ።"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"የቆሻሻ ቁልል ይጋራ?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"የ<xliff:g id="PROC">%1$s</xliff:g> ሂደት የማህደረ ትውስታ ሂደት <xliff:g id="SIZE">%2$s</xliff:g> ገደቡን አልፏል። የቆሻሻ ቁልል ከገንቢው ጋር እንዲያጋሩ ለእርስዎ ሊገኝ ይችላል። ጥንቃቄ ያድርጉ፦ ይህ የቆሻሻ ቁልል መተግበሪያው መዳረሻ ያለው የሆነ የእርስዎ የግል መረጃን ሊይዝ ይችላል።"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"ለፅሁፍ ድርጊት ምረጥ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"የስልክ ጥሪ ድምፅ"</string>
<string name="volume_music" msgid="5421651157138628171">" ማህደረ መረጃ ክፍልፍል"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ሁሉንም አውታረ መረቦችን ለማየት መታ ያድርጉ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"አገናኝ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ሁሉም አውታረ መረቦች"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"በ<xliff:g id="NAME">%s</xliff:g> የተጠቆመ የWi-Fi አውታረ መረብ ይገኛል"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"በ<xliff:g id="NAME">%s</xliff:g> ከተጠቆሙ አውታረ መረቦች ጋር መገናኘት ይፈልጋሉ?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"አዎ"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"አይ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi በራስ-ሰር ይበራል"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ወደ አውታረ መረብ በመለያ ይግቡ"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi በይነመረብ መዳረሻ የለውም"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ለአማራጮች መታ ያድርጉ"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"ተገናኝቷል"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"በእርስዎ ሆትስፖት ቅንብሮች ላይ ለውጦች"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"የእርስዎ ሆትስፖት ባንድ ተለውጧል።"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ይህ መሣሪያ የእርስዎን ምርጫ ለ5GHz ብቻ አይደግፍም። በምትኩ፣ ይህ መሣሪያ ሲገኝ 5GHz ባንድ ይጠቀማል።"</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB አድስ ተያይዟል"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"የዩኤስቢ ማረሚያን ለማጥፋት መታ ያድርጉ"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ማረሚያ ላለማንቃት ምረጥ።"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"በዩኤስቢ ወደብ ውስጥ ፈሳሽ ወይም ፍርስራሽ"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"የዩኤስቢ ወደብ በራስ-ሰር ተሰናክሏል። የበለጠ ለመረዳት መታ ያድርጉ።"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"የዩኤስቢ ወደቡን መጠቀም አደጋ የለውም"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"የስራ መገለጫውን እገዳ ለማንሳት መታ ያድርጉ"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"ከ<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> ጋር ተገናኝቷል"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ፋይሎችን ለመመልከት መታ ያድርጉ"</string>
- <string name="pin_target" msgid="3052256031352291362">"ፒን"</string>
- <string name="unpin_target" msgid="3556545602439143442">"ንቀል"</string>
<string name="app_info" msgid="6856026610594615344">"የመተግበሪያ መረጃ"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ማሳያን በማስጀመር ላይ…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"የዕለት ተዕለት ሁነታ መረጃ ማሳወቂያዎች"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ባትሪ ከተለመደው ኃይል መሙላት በፊት ሊያልቅ ይችላል"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"የባትሪ ቆጣቢ የባትሪ ዕድሜን ለማራዘም ገብሯል።"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"አቃፊ"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"የAndroid መተግበሪያ"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ፋይል"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index e7dad2f..5a24461 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"ৱাই-ফাই কলিং"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"অফ হৈ আছে"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ৱাই-ফাইক অগ্ৰাধিকাৰ দিয়া হৈছে"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ম\'বাইলক অগ্ৰাধিকাৰ দিয়া হৈছে"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"কোৱল ৱাই-ফাই"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ফৰৱাৰ্ড কৰা নহ\'ল"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"বাগ সম্পর্কীয় অভিযোগ"</string>
<string name="global_action_logout" msgid="935179188218826050">"ছেশ্বন সমাপ্ত কৰক"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্ৰীণশ্বট"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"বাগ সম্পর্কীয় অভিযোগ লওক"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"এই কার্যই ইমেইল বাৰ্তা হিচাপে পঠিয়াবলৈ আপোনাৰ ডিভাইচৰ বৰ্তমান অৱস্থাৰ বিষয়ে তথ্য সংগ্ৰহ কৰিব৷ ইয়াক বাগ সম্পর্কীয় অভিযোগ পঠিওৱা কাৰ্য আৰম্ভ কৰোঁতে অলপ সময় লাগিব; অনুগ্ৰহ কৰি ধৈৰ্য ধৰক।"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ইণ্টাৰেক্টিভ অভিযোগ"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"বেছিভাগ পৰিস্থিতিত এয়া ব্যৱহাৰ কৰক। ই আপোনাক অভিযোগৰ অগ্ৰগতি ট্ৰেক কৰিবলৈ, সমস্যাটোৰ সম্পর্কে অধিক বিৱৰণ দিবলৈ আৰু স্ক্ৰীণশ্বট ল\'বলৈ অনুমতি দিয়ে। ই কম ব্যৱহাৰ হোৱা সেই শাখাসমূহক অন্তৰ্ভুক্ত নকৰিব পাৰে যিবোৰক অভিযোগ কৰিবলৈ দীৰ্ঘ সময়ৰ প্ৰয়োজন হয়।"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"অৱস্থান"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"এই ডিভাইচৰ অৱস্থান ব্যৱহাৰ কৰিব পাৰে"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক এই ডিভাইচটোৰ অৱস্থান জানিবলৈ অনুমতি দিবনে?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"আপুনি এই এপ্ ব্য়ৱহাৰ কৰি থাকোঁতে ই সদায় অৱস্থান চাব পাৰে।"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক সদায় এই ডিভাইচৰ অৱস্থান চাবলৈ অনুমতি দিবনে?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"আপুনি এই এপ্ ব্য়ৱহাৰ কৰি থকা নাই যদিও ই সদায় অৱস্থান চাব পাৰে।"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"কেলেণ্ডাৰ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"আপোনাৰ কেলেণ্ডাৰ ব্যৱহাৰ কৰিব পাৰে"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ কেলেণ্ডাৰ চাবলৈ অনুমতি দিবনে?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক আপোনাৰ সংগীত এক্সেছ কৰিবলৈ দিবনে?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ফট’ আৰু ভিডিঅ’"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"আপোনাৰ ফট’ আৰু ভিডিঅ’সমূহ এক্সেছ কৰিবলৈ"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"টেগ কৰা অৱস্থানসহ আপোনাৰ ফট’ আৰু ভিডিঅ’ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ক এক্সেছ কৰিবলৈ দিবনে?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ৱিণ্ড’ সমল বিচাৰি উলিওৱাৰ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"আপুনি চাই থকা ৱিণ্ড’খনৰ সমল পৰীক্ষা কৰাৰ।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পৰ্শৰ দ্বাৰা অন্বেষণ কৰাৰ সুবিধা অন কৰাৰ"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"এপটোক নিয়েৰ ফিল্ড কমিউনিকেশ্বন (NFC) টেগ, কাৰ্ড আৰু ৰিডাৰসমূহৰ সৈতে যোগাযোগ কৰিবলৈ অনুমতি দিয়ে।"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"আপোনাৰ স্ক্ৰীণ ল\'ক অক্ষম কৰক"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"এপটোক কী ল\'ক আৰু জড়িত হোৱা যিকোনো পাছৱৰ্ডৰ সুৰক্ষা অক্ষম কৰিব দিয়ে৷ উদাহৰণস্বৰূপে, কোনো অন্তৰ্গামী ফ\'ন কল উঠোৱাৰ সময়ত ফ\'নটোৱে কী-লকটো অক্ষম কৰে, তাৰ পিছত কল শেষ হ\'লেই কী লকটো পুনৰ সক্ষম কৰে৷"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"স্ক্ৰীণ লকৰ জটিলতাৰ অনুৰোধ জনোৱা"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"এপটোক স্ক্ৰীণ ল’কৰ জটিলতাৰ স্তৰ (উচ্চ, মধ্যম, নিম্ন বা একেবাৰে নাই), শিকিবলৈ অনুমতি দিয়ে ই স্ক্ৰীণ ল’কৰ সম্ভাব্য দৈৰ্ঘ্য বা স্ক্ৰীণ ল’কৰ প্ৰকাৰ দৰ্শায়। লগতে এপটোৱে ব্যৱহাৰকাৰীক স্ক্ৰীণ ল’কটো এটা নিৰ্দিষ্ট স্তৰলৈ আপডে’ট কৰিবলৈ পৰামৰ্শ দিব পাৰে যিটো ব্যৱহাৰকাৰীয়ে উপেক্ষা কৰি পৰৱর্তী পৃষ্ঠালৈ যাব পাৰে। মনত ৰাখিব যে স্ক্ৰীণ ল’কটো সাধাৰণ পাঠ হিচাপে সঞ্চয় কৰা নহয় সেয়ে এপটোৱে সঠিক পাছৱৰ্ডটো জানিব নোৱাৰে।"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"বায়োমেট্ৰিক হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰক"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"বিশ্বাসযোগ্য়তা প্ৰমাণীকৰণৰ বাবে এপক বায়োমেট্ৰিক হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰিবলৈ অনুমতি দিয়ে"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ পৰিচালনা কৰিব পাৰে"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"মুখমণ্ডলৰ টেম্প্লেট যোগ কৰাৰ বা মচাৰ পদ্ধতি কামত লগাবলৈ আহ্বান কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্যৱহাৰ কৰক"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"বিশ্বাসযোগ্য়তা প্ৰমাণীকৰণৰ বাবে এপক মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰিবলৈ অনুমতি দিয়ে"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"মুখমণ্ডল চিনাক্ত কৰিব পৰা নাই; আকৌ চেষ্টা কৰক।"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"মুখমণ্ডল অত্যন্ত উজ্জ্বল হৈছে। অনুগ্ৰহ কৰি পোহৰ কম থকা ঠাইত চেষ্টা কৰক।"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"মুখমণ্ডল অত্যন্ত আন্ধাৰ হৈছে। অনুগ্ৰহ কৰি পোহৰ থকা ঠাইলৈ যাওক।"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"অনুগ্ৰহ কৰি মুখৰ পৰা ছেন্সৰ অলপ দূৰত ৰাখক।"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"অনুগ্ৰহ কৰি ছেন্সৰটো মুখৰ ওচৰলৈ আনক।"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"অনুগ্ৰহ কৰি ছেন্সৰটো ওপৰলৈ নিয়ক।"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"অনুগ্ৰহ কৰি ছেন্সৰটো তললৈ নিয়ক।"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"অনুগ্ৰহ কৰি ছেন্সৰটো সোঁফাললৈ নিয়ক।"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"অনুগ্ৰহ কৰি ছেন্সৰটো বাওঁফাললৈ নিয়ক।"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"অনুগ্ৰহ কৰি ছেন্সৰটোলৈ চাওক।"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"কোনো মুখমণ্ডল চিনাক্ত কৰিব পৰা নগ’ল।"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"বেছি লৰচৰ কৰি আছে।"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক।"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"অন্য মুখমণ্ডল চিনাক্ত কৰা হৈছে।"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"একে ধৰণৰ হৈছে, অনুগ্ৰহ কৰি আপোনাৰ প’জটো সলনি কৰক।"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"অনুগ্ৰহ কৰি পোনে পোনে কেমেৰালৈ চাওক।"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"অনুগ্ৰহ কৰি পোনে পোনে কেমেৰালৈ চাওক।"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"অনুগ্ৰহ কৰি আপোনাৰ মূৰটো উলম্বভাৱে চিধা কৰক।"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"আপোনাৰ মুখমণ্ডলৰপৰা আৱৰণ আঁতৰাওক।"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"মুখমণ্ডলৰ হাৰ্ডৱেৰ উপলব্ধ নহয়।"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"মুখমণ্ডল গ্ৰহণৰ সময়সীমা উকলি গৈছে। আকৌ চেষ্টা কৰক।"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"মুখমণ্ডল সঞ্চয় কৰিব নোৱাৰি।"</string>
<string name="face_error_canceled" msgid="283945501061931023">"মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল।"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"ব্যৱহাৰকাৰীয়ে মুখমণ্ডলৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ বাতিল কৰিছে।"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"অত্যধিক প্ৰয়াস। মুখমণ্ডলৰ জৰিয়তে সত্যাপন অক্ষম কৰা হ’ল।"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"আকৌ চেষ্টা কৰক।"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"কোনো মুখমণ্ডল যোগ কৰা নহ’ল।"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"এই ডিভাইচটোত মুখমণ্ডল সত্যাপন ছেন্সৰ নাই।"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"মুখমণ্ডল <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> খোলক"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ছেভ নকৰাকৈ বন্ধ হ\'ব"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> মেম\'ৰিৰ সীমা অতিক্ৰম কৰিছে"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"হীপ ডাম্প সংগ্ৰহ কৰা হ’ল। শ্বেয়াৰ কৰিবলৈ টিপক"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"হীপ ডাম্প শ্বেয়াৰ কৰিবনে?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"এই <xliff:g id="PROC">%1$s</xliff:g> প্ৰক্ৰিয়াটোৱে তাৰ মেম\'ৰিৰ সীমা <xliff:g id="SIZE">%2$s</xliff:g> অতিক্ৰম কৰিছে। ইয়াৰ বিকাশকৰ্তাৰ সৈতে আপুনি শ্বেয়াৰ কৰিবপৰাকৈ হীপ ডাম্প মজুত আছে। সাৱধান হ\'ব: এই হীপ ডাম্পত এপ্লিকেশ্বনটোৱে ব্যৱহাৰ কৰা আপোনাৰ কোনো ব্য়ক্তিগত তথ্য়ও থাকিব পাৰে।"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"বার্তাৰ বাবে কাৰ্য বাছনি কৰক"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ৰিংগাৰৰ ধ্বনি"</string>
<string name="volume_music" msgid="5421651157138628171">"মিডিয়াৰ ধ্বনি"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সকলো নেটৱৰ্ক চাবলৈ টিপক"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"সংযোগ কৰক"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"সকলো নেটৱৰ্ক"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g>এ প্ৰস্তাৱ কৰা এটা ৱাই-ফাই নেটৱৰ্ক উপলব্ধ হৈছে"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"আপুনি <xliff:g id="NAME">%s</xliff:g>এ প্ৰস্তাৱ কৰা নেটৱৰ্ককেইটাৰ সৈতে সংযোগ কৰিবনে?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"হয়"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"নহয়"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ৱাই-ফাই স্বয়ংক্ৰিয়ভাৱে অন হ\'ব"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"নেটৱৰ্কত ছাইন ইন কৰক"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"ৱাই-ফাইত ইণ্টাৰনেট নাই"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"অধিক বিকল্পৰ বাবে টিপক"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"সংযোগ কৰা হ’ল"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"আপোনাৰ হটস্পট ছেটিংসমূহত কৰা সালসলনি"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"আপোনাৰ হটস্পটৰ বেণ্ড সলনি কৰা হ’ল।"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"আপোনাৰ কেৱল ৫গিগাহাৰ্টজৰ প্ৰতি অগ্ৰাধিকাৰ এই ডিভাচইচটোৱে সমৰ্থন নকৰে। ইয়াৰ পৰিৱৰ্তে, ডিভাচইচটোৱে যেতিয়া ৫গিগাহাৰ্টজ বেণ্ড উপলব্ধ হ’ব তেতিয়া সেইয়া ব্যৱহাৰ কৰিব।"</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"ইউএছবি ডিবাগিং সংযোগ কৰা হ’ল"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"ইউএছবি ডিবাগিং বন্ধ কৰিবলৈ টিপক"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ইউএছবি ডিবাগিং অক্ষম কৰিবলৈ বাছনি কৰক।"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"ইউএছবি প’ৰ্টত তৰল বা ধূলি-মাকতি আছে"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"ইউএছবি প’ৰ্ট স্বয়ংক্ৰিয়ভাৱে অক্ষম কৰা হয়। অধিক জানিবৰ বাবে টিপক।"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"ইউএছবি প’ৰ্ট ব্যৱহাৰ কৰিব পৰাকৈ নিৰাপদ"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"কৰ্মস্থানৰ প্ৰ’ফাইল আনলক কৰিবলৈ টিপক"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g>ৰ সৈতে সংযুক্ত হৈ আছে"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ফাইলসমূহ চাবৰ বাবে টিপক"</string>
- <string name="pin_target" msgid="3052256031352291362">"পিন"</string>
- <string name="unpin_target" msgid="3556545602439143442">"আনপিন"</string>
<string name="app_info" msgid="6856026610594615344">"এপ্ সম্পৰ্কীয় তথ্য"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ডেম\' আৰম্ভ কৰি থকা হৈছে…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ৰুটিন ম’ডৰ তথ্য জাননী"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"চ্চাৰ্জ কৰাৰ সচৰাচৰ সময়ৰ আগতেই বেটাৰি শেষ হ’ব পাৰে"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"বেটাৰিৰ খৰচ কমাবলৈ বেটাৰি সঞ্চয়কাৰী অন কৰা হৈছে"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ফ’ল্ডাৰ"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android এপ্লিকেশ্বন"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ফাইল"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 7186da9..9ac4a2a 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"WiFi Zəngi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Deaktiv"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi tərcih edilir"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobil tərcih"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Yalnız Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Baq hesabatı"</string>
<string name="global_action_logout" msgid="935179188218826050">"Sessiyanı sonlandırın"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skrinşot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Baqı xəbər verin"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Bu, sizin hazırkı cihaz durumu haqqında məlumat toplayacaq ki, elektron məktub şəklində göndərsin. Baq raportuna başlamaq üçün bir az vaxt lazım ola bilər, bir az səbr edin."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"İnteraktiv hesabat"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Bir çox hallarda bundan istifadə edin. Bu hesabatın gedişatını izləməyə, problem haqqında daha ətraflı məlumat daxil etməyə və skrinşot etməyə imkan verir. Bu, çox vaxt tələb edən bəzi az istifadə olunan bölmələri ixtisar edə bilər."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Yer"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"cihazın yerini bilmək"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tətbiqinə bu cihazın məkanına daxil olmaq icazəsi verilsin?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Tətbiq yalnız ondan istifadə etiyiniz zaman məkanı əldə edə bilər."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tətbiqinə bu cihazın məkanına daxil olmaq icazəsi verilsin?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Tətbiq hətta ondan istifadə etmədiyiniz zaman belə məkanı əldə edə bilər."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Təqvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"təqvimə daxil olun"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tətbiqinə təqvimə daxil olmaq icazəsi verilsin?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tətbiqinin musiqiyə daxil olmağına icazə verilsin?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Foto və videolar"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"foto və videolara daxil olun"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tətbiqinə işarələnmiş məkanlar daxil olmaqla, foto və videolara girişinə icazə verilsin?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pəncərənin məzmununu əldə edin"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Əlaqədə olduğunuz pəncərənin məzmununu nəzərdən keçirin."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Toxunaraq Kəşf et funksiyasını yandırın"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Tətbiqə Yaxın Məsafə Kommunikasiyası (NFC) teqləri, kartları və oxuyucuları ilə əlaqə qurmağa icazə verir."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"Ekran kilidini deaktiv edir"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Tətbiqə kilid açarını və təhlükəsizlik parolunu deaktiv etməyə imkan verir. Qanuni misal budur ki, telefon zəng qəbul edən zaman kilidi açır və zəng qurtarandan sonra kilidi bağlayır."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ekran kilidi mürəkkəbliyi tələb edin"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Tətbiqə ekran kilidinin uzunluq intervalı və növünü göstərən ekran kilidi mürəkkəbliliyinin səviyyəsini (yüksək, orta, aşağı və ya heç biri) öyrənməyə icazə verir. Tətbiq, istifadəçilərə ekran kilidini müəyyən səviyyəyə yeniləməyi təklif edə bilər, lakin istifadəçilər istənilən vaxt bunu iqnor edə bilər. Nəzərə alın ki, ekran kilidi açıq şəkildə saxlanılmır, buna görə də tətbiq dəqiq parolu bilmir."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"biometrik proqramdan istifadə edin"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Doğrulama üçün biometrik proqramdan istifadə etməyə imkan verir"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"barmaq izi avadanlığını idarə edin"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Proqramdan istifadə üçün barmaq izi şablonlarını əlavə etmək və silmək məqsədilə üsullara müraciət etməyə imkan verir."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"üz identifikasiyası proqramından istifadə edin"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tətbiqin üz identifikasiyası proqramından identifikasiya zamanı istifadə etməsinə icazə verir"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Üz tanınmadı. Yenidən cəhd edin."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Üz çox parlaqdır. Daha zəif işıqda sınayın."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Üz çox tünddür. İşığı ortaya çıxarın."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Sensoru üzdən kənara gətirin."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Sensoru üzə biraz da yaxınlaşdırın."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Sensoru daha yuxarı gətirin."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Sensoru daha aşağı gətirin."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Sensoru sağa gətirin."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Sensoru sola gətirin."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Sensora baxın."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Üz aşkarlanmadı."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Cihazı sabit saxlayın."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Üzünüzü yenidən qeydiyyatdan keçirin."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Fərqli üz aşkar edildi."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Digəri ilə oxşardır, pozanızı dəyişin."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Birbaşa kameraya baxın."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Birbaşa kameraya baxın."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Başınızı şaquli istiqamətdə qaldırın."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Üzünüzü açıq saxlayın."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Üz proqramı əlçatan deyil."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Üz proqramı taymerinin vaxtı bitdi. Yenidən cəhd edin."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Üz bərpa edilmədi."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Üz əməliyyatı ləğv edildi."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Üz dorğulaması istifadəçi tərəfindən ləğv edildi."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Həddindən çox cəhd. Sonraya saxlayın."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Həddindən çox cəhd. Üz identifikasiyası deaktiv edildi."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Yenidən cəhd edin."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Üz qeydə alınmayıb."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Bu cihazda üz identifikasiyası sensoru yoxdur."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Üz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> tətbiqini açın"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> yadda saxlamadan bağlanacaq"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> yaddaş limitini keçdi"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Şəkil çəkildi. Paylaşmaq üçün klikləyin."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Yığın paylaşılsın?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> prosesi <xliff:g id="SIZE">%2$s</xliff:g> ölçüsünün yaddaş limitini prosesini keçib. Yığın tərtibatçısı ilə paylaşmaq üçün sizə istifadəsi mümkündür. Ehtiyatlı olun: bu yığında proqramın giriş icazəsi olduğu şəxsi məlumatlarınız ola bilər."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Mətn üçün əməliyyat seçin"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Zəngin səs gücü"</string>
<string name="volume_music" msgid="5421651157138628171">"Media həcmi"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Bütün şəbəkələri görmək üçün klikləyin"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Qoşulun"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Bütün şəbəkələr"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> tərəfindən təklif edilən Wi‑Fi şəbəkəsi əlçatandır"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"<xliff:g id="NAME">%s</xliff:g> tərəfindən təklif edilən şəbəkələrə qoşulmaq istəyirsiniz?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Bəli"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Xeyr"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi avtomatik olaraq aktiv ediləcək"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Şəbəkəyə daxil olun"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi şəbəkəsinin internetə girişi yoxdur"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Seçimlər üçün tıklayın"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Qoşuldu"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot ayarlarınızda dəyişiklik"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot qrupu dəyişdi."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Bu cihaz yalnız 5GHz üçün tərcihinizi dəstəkləmir. Əvəzinə əlçatan olduqda bu cihaz 5GHz qrupundan istifadə edəcək."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB sazlama qoşuludur"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB sazlamanı deaktiv etmək üçün klikləyin"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USb debaqı deaktivasiya etməyi seçin."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB portuna maye sızıb və ya qırılıb"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB portu avtomatik deaktiv edildi. Ətraflı məlumat üçün klikləyin."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB portundan istifadə təhlükəsizdir"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"İş profilinin kilidini açmaq üçün tıklayın"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> məhsuluna bağlandı"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Faylları görmək üçün basın"</string>
- <string name="pin_target" msgid="3052256031352291362">"Pin kod"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Çıxarın"</string>
<string name="app_info" msgid="6856026610594615344">"Tətbiq məlumatı"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Demo başlayır…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rejim üçün məlumat bildirişi"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batareya həmişəki vaxtdan əvvəl bitə bilər"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Enerjiyə Qənaət rejimi batareya istifadəsinin müddətini artırmaq üçün aktiv edilir"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Qovluq"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android tətbiqi"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fayl"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 788b5d6..363b5ea 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -142,8 +142,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Pozivanje preko Wi-Fi-ja"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Isključeno"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Prednost ima Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Želim mobilne podatke"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Samo Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije prosleđeno"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -230,7 +232,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Izveštaj o grešci"</string>
<string name="global_action_logout" msgid="935179188218826050">"Završi sesiju"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Napravi izveštaj o grešci"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Ovim će se prikupiti informacije o trenutnom stanju uređaja kako bi bile poslate u poruci e-pošte. Od započinjanja izveštaja o grešci do trenutka za njegovo slanje proći će neko vreme; budite strpljivi."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv. izveštaj"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Koristite ovo u većini slučajeva. To vam omogućava da pratite napredak izveštaja, da unosite dodatne detalje o problemu i da snimate snimke ekrana. Verovatno će izostaviti neke manje korišćene odeljke za koje pravljenje izveštaja dugo traje."</string>
@@ -284,9 +287,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupi lokaciji ovog uređaja"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa lokaciji ovog uređaja?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacija će imati pristup lokaciji samo dok koristite aplikaciju."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa lokaciji ovog uređaja?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacija će uvek imati pristup lokaciji, čak i kada ne koristite aplikaciju."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupi kalendaru"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa kalendaru?"</string>
@@ -319,7 +325,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Želite li da omogućite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa muzici?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Slike i video snimci"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pristup slikama i video snimcima"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Želite li da dozvolite da „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pristupa slikama i video snimcima, uključujući označene lokacije?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"da preuzima sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Proverava sadržaj prozora sa kojim ostvarujete interakciju."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"da uključi Istraživanja dodirom"</string>
@@ -512,8 +521,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Dozvoljava aplikaciji da komunicira sa oznakama, karticama i čitačima komunikacije kratkog dometa (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"onemogućavanje zaključavanja ekrana"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Dozvoljava aplikaciji da onemogući zaključavanje tastature i sve povezane bezbednosne mere sa lozinkama. Na primer, telefon onemogućava zaključavanje tastature pri prijemu dolaznog telefonskog poziva, a zatim ga ponovo omogućava po završetku poziva."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"traženje složenosti zaključavanja ekrana"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Dozvoljava aplikaciji da sazna nivo složenosti zaključavanja ekrana (visoka, srednja, niska ili nijedna), što ukazuje na mogući opseg trajanja i tip zaključavanja ekrana. Aplikacija može i da predlaže korisnicima da ažuriraju zaključavanje ekrana na određeni nivo, ali korisnici slobodno mogu da zanemare to i da idu na druge stranice. Imajte na umu da se podaci za zaključavanje ekrana ne čuvaju kao običan tekst, pa aplikacija ne zna tačnu lozinku."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"koristi biometrijski hardver"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Dozvoljava aplikaciji da koristi biometrijski hardver za potvrdu identiteta"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"upravljaj hardverom za otiske prstiju"</string>
@@ -568,37 +579,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Dozvoljava da aplikacija aktivira metode za dodavanje i brisanje šablona lica radi korišćenja."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"korišćenje hardv. za potvrdu identiteta pomoću lica"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Dozvoljava da aplikacija koristi hardver za potvrdu identiteta pomoću lica"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Obrada lica nije uspela. Probajte ponovo."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Lice je presvetlo. Probajte sa slabijim osvetljenjem."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Lice je isuviše tamno. Otkrijte izvor svetla."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Udaljite senzor od lica."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Približite senzor licu."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Pomerite senzor naviše."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Pomerite senzor naniže."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Pomerite senzor udesno."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Pomerite senzor ulevo."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Gledajte u senzor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nije otkriveno nijedno lice."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Mnogo se pomerate."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrujte lice."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Otkriveno je drugo lice."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Previše je slično, promenite pozu."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Gledajte pravo u kameru."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Gledajte pravo u kameru."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Ispravite glavu."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Otkrijte lice."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Harvder za lice nije dostupan."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Isteklo je vreme za proveru lica. Probajte ponovo."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće sačuvati lice."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Obrada lica je otkazana."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Korisnik je otkazao potvrdu lica."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Probajte ponovo kasnije."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Više pokušaja. Potvrda identiteta je onemogućena."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Probajte ponovo."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nije registrovano nijedno lice."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Ovaj uređaj nema senzor za potvrdu identiteta pomoću lica."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1233,9 +1266,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Otvori <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> će se zatvoriti bez čuvanja"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> premašuje ograničenje memorije"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Snimak dinamičkog dela memorije je napravljen. Dodirnite za deljenje."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Želite li da delite snimak dinamičkog dela memorije?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> je premašio ograničenje memorije za proces od <xliff:g id="SIZE">%2$s</xliff:g>. Snimak dinamičkog dela memorije je dostupan i možete da ga delite sa programerom. Budite oprezni: ovaj snimak dinamičkog dela memorije može da sadrži neke lične podatke kojima aplikacija može da pristupa."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Izaberite radnju za tekst"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Jačina zvuka zvona"</string>
<string name="volume_music" msgid="5421651157138628171">"Jačina zvuka medija"</string>
@@ -1276,8 +1316,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da biste videli sve mreže"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Poveži"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Wi‑Fi mreža koju predlaže <xliff:g id="NAME">%s</xliff:g> je dostupna"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Želite li da se povežete na mreže koje predlaže <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi će se automatski uključiti"</string>
@@ -1289,9 +1331,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Prijavite se na mrežu"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nema pristup internetu"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Povezano je"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Promene podešavanja za hotspot"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Opseg hotspota je promenjen."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ovaj uređaj ne podržava podešavanje samo za 5 GHz. Uređaj će koristiti opseg od 5 GHz kada bude dostupan."</string>
@@ -1376,6 +1423,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Otklanjanje grešaka sa USB-a je omogućeno"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Dodirnite da biste isključili otklanjanje grešaka sa USB-a"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Izaberite da biste onemogućili otklanjanja grešaka sa USB-a."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Tečnost ili nečistoća u USB portu"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB port je automatski isključen. Dodirnite da biste saznali više."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Korišćenje USB porta je bezbedno"</string>
@@ -1939,8 +1990,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Dodirom otklj. profil za Work"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Povezano je sa proizvodom <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Dodirnite za pregled datoteka"</string>
- <string name="pin_target" msgid="3052256031352291362">"Zakači"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Otkači"</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Pokrećemo demonstraciju..."</string>
@@ -2032,6 +2081,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Obaveštenje o informacijama Rutinskog režima"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterija će se možda isprazniti pre uobičajenog punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Ušteda baterije je aktivirana da bi se produžilo trajanje baterije"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Direktorijum"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android aplikacija"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Datoteka"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 83b268a..18e345a 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -143,8 +143,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi-тэлефанія"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWi-Fi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Выкл."</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Прыярытэт Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Прыярытэт мабільнай сеткі"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Толькі Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не пераадрасоўваецца"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -232,7 +234,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Справаздача пра памылкі"</string>
<string name="global_action_logout" msgid="935179188218826050">"Скончыць сеанс"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Здымак экрана"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Справаздача пра памылку"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Будзе збiрацца iнфармацыя пра бягучы стан прылады, якая будзе адпраўляцца на электронную пошту. Стварэнне справаздачы пра памылкi зойме некаторы час."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Інтэрактыўная справаздача"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Выкарыстоўвайце ў большасці выпадкаў. Гэта дазваляе сачыць за ходам справаздачы, уводзіць дадатковыя звесткі аб праблеме і рабіць здымкі экрана. Могуць быць прапушчаны некаторыя раздзелы, якія выкарыстоўваюцца менш і паведамленне пра якія займае шмат часу."</string>
@@ -287,9 +290,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Месцазнаходжанне"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"атрымліваць доступ да месцазнаходжання гэтай прылады"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ да звестак аб месцазнаходжанні гэтай прылады?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Праграма будзе мець доступ да звестак пра месцазнаходжанне, толькі калі яна выкарыстоўваецца."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> мець доступ да месцазнаходжання?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Праграма заўсёды будзе мець доступ да звестак пра месцазнаходжанне, нават калі яна не выкарыстоўваецца."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Каляндар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"атрымліваць доступ да вашага календара"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ да вашага календара?"</string>
@@ -322,7 +328,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Дазволіць праграме <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ да музыкі?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Фота і відэа"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"доступ да фота і відэа"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Дазволіць <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ да фота і відэа, у тым ліку з пазначаным месцам?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Атрымліваць змесціва вакна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Аналізаваць змесціва актыўнага вакна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Уключаць Азнаямленне дотыкам"</string>
@@ -515,8 +524,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Дазваляе прыкладаннzv спалучацца з тэгамі, картамі і счытваючымі прыладамі Near Field Communication (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"адключэнне блакiроўкi экрана"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Дазваляе прыкладанням адключаць блакiроўку клавіятуры і любыя сродкі абароны, звязаныя з паролем. Прыкладам гэтага з\'яўляецца адключэнне тэлефонам блакiроўкi клавіятуры пры атрыманні ўваходнага выкліку і паўторнае ўключэнне блакiроўкi клавіятуры, калі выклік завершаны."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"запытваць узровень складанасці блакіроўкі экрана"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Дазваляе праграме вызначаць узровень складанасці блакіроўкі экрана (высокі, сярэдні, нізкі ці нулявы), які залежыць ад даўжыні пароля і ад тыпу блакіроўкі экрана. Праграма можа прапанаваць карыстальнікам ускладніць блакіроўку экрана, аднак гэту прапанову можна ігнараваць. Заўважце, што праграма не можа ведаць тып і пароль блакіроўкі экрана, таму што яны захоўваюцца ў зашыфраваным выглядзе."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"выкарыстоўваць біяметрычнае абсталяванне"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Дазваляе праграме выкарыстоўваць для аўтэнтыфікацыі біяметрычнае абсталяванне"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"кіраваць апаратнымі сродкамі для адбіткаў пальцаў"</string>
@@ -571,37 +582,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Праграма зможа дадаваць і выдаляць шаблоны твару."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"карыстацца абсталяваннем для распазнавання твару"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Праграма зможа выкарыстоўваць абсталяванне распазнавання твару для аўтэнтыфікацыі"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Не ўдалося распазнаць твар. Паўтарыце спробу."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Твар занадта светлы. Паспрабуйце зменшыць святло."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Твар занадта цёмны. Павялічце асвятленне."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Перамясціце датчык далей ад твару."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Наблізьце датчык да твару."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Падыміце датчык вышэй."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Апусціце датчык ніжэй."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Перамясціце датчык управа."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Перамясціце датчык улева."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Глядзіце на датчык."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Твар не знойдзены."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Трымайце прыладу нерухома."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Паўтарыце рэгістрацыю твару."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Выяўлены іншы твар."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Не бачна розніцы. Памяняйце позу."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Глядзіце прама ў камеру."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Глядзіце прама ў камеру."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Выраўнуйце галаву."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Твар павінен быць добра бачны."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Абсталяванне для распазнавання твару недаступнае."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Час чакання твару выйшаў. Паўтарыце спробу."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Не ўдалося захаваць твар."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Распазнаванне твару скасавана."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Распазнаванне твару скасавана карыстальнікам."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Занадта шмат спроб. Паўтарыце спробу пазней."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Занадта шмат спроб. Аўтэнтыфікацыя твару адключана"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Паўтарыце спробу."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Твар не зарэгістраваны."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"На гэтай прыладзе адсутнічае датчык аўтэнтыфікацыі твару."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Твар <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1253,9 +1286,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Адкрыць праграму \"<xliff:g id="NEW_APP">%1$s</xliff:g>\""</string>
<string name="new_app_description" msgid="5894852887817332322">"Праграма \"<xliff:g id="OLD_APP">%1$s</xliff:g>\" будзе закрыта. Даныя не будуць захаваны"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Працэс <xliff:g id="PROC">%1$s</xliff:g> перавысіў ліміт памяці"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Быў сабраны дамп кучы; абагульце дотыкам."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Абагуліць дамп дынамічнай вобласці?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Працэс <xliff:g id="PROC">%1$s</xliff:g> перавысіў ліміт памяці працэсу <xliff:g id="SIZE">%2$s</xliff:g>. Дамп дынамічнай вобласці даступны для вас, вы можаце абагуліць яго з распрацоўшчыкам. Будзьце асцярожныя: гэты дамп дынамічнай вобласці можа ўтрымліваць асабістую інфармацыю, да якой маюць доступ праграмы."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Выберыце дзеянне для тэкста"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Гучнасць званка"</string>
<string name="volume_music" msgid="5421651157138628171">"Гучнасць прайгравальніка"</string>
@@ -1298,8 +1338,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Дакраніцеся, каб убачыць усе сеткі"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Падключыцца"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Усе сеткі"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Даступная сетка Wi‑Fi, прапанаваная праграмай <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Падключыцца да сетак, прапанаваных праграмай <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Так"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Не"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi уключыцца аўтаматычна"</string>
@@ -1311,9 +1353,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Увайдзіце ў сетку"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"У Wi-Fi няма доступу да інтэрнэту"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Дакраніцеся, каб убачыць параметры"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Падключана"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Змяненні ў наладах хот-спота"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Частата хот-спота змянілася."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Прылада не можа працаваць толькі на частаце 5 ГГц. Гэта частата будзе выкарыстоўвацца, калі гэта магчыма."</string>
@@ -1398,6 +1445,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Адладка па USB падключана"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Націсніце, каб адключыць адладку па USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Выберыце, каб адключыць адладку USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Вадкасць або смецце ў порце USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Порт USB аўтаматычна адключаны. Каб даведацца больш, націсніце тут."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Можна бяспечна выкарыстоўваць порт USB"</string>
@@ -1973,8 +2024,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Кран., каб разбл. раб. профіль"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Падлучана да <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Краніце для прагляду файлаў"</string>
- <string name="pin_target" msgid="3052256031352291362">"Замацаваць"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Адмацаваць"</string>
<string name="app_info" msgid="6856026610594615344">"Інфармацыя пра праграму"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Ідзе запуск дэманстрацыі…"</string>
@@ -2067,6 +2116,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Апавяшчэнне з інфармацыяй пра ўсталяваны рэжым"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Акумулятар можа разрадзіцца хутчэй, чым прыйдзе час звычайнай зарадкі"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Каб павялічыць тэрмін работы акумулятара, уключаны рэжым эканоміі зараду"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Праграма Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index da29c0e..2311322 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Обаждания през Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Изключено"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Предпочита се Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Предпочитат се мобилни данни"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Само Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Не е пренасочено"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Сигнал за програмна грешка"</string>
<string name="global_action_logout" msgid="935179188218826050">"Прекратяване на сесията"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Екранна снимка"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Сигнал за програмна грешка"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"По този начин ще се събере информация за текущото състояние на устройството ви, която да се изпрати като имейл съобщение. След стартирането на процеса ще мине известно време, докато сигналът за програмна грешка бъде готов за подаване. Моля, имайте търпение."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактивен сигнал"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Използвайте тази опция в повечето случаи. Тя ви позволява да следите напредъка на сигнала, да въвеждате допълнителни подробности за проблема и да правите екранни снимки. Възможно е да бъдат пропуснати някои по-рядко използвани секции, за които подаването на сигнал отнема дълго време."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Местоположение"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"получи достъп до местоположението на това устройство"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Да се разреши ли на <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да осъществява достъп до местоположението на това устройство?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Само когато използвате приложението, то ще има достъп до местоположението."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Да се разреши ли на <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> достъп до местопол. на у-вото?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Дори когато не използвате приложението, то винаги ще има достъп до местоположението."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"има достъп до календара ви"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Да се разреши ли на <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да осъществява достъп до календара ви?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Да се разреши ли на <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да осъществява достъп до музиката ви?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Снимки и видеоклипове"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"достъп до снимките и видеоклиповете ви"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Да се разреши ли на <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> достъп до снимките и видеоклиповете ви, включително маркерите за местоположение?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Извличане на съдържанието от прозореца"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Инспектиране на съдържанието на прозорец, с който взаимодействате."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включване на изследването чрез докосване"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Разрешава на приложението да комуникира с маркери, карти и четци, ползващи комуникация в близкото поле (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"деактивиране на заключването на екрана ви"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Разрешава на приложението да деактивира заключването на клавиатурата и свързаната защита с парола. Например телефонът деактивира заключването при получаване на входящо обаждане и после го активира отново, когато обаждането завърши."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"заявяване на сложност на опцията за заключване на екрана"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Разрешава на приложението да разбере нивото на сложност на опцията за заключване на екрана (високо, средно, ниско или липса на такова), което указва възможния диапазон на дължината и типа на опцията. Приложението може също да предложи на потребителите да актуализират опцията за заключване на екрана до определено ниво, но те могат да пренебрегнат това и да излязат от него. Обърнете внимание, че опцията за заключване на екрана не се съхранява като обикновен текст, така че приложението не знае точната парола."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"използване на хардуера за биометрични данни"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Разрешава на приложението да използва хардуера за биометрични данни с цел удостоверяване"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"управление на хардуера за отпечатъци"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Разрешава на прил. да извиква методи за добавяне и изтриване на лицеви шаблони за ползване"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"използване на хардуера за удостоверяване с лице"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Разрешава на приложението при необходимост да използва хардуера за удостоверяване с лице"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Лицето не можа да се обработи. Опитайте отново."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Лицето е твърде осветено. Oпитайте на по-тъмно."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Лицето е твърде тъмно. Моля, осветете го по-добре."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Моля, отдалечете сензора от лицето си."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Моля, приближете сензора към лицето си."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Моля, повдигнете сензора."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Моля, преместете сензора надолу."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Моля, преместете сензора надясно."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Моля, преместете сензора наляво."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Моля, гледайте към сензора."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Не е открито лице."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Стабилизирайте устройството."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Моля, регистрирайте лицето си отново."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Разпознато е различно лице."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Позата ви е сходна с предишна. Моля, променете я."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Моля, гледайте по-директно към камерата."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Моля, гледайте по-директно към камерата."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Моля, изправете главата си."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Моля, открийте лицето си."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Няма достъп до хардуера за лице."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Времето за изчакване изтече. Опитайте отново."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Лицето не може да бъде съхранено."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Операцията с лице е анулирана."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Удостоверяв. на лицето е анулирано от потребителя."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Твърде много опити. Опитайте отново по-късно."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Твърде много опити. Удост. с лице е деактивирано."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Опитайте отново."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Няма регистрирано лице."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Това устройство няма сензор за удостоверяване с лице."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Отваряне на <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ще се затвори без запазване"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> надхвърли ограничението за памет"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Извлечена е моментна снимка на паметта. Докоснете, за да я споделите."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Да се сподели ли моментната снимка на паметта?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Процесът <xliff:g id="PROC">%1$s</xliff:g> надхвърли ограничението си от <xliff:g id="SIZE">%2$s</xliff:g>. Налице е моментна снимка на паметта, която да споделите със съответния програмист. Бъдете внимателни, защото тя може да съдържа ваши лични данни, до които приложението има достъп."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Избиране на действие за текст"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Сила на звука при звънене"</string>
<string name="volume_music" msgid="5421651157138628171">"Сила на звука"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Докоснете, за да видите всички мрежи"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Свързване"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Всички мрежи"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Налице е Wi‑Fi мрежа, предложена от <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Искате ли да се свържете с мрежите, предложени от <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Да"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Не"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ще се включи автоматично"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Вход в мрежата"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi мрежата няма достъп до интернет"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Докоснете за опции"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Установена е връзка"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Промени в настройките ви за точка за достъп"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Честотната лента на точката ви за достъп е променена."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Това устройство не поддържа предпочитанието ви за използване само на честотната лента от 5 ГХц. Вместо това то ще я ползва, когато е възможно."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отстраняване на грешки през USB"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Докоснете, за да изключите отстраняването на грешки през USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Изберете, за да деактивирате отстраняването на грешки през USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Течност или замърсяване в USB порта"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB портът е деактивиран автоматично. Докоснете, за да научите повече."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Безопасно е да използвате USB порта"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Докоснете за откл. на служ. потр. профил"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Установена е връзка с <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Докоснете, за да прегледате файловете"</string>
- <string name="pin_target" msgid="3052256031352291362">"Фиксиране"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Освобождаване"</string>
<string name="app_info" msgid="6856026610594615344">"Информация за приложението"</string>
<string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Демонстрацията се стартира…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Известие с информация за режима на поредица"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батерията може да се изтощи преди обичайното зареждане"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Режимът за запазване на батерията е активиран с цел удължаване на живота на батерията"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Приложение за Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index e0f866d..fc7022d 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"ওয়াই-ফাই কলিং"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"বন্ধ আছে"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"পছন্দের ওয়াই-ফাই"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"পছন্দের মোবাইল"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"শুধুমাত্র ওয়াই-ফাই"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ফরওয়ার্ড করা হয়নি"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ত্রুটির প্রতিবেদন"</string>
<string name="global_action_logout" msgid="935179188218826050">"সেশন শেষ করুন"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্রিনশট নিন"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"ত্রুটির অভিযোগ করুন"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"এটি একটি ই-মেল মেসেজ পাঠানোর জন্য আপনার ডিভাইসের বর্তমান অবস্থা সম্পর্কে তথ্য সংগ্রহ করবে৷ ত্রুটির প্রতিবেদন শুরুর সময় থেকে এটি পাঠানোর জন্য প্রস্তুত হতে কিছুটা সময় নেবে; অনুগ্রহ করে ধৈর্য রাখুন৷"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ইন্টারেক্টিভ প্রতিবেদন"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"বেশিরভাগ পরিস্থিতিতে এটিকে ব্যবহার করুন৷ এটি আপনাকে প্রতিবেদনের কাজ কতটা হয়েছে তার উপর নজর রাখতে দেয়, সমস্যাটির সম্পর্কে আরও অনেক কিছু লিখতে দেয় এবং স্ক্রীনশটগুলি নিতে দেয়৷ এটি হয়ত প্রতিবেদন করতে খুব বেশি সময় নেয় এমনকি কম-ব্যবহৃত বিভাগগুলি সরিয়ে দিতে পারে৷"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"লোকেশন"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"এই ডিভাইসের লোকেশন অ্যাক্সেস"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে এই ডিভাইসের লোকেশন অ্যাক্সেস করতে দেবেন?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"আপনি এই অ্যাপটি ব্যবহার করার সময়েই সেটি আপনার লোকেশন অ্যাক্সেস করতে পারবে।"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>কে সবসময় এই ডিভাইসের লোকেশন অ্যাক্সেস করতে দেবেন?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"এই অ্যাপটি সবসময় আপনার লোকেশন অ্যাক্সেস করতে পারবে, এমনকি আপনি অ্যাপটি ব্যবহার না করার সময়েও।"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ক্যালেন্ডার"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"আপনার ক্যালেন্ডারে অ্যাক্সেস"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে আপনার ক্যালেন্ডারে অ্যাক্সেস দেবেন?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে আপনার মিউজিকে অ্যাক্সেস দেবেন?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ফটো ও ভিডিও"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"আপনার ফটো ও ভিডিও অ্যাক্সেস করুন"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-কে ট্যাগ করা লোকেশন সহ ফটো এবং ভিডিও অ্যাক্সেস করার অনুমতি দেবেন?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"উইন্ডোর কন্টেন্ট পুনরুদ্ধার করে"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ব্যবহার করছেন এমন একটি উইন্ডোর কন্টেন্ট নিরীক্ষণ করে৷"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পর্শের মাধ্যমে অন্বেষণ করা চালু করুন"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"অ্যাপ্লিকেশানকে নিয়ার ফিল্ড কমিউনিকেশন (NFC) ট্যাগ, কার্ড এবং রিডারগুলির সাথে যোগাযোগ করতে দেয়৷"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"আপনার স্ক্রিন লক অক্ষম করুন"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"কী-লক এবং যেকোনো সংশ্লিষ্ট পাসওয়ার্ড সুরক্ষা অক্ষম করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ উদাহরণস্বরূপ, একটি ইনকামিং ফোন কল গ্রহণ করার সময়ে ফোনটি কী-লক অক্ষম করে, তারপরে কল শেষ হয়ে গেলে কী-লকটিকে আবার সক্ষম করে৷"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"স্ক্রিন লকের জটিলতা জানার অনুরোধ করুন"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"এটি অ্যাপটিকে স্ক্রিন লকের জটিলতার লেভেল বুঝতে সাহায্য করে (খুব জটিল, মাঝারি ধরনের জটিল, অল্প জটিল বা কোনও জটিলতা নেই), যা স্ক্রিন লকটি সম্ভত কত দীর্ঘ ও সেটির ধরন কীরকম, তার ইঙ্গিত দেয়। একটি নির্দিষ্ট লেভেল পর্যন্ত স্ক্রিন লক আপডেট করা যাবে তাও এই অ্যাপটি সাজেস্ট করতে পারে, তবে ব্যবহারকারীর তা উপেক্ষা করার এবং অন্য কোথাও চলে যাওয়ার স্বাধীনতা আছে। লক্ষ্য করবেন, স্ক্রিন লকটি যেহেতু প্লেন টেক্সট ফর্ম্যাটে স্টোর করা হয় না, তাই সঠিক পাসওয়ার্ডটি অ্যাপের পক্ষে জানা সম্ভব নয়।"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"বায়োমেট্রিক হার্ডওয়্যার ব্যবহার করুন"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"অ্যাপটিকে যাচাইকরণের জন্য বায়োমেট্রিক হার্ডওয়্যার ব্যবহার করার অনুমতি দেয়"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার পরিচালনা করুন"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ব্যবহার করার জন্য ফেস টেম্পলেট যোগ করা এবং মোছার পদ্ধতি গ্রহণ করতে অ্যাপটিকে অনুমতি দেয়৷"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করুন"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"প্রমাণীকরণের জন্য ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করার অনুমতি অ্যাপটিকে দেয়"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"ফেস প্রক্রিয়া করা যায়নি৷ আবার চেষ্টা করুন৷"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"ফেসটি খুব উজ্জ্বল লাগছে। কম আলোতে চেষ্টা করুন।"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"ফেসটি খুব অন্ধকার লাগছে। বেশি আলোতে চেষ্টা করুন।"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"অনুগ্রহ করে ফেস থেকে সেন্সরটি দূরে সরান।"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"অনুগ্রহ করে ফেসের কাছাকাছি সেন্সরটি আনুন।"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"অনুগ্রহ করে সেন্সরটি উঁচুতে নিয়ে যান।"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"অনুগ্রহ করে সেন্সরটি নিচে নিয়ে যান।"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"অনুগ্রহ করে সেন্সরটি ডান দিকে নিয়ে যান।"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"অনুগ্রহ করে সেন্সরটি বাঁ দিকে নিয়ে যান।"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"অনুগ্রহ করে সেন্সরের দিকে তাকান।"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"কোনও ফেস শনাক্ত করা যায়নি।"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"খুব বেশি নড়ছে।"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"আপনার মুখের ছবি আবার নথিভুক্ত করুন।"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"বিভিন্ন ব্যক্তির মুখের ছবি শনাক্ত করা হয়েছে।"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"একই ধরনের দেখতে, একটু অন্যদিকে ঘুরে দাঁড়ান।"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"সরাসরি ক্যামেরার দিকে তাকান।"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"সরাসরি ক্যামেরার দিকে তাকান।"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"মাথা সোজা করে রাখুন।"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"আপনার মুখটা আলোর দিকে নিয়ে আসুন।"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"ফেসের হার্ডওয়্যার উপলভ্য নয়৷"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"ফেসের ছাপ নেওয়ার সময়সীমা শেষ৷ আবার চেষ্টা করুন৷"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"ফেস স্টোর করা যাবে না।"</string>
<string name="face_error_canceled" msgid="283945501061931023">"ফেস অপারেশন বাতিল করা হয়েছে৷"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"ফেস যাচাইকরণ ব্যবহারকারীর দ্বারা বাতিল করা হয়েছে।"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"অনেকবার চেষ্টা করা হয়েছে৷ ফেস যাচাইকরণ বন্ধ আছে।"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"আবার চেষ্টা করুন।"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"কোনও ফেস নথিভুক্ত করা হয়নি।"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"এই ডিভাইসের ফেস যাচাইকরণ সেন্সর নেই।"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> ফেস"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> খুলুন"</string>
<string name="new_app_description" msgid="5894852887817332322">"সেভ না করেই <xliff:g id="OLD_APP">%1$s</xliff:g> বন্ধ হবে"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> মেমরি সীমা অতিক্রম করেছে"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"হিপ ডাম্প সংগ্রহ করা হয়েছে। শেয়ার করতে ট্যাপ করুন।"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"হিপ ডাম্প শেয়ার করবেন?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> প্রক্রিয়াটি তার <xliff:g id="SIZE">%2$s</xliff:g> এর মেমরি সীমা অতিক্রম করেছে৷ তার ডেভেলপারের সাথে শেয়ার করার জন্য একটি হিপ ডাম্প উপলব্ধ৷ সতর্কতা অবলম্বন করুন: এই হিপ ডাম্পে অ্যাপ্লিকেশানটির অ্যাক্সেস আছে এমন আপনার যেকোন ব্যক্তিগত তথ্য থাকতে পারে৷"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"পাঠ্যের জন্য একটি কাজ বেছে নিন"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"রিং ভলিউম"</string>
<string name="volume_music" msgid="5421651157138628171">"মিডিয়ার ভলিউম"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সমস্ত নেটওয়ার্ক দেখতে ট্যাপ করুন"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"সংযুক্ত করুন"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"সব নেটওয়ার্ক"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g>-এর সাজেস্ট করা ওয়াই-ফাই নেটওয়ার্ক এখন উপলভ্য"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"আপনি কি <xliff:g id="NAME">%s</xliff:g>-এর সাজেস্ট করা নেটওয়ার্ক দিয়ে কানেক্ট করতে চান?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"হ্যাঁ"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"না"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ওয়াই-ফাই অটোমেটিক চালু হবে"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"নেটওয়ার্কে সাইন-ইন করুন"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"ওয়াই-ফাই এ ইন্টারনেট অ্যাক্সেস নেই"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"বিকল্পগুলির জন্য আলতো চাপুন"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"কানেক্ট করা হয়েছে"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"আপনার হটস্পট সেটিংসে পরিবর্তনগুলি"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"আপনার হটস্পট ব্যান্ড পরিবর্তন করা হয়েছে।"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"এই ডিভাইসটি শুধুমাত্র 5GHz এর জন্য আপনার পছন্দ সমর্থন করে না। পরিবর্তে, এই ডিভাইসটি 5GHz ব্যান্ড ব্যবহার করবে।"</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ডিবাগিং সংযুক্ত হয়েছে"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"ইউএসবি ডিবাগিং বন্ধ করতে ট্যাপ করুন"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ডিবাগিং অক্ষম করতে বেছে নিন।"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"ইউএসবি পোর্টে তরল পদার্থ অথবা ধুলো কণা"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"ইউএসবি পোর্ট নিজে থেকে বন্ধ করা হবে। আরও জানতে ট্যাপ করুন।"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"ইউএসবি পোর্ট এখন ব্যবহার করতে পারবেন"</string>
@@ -1397,8 +1448,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"সেট আপ করুন"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"বের করে নিন"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"ঘুরে দেখুন"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"আউটপুট পাল্টান"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> অনুপস্থিত"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"ডিভাইসটি আবার ঢোকান"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> সরানো হচ্ছে"</string>
@@ -1907,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"কর্মস্থলের প্রোফাইল আনলক করতে আলতো চাপ দিন"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> এর সাথে সংযুক্ত হয়েছে"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ফাইলগুলি দেখতে আলতো চাপ দিন"</string>
- <string name="pin_target" msgid="3052256031352291362">"পিন করুন"</string>
- <string name="unpin_target" msgid="3556545602439143442">"আনপিন করুন"</string>
<string name="app_info" msgid="6856026610594615344">"অ্যাপের তথ্য"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ডেমো শুরু করা হচ্ছে…"</string>
@@ -1999,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"রুটিন মোডের তথ্য সংক্রান্ত বিজ্ঞপ্তি"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"সাধারণত যখন চার্জ দেন, তার আগে চার্জ শেষ হয়ে যেতে পারে"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ডিভাইস বেশিক্ষণ চালু রাখতে ব্যাটারি সেভার চালু করা হয়েছে"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ফোল্ডার"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android অ্যাপ্লিকেশন"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ফাইল"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index a78796f..1d5a7d8 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -142,8 +142,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Pozivanje putem WIFi-ja"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Isključeno"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferira se WiFi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferira se mobilna mreža"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Samo WiFi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije proslijeđen"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -230,7 +232,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Izvještaj o greškama"</string>
<string name="global_action_logout" msgid="935179188218826050">"Završi sesiju"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Kreiranje izvještaja o greškama"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Ovim će se prikupljati informacije o trenutnom stanju uređaja, koji će biti poslani kao e-poruka. Može malo potrajati dok se izvještaj o greškama ne kreira i bude spreman za slanje. Budite strpljivi."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktivni izvještaj"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Koristite ovu opciju u većini slučajeva. Ova opcija vam omogućava praćenje napretka izvještaja, unos dodatnih detalja o problemu i pravljenje snimaka ekrana. Moglo bi doći do izostavljanja nekih manje korištenih dijelova za čije prijavljivanje je potrebno dugo vremena."</string>
@@ -284,9 +287,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupa lokaciji ovog uređaja"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristup lokaciji ovog uređaja?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Ova aplikacija će moći pristupiti lokaciji uređaja samo kada je koristite."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Uvijek dozvoliti da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupi lokaciji uređaja?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Ova aplikacija će uvijek moći pristupiti lokaciji uređaja, čak i kada je ne koristite."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupa vašem kalendaru"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupi vašem kalendaru?"</string>
@@ -319,7 +325,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Dozvoliti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>da pristupi vašoj muzici?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografije i videozapisi"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pristup fotografijama i videozapisima"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Dozvoliti da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa fotografijama i videozapisima, uključujući označene lokacije?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Preuzima sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregleda sadržaj prozora koji trenutno koristite."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključi opciju Istraživanje dodirom"</string>
@@ -512,8 +521,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Dozvoljava aplikaciji komuniciranje sa NFC (komunikacija bliskog polja) oznakama, karticama i čitačima."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"deaktivacija zaključavanja ekrana"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Omogućava aplikaciji deaktivaciju zaključane tastature i svih povezanih zaštita. Naprimjer, telefon deaktivira zaključavanje tastature kod dolaznog telefonskog poziva, a zatim ponovo aktivira zaključavanje tastature kada je poziv završen."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"zahtjev za kompleksnost zaključavanja ekrana"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Omogućava aplikaciji da sazna nivo kompleksnosti zaključavanja ekrana (visoki, srednji, niski ili bez zaključavanja), što naznačava mogući raspon trajanja i vrste zaključavanja ekrana. Aplikacija također može korisnicima predložiti da ažuriraju zaključavanje ekrana do određenog nivoa ali korisnici slobodno mogu ignorirati prijedlog i napustiti stranicu. Važno je napomenuti da se zaključavanje ekrana ne pohranjuje kao obični tekst tako da aplikacija ne zna tačnu lozinku."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"koristi biometrijski hardver za otiske prstij"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Omogućava aplikaciji da za autentifikaciju koristi biometrijski hardver"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"upravljanje hardverom za otiske prstiju"</string>
@@ -568,37 +579,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Omogućava aplikaciji korištenje metoda za dodavanje i brisanje šablona lica za upotrebu."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"upotreba hardvera za autentifikaciju licem"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Omogućava aplikaciji da za autentifikaciju koristi hardver za autentifikaciju licem"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Obrada lica nije uspjela. Pokušajte ponovo."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Lice je presvijetlo. Pokušajte s manje svjetla."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Lice je pretamno. Pojačajte izvor svjetlosti."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Odmaknite senzor od lica."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Približite senzor licu."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Pomjerite senzor prema gore."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Pomjerite senzor prema dolje."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Pomjerite senzor udesno."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Pomjerite senzor ulijevo."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Gledajte u senzor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nije pronađeno nijedno lice."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Previše pokreta."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrirajte lice."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Otkriveno je lice koje nije vaše."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Previše slično, promijenite položaj."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Gledajte direktno u kameru."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Gledajte direktno u kameru."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Poravnajte položaj glave vertikalno."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Otkrijte lice."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardver za prepoznavanje lica nije dostupan."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Vrijeme za prepoznavanje lica je isteklo. Pokušajte ponovo."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće pohraniti lice."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Prepoznavanje lica je otkazano."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Korisnik je otkazao provjeru lica."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Previše pokušaja. Autentifikacija lica onemogućena."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Pokušajte ponovo."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nije prijavljeno nijedno lice."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Ovaj uređaj nema senzor za autentifikaciju lica."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1235,9 +1268,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Otvori aplikaciju <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"Aplikacija <xliff:g id="OLD_APP">%1$s</xliff:g> će se zatvoriti bez pohranjivanja"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> premašuje ograničenje memorije"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Snimak dinamičkog stanja memorije je napravljen. Dodirnite za dijeljenje."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Želite li dijeliti snimak dinamičkog dijela memorije?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> je premašio ograničenje procesne memorije od <xliff:g id="SIZE">%2$s</xliff:g>. Snimak dinamičkog dijela memorije vam je dostupan i možete ga dijeliti sa njegovim programerom. Budite oprezni: ovaj snimak dinamičkog dijela memorije može sadržavati vaše lične podatke kojima aplikacija ima pristup."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Biranje akcije za tekst"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Jačina zvuka zvona"</string>
<string name="volume_music" msgid="5421651157138628171">"Jačina zvuka medija"</string>
@@ -1278,8 +1318,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da vidite sve mreže"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Povežite se"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"WiFi mreža koju je predložila aplikacija <xliff:g id="NAME">%s</xliff:g> je dostupna"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Želite li se povezati na mreže koje je predložila aplikacija <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi veza će se automatski uključiti"</string>
@@ -1291,9 +1333,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Prijava na mrežu"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"WiFi nema pristup internetu"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Povezano"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Promjene postavki vaše pristupne tačke"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Opseg vaše pristupne tačke je promijenjen."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ovaj uređaj ne podržava vašu postavku za mreže od isključivo 5GHz. Uređaj će koristiti opseg of 5GHz kada je dostupan."</string>
@@ -1378,6 +1425,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Otklanjanje grešaka putem uređaja spojenog na USB je uspostavljeno"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Dodirnite da isključite otklanjanje grešaka putem USB-a"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Odaberite da onemogućite ispravljanje grešaka koristeći USB"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Tečnost ili nečistoće u USB priključku"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB priključak je automatski onemogućen. Dodirnite da saznate više."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB priključak je sada sigurno koristiti"</string>
@@ -1941,8 +1992,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Dodirnite da biste otključali radni profil"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Povezan na uređaj <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Dodirnite za prikaz fajlova"</string>
- <string name="pin_target" msgid="3052256031352291362">"Zakači"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Otkači"</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Pokretanje demonstracije…"</string>
@@ -2034,6 +2083,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Obavještenje za informacije Rutinskog načina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Moguće je da će se baterija isprazniti prije uobičajenog punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Ušteda baterije je aktivirana da bi se produžio vijek trajanja baterije"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android aplikacija"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fajl"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index be2c0de..a0e3e21 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -143,8 +143,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Volání přes WiFi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Vypnuto"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferována síť W-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferována mobilní data"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Pouze Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepřesměrováno"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -232,7 +234,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Hlášení chyb"</string>
<string name="global_action_logout" msgid="935179188218826050">"Ukončit relaci"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Snímek obrazovky"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Vytvořit chybové hlášení"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Shromažďuje informace o aktuálním stavu zařízení. Tyto informace je následně možné poslat v e-mailové zprávě, chvíli však potrvá, než bude hlášení o chybě připraveno k odeslání. Buďte prosím trpěliví."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktivní přehled"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Tato možnost se používá ve většině případů. Umožňuje sledovat průběh přehledu, zadat další podrobnosti o problému a pořizovat snímky obrazovky. Mohou být vynechány některé méně používané sekce, jejichž kontrola trvá dlouho."</string>
@@ -287,9 +290,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Poloha"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"přístup k poloze tohoto zařízení"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup k poloze tohoto zařízení?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikace bude mít přístup k poloze, pouze když ji budete používat."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup k poloze tohoto zařízení?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikace bude mít přístup k poloze vždy, i když ji nebudete používat."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendář"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"přístup ke kalendáři"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup ke kalendáři?"</string>
@@ -322,7 +328,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup k hudbě?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotky a videa"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"přístup k fotkám a videím"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Povolit aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup k fotkám a videím včetně označených míst?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načítat obsah oken"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Může prozkoumávat obsah oken, se kterými pracujete."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnout funkci Prozkoumání dotykem"</string>
@@ -400,13 +409,13 @@
<string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"Umožňuje aplikaci odesílat trvalá vysílání, která přetrvávají i po skončení vysílání. Nadměrné používání může televizi zpomalit či způsobit její nestabilitu, protože bude používat příliš mnoho paměti."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Umožňuje aplikaci odesílat trvalá vysílání, která přetrvávají i po skončení vysílání. Nadměrné používání může telefon zpomalit či způsobit jeho nestabilitu, protože bude používat příliš mnoho paměti."</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"čtení kontaktů"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Umožňuje aplikaci číst údaje o kontaktech uložených v tabletu, včetně toho, jak často voláte, posíláte e-maily nebo jinak komunikujete s konkrétními osobami. Toto oprávnění umožňuje aplikacím ukládat údaje o kontaktech. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string>
- <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Umožňuje aplikaci číst údaje o kontaktech uložených v televizi včetně toho, jak často voláte, posíláte e-maily nebo jinými způsoby komunikujete s konkrétními kontakty. Toto oprávnění umožňuje aplikacím ukládat údaje o vašich kontaktech a škodlivé aplikace mohou sdílet údaje o kontaktech bez vašeho vědomí."</string>
- <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Umožňuje aplikaci číst údaje o kontaktech uložených v telefonu, včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními osobami. Toto oprávnění umožňuje aplikacím ukládat údaje o kontaktech. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Umožňuje aplikaci číst údaje o kontaktech uložených v tabletu, včetně toho, jak často voláte, posíláte e‑maily nebo jinak komunikujete s konkrétními osobami. Toto oprávnění umožňuje aplikacím ukládat údaje o kontaktech. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string>
+ <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Umožňuje aplikaci číst údaje o kontaktech uložených v televizi včetně toho, jak často voláte, posíláte e‑maily nebo jinými způsoby komunikujete s konkrétními kontakty. Toto oprávnění umožňuje aplikacím ukládat údaje o vašich kontaktech a škodlivé aplikace mohou sdílet údaje o kontaktech bez vašeho vědomí."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Umožňuje aplikaci číst údaje o kontaktech uložených v telefonu, včetně toho, jak často voláte, posíláte e‑maily nebo komunikujete jinými způsoby s konkrétními osobami. Toto oprávnění umožňuje aplikacím ukládat údaje o kontaktech. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string>
<string name="permlab_writeContacts" msgid="5107492086416793544">"úprava kontaktů"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Umožňuje aplikaci upravit údaje o kontaktech uložených v tabletu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
- <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"Umožňuje aplikaci upravit údaje o kontaktech uložených v televizi včetně toho, jak často voláte, posíláte e-maily nebo jinými způsoby komunikujete s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
- <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Umožňuje aplikaci upravit údaje o kontaktech uložených v telefonu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Umožňuje aplikaci upravit údaje o kontaktech uložených v tabletu včetně toho, jak často voláte, posíláte e‑maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
+ <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"Umožňuje aplikaci upravit údaje o kontaktech uložených v televizi včetně toho, jak často voláte, posíláte e‑maily nebo jinými způsoby komunikujete s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Umožňuje aplikaci upravit údaje o kontaktech uložených v telefonu včetně toho, jak často voláte, posíláte e‑maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"čtení seznamu hovorů"</string>
<string name="permdesc_readCallLog" msgid="3204122446463552146">"Tato aplikace může číst historii volání."</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"zápis do seznamu hovorů"</string>
@@ -515,8 +524,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Umožňuje aplikaci komunikovat se štítky, kartami a čtečkami s podporou technologie NFC."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"vypnutí zámku obrazovky"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Umožňuje aplikaci vypnout zámek kláves a související zabezpečení heslem. Telefon například vypne zámek klávesnice při příchozím hovoru a po skončení hovoru jej zase zapne."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"zjištění složitosti zámku obrazovky"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Umožňuje aplikaci zjistit úroveň složitosti zámku obrazovky (vysoká, střední, nízká nebo žádná), která ukazuje možnou délku a typ zámku obrazovky. Aplikace také může uživatelům navrhovat, aby zámek obrazovky upravili na určitou úroveň, ale uživatelé mohou návrhy klidně ignorovat a odejít. Zámek obrazovky není uložen jako prostý text, a tak aplikace přesné heslo nezná."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"použití biometrického hardwaru"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Umožňuje aplikaci použít k ověření biometrický hardware"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"správa hardwaru na čtení otisků prstů"</string>
@@ -571,37 +582,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Umožňuje aplikaci volat metody k přidání a smazání šablon obličeje, které budou použity."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"použití hardwaru k ověření obličeje"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Umožňuje aplikaci provést ověření pomocí hardwaru k ověření obličeje"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Zpracování obličeje se nezdařilo. Zkuste to znovu."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Obličej je moc jasný. Zkuste to v menším světle."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Obličej je moc tmavý. Odkryjte zdroj světla."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Oddalte senzor od obličeje."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Posuňte senzor blíž k obličeji."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Posuňte senzor výš."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Posuňte senzor níž."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Posuňte senzor doprava."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Posuňte senzor doleva."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Podívejte se do senzoru."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nebyl rozpoznán žádný obličej."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Příliš mnoho pohybu."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Zaznamenejte obličej znovu."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Byl rozpoznán jiný obličej."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Příliš podobné, změňte výraz."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Dívejte se přímo na fotoaparát."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Dívejte se přímo na fotoaparát."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Narovnejte hlavu."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Odhalte obličej."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Není k dispozici hardware ke snímání obličeje."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Limit ověření obličeje vypršel. Zkuste to znovu."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Obličej nelze uložit."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Operace snímání obličeje byla zrušena."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Ověření obličeje bylo zrušeno uživatelem."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Příliš mnoho pokusů. Zkuste to později."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Příliš mnoho pokusů. Ověření obličeje je zakázáno."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Zkuste to znovu."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Není zaregistrován žádný obličej."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Toto zařízení nemá snímač ověření obličeje."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Obličej <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1253,9 +1286,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Otevřít aplikaci <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"Aplikace <xliff:g id="OLD_APP">%1$s</xliff:g> se zavře bez uložení"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> překročil limit paměti"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Byl shromážděn výpis haldy. Klepnutím jej můžete sdílet."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Sdílet výpis haldy?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> překročil limit paměti procesu <xliff:g id="SIZE">%2$s</xliff:g>. Je k dispozici výpis haldy, který můžete sdílet s vývojářem. Buďte opatrní, výpis haldy může obsahovat osobní údaje, ke kterým má aplikace přístup."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Vyberte akci pro text"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Hlasitost vyzvánění"</string>
<string name="volume_music" msgid="5421651157138628171">"Hlasitost médií"</string>
@@ -1298,8 +1338,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Klepnutím zobrazíte všechny sítě"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Připojit"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Všechny sítě"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Je k dispozici síť Wi‑Fi navrhovaná aplikací <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Chcete se připojit k sítím, které navrhuje aplikace <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ano"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi se zapne automaticky"</string>
@@ -1311,9 +1353,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Přihlásit se k síti"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nemá přístup k internetu"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Klepnutím zobrazíte možnosti"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Připojeno"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Změny nastavení hotspotu"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pásmo hotspotu se změnilo."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Toto zařízení nepodporuje vaše nastavení jen 5GHz pásma. Zařízení použije pásmo 5 GHz, jen když bude dostupné."</string>
@@ -1398,6 +1445,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ladění přes USB připojeno"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Klepnutím vypnete ladění přes USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Vyberte, chcete-li zakázat ladění přes USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Kapalina nebo nečistota v portu USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Port USB byl automaticky deaktivován. Klepnutím zobrazíte další informace."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Port USB lze bezpečně použít"</string>
@@ -1973,8 +2024,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Klepnutím jej odemknete"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Připojeno k zařízení <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Klepnutím zobrazíte soubory"</string>
- <string name="pin_target" msgid="3052256031352291362">"Připnout"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Odepnout"</string>
<string name="app_info" msgid="6856026610594615344">"O aplikaci"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Spouštění ukázky…"</string>
@@ -2067,6 +2116,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Informační oznámení režimu sledu činností"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterie se možná vybije před obvyklým časem nabití"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Byl aktivován spořič baterie za účelem prodloužení výdrže"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Složka"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplikace pro Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Soubor"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 4a30a4d..80256ee 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi-opkald"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Fra"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"WiFi-netværk er foretrukket"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobildata foretrækkes"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Kun Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderestillet"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Fejlrapport"</string>
<string name="global_action_logout" msgid="935179188218826050">"Afslut sessionen"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Lav fejlrapport"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Der indsamles oplysninger om din enheds aktuelle status, der efterfølgende sendes i en mail. Der går lidt tid, fra fejlrapporten påbegyndes, til den er klar til at blive sendt. Tak for tålmodigheden."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv rapport"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Brug dette workflow under de fleste omstændigheder. Det giver dig mulighed for at se status på rapporten, angive flere oplysninger om problemet og tage screenshots. Nogle mindre brugte sektioner, der tager lang tid at rapportere, udelades muligvis."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Placering"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"få adgang til enhedens placering"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til enhedens placering?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Appen har kun adgang til placeringen, når du bruger appen."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Skal <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> altid have adgang til enhedens placering?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Appen har altid adgang til placeringen, også selvom du ikke bruger appen."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"have adgang til din kalender"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til din kalender?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til din musik?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Billeder og videoer"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"adgang til dine billeder og videoer"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vil du give <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> adgang til dine billeder og videoer, herunder taggede placeringer?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Hente indholdet i vinduet"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Undersøge indholdet i et vindue, du interagerer med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivere Udforsk ved berøring"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Tillader, at appen kan kommunikere med NFC-tags (Near Field Communication), -kort og -læsere."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"deaktivere din skærmlås"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Tillader, at appen kan deaktivere tastaturlåsen og anden form for tilknyttet adgangskodesikkerhed. Telefonen deaktiverer f.eks. tastaturlåsen ved indgående telefonopkald og aktiverer tastaturlåsen igen, når opkaldet er afsluttet."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"anmode om skærmlåsens kompleksitet"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Giver appen tilladelse til at kende skærmlåsens kompleksitet (høj, medium, lav eller ingen), hvilket kan afsløre oplysninger om skærmlåsens længde og type. Appen kan også foreslå brugerne at opdatere deres skærmlås til et bestemt niveau, men brugerne kan frit ignorere det og gå videre. Bemærk! Skærmlåsen gemmes ikke som almindelig tekst, så appen kender ikke adgangskoden."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"brug biometrisk hardware"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Tillader, at appen kan bruge biometrisk hardware til godkendelse"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"administrer fingeraftrykhardware"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Tillader, at appen kan bruge metoder til at tilføje og slette ansigtsskabeloner."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"brug hardware til ansigtsgenkendelse"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tillader, at appen bruger ansigtsgenkendelseshardware til godkendelse"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Ansigtet kunne ikke behandles. Prøv igen."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Ansigtet er for lyst. Prøv i svagere belysning."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Ansigtet er for mørkt. Ryk tættere på en lyskilde."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Flyt sensoren længere væk fra ansigtet."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Ryk sensoren tættere på ansigtet."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Flyt sensoren højere op."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Flyt sensoren længere ned."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Flyt sensoren til højre."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Flyt sensoren til venstre."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Kig på sensoren."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Der er ikke registreret noget ansigt."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Der er for meget bevægelse."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrer dit ansigt igen."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Der blev registreret et andet ansigt."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Det minder for meget om et andet. Skift stilling."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Kig mere direkte ind i kameraet."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Kig mere direkte ind i kameraet."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Hold hovedet helt lodret."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Sørg for, at ansigtet ikke er dækket til."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardwaren til ansigtsregistrering er ikke klar."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Ansigtsgenkendelse fik timeout. Prøv igen."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Ansigtet kan ikke gemmes."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Ansigtshandlingen blev annulleret."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Ansigtsgodkendelsen blev annulleret af brugeren."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Du har prøvet for mange gange. Prøv igen senere."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"For mange forsøg – Ansigtsgenkendelse deaktiveret."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Prøv igen."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Der er ikke registreret nogen ansigter."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Denne enhed har ingen sensor til ansigtsgenkendelse."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Ansigt <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Åbn <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> lukkes uden at gemme"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> har overskredet sin hukommelsesgrænse"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Der er indsamlet en heap dump. Tryk for at dele."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vil du dele en heap dump?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Processen <xliff:g id="PROC">%1$s</xliff:g> har overskredet sin proceshukommelsesgrænse på <xliff:g id="SIZE">%2$s</xliff:g>. En heap dump er tilgængelig og kan deles med udvikleren. Vær forsigtig: Denne heap dump kan indeholde dine personlige oplysninger, som appen har adgang til."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Vælg en handling for teksten"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Lydstyrke for opkald"</string>
<string name="volume_music" msgid="5421651157138628171">"Lydstyrke for medier"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tryk for at se alle netværk"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Opret forbindelse"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netværk"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> har foreslået et tilgængeligt Wi-Fi-netværk"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Vil du oprette forbindelse til netværk, som <xliff:g id="NAME">%s</xliff:g> foreslår?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nej"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi aktiveres automatisk"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Log ind på netværk"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi-netværket har ikke internetadgang"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tryk for at se valgmuligheder"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Der er oprettet forbindelse"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Ændringer af dine indstillinger for hotspot"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Dit hotspotbånd er ændret."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Denne enhed understøtter ikke din præference om kun 5 GHz. Denne enhed vil i stedet bruge 5 GHz-båndet, når det er muligt."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-fejlretning er tilsluttet"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tryk for at deaktivere USB-fejlretning"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Vælg for at deaktivere USB-fejlretning."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Væske eller snavs i USB-porten"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-porten deaktiveres automatisk. Tryk for at få flere oplysninger."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Det er sikkert at bruge USB-porten"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tryk for at låse profilen op"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Tilsluttet <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tryk for at se filer"</string>
- <string name="pin_target" msgid="3052256031352291362">"Fastgør"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Frigør"</string>
<string name="app_info" msgid="6856026610594615344">"Appinfo"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Starter demoen…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notifikation med oplysninger om rutinetilstand"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Enheden løber muligvis tør for batteri, inden du normalt oplader den"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterisparefunktion er aktiveret for at forlænge batteritiden"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Mappe"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android-app"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fil"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index f4f7918..5381511 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Κλήση Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Ανενεργό"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Προτίμηση Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Προτίμηση δικτύου κινητής τηλεφωνίας"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Μόνο Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Δεν προωθήθηκε"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Αναφορά σφαλμάτων"</string>
<string name="global_action_logout" msgid="935179188218826050">"Λήξη περιόδου σύνδεσης"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Στιγμιότυπο οθόνης"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Λήψη αναφοράς σφάλματος"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Θα συλλέξει πληροφορίες σχετικά με την τρέχουσα κατάσταση της συσκευής σας και θα τις στείλει μέσω μηνύματος ηλεκτρονικού ταχυδρομείου. Απαιτείται λίγος χρόνος για τη σύνταξη της αναφοράς σφάλματος και την αποστολή της. Κάντε λίγη υπομονή."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Διαδραστική αναφορά"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Χρησιμοποιήστε αυτήν την επιλογή στις περισσότερες περιπτώσεις. Σας επιτρέπει να παρακολουθείτε την πρόοδο της αναφοράς, να εισάγετε περισσότερες λεπτομέρειες σχετικά με το πρόβλημα που αντιμετωπίζετε και να τραβήξετε στιγμιότυπα οθόνης. Ενδέχεται να παραλείψει ορισμένες ενότητες που δεν χρησιμοποιούνται συχνά και για τις οποίες απαιτείται μεγάλο χρονικό διάστημα για τη δημιουργία αναφορών."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Τοποθεσία"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"έχει πρόσβαση στην τοποθεσία της συσκευής"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στην τοποθεσία αυτής της συσκευής;"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Η εφαρμογή θα έχει πρόσβαση στην τοποθεσία μόνο κατά τη διάρκεια χρήσης της εφαρμογής."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Να επιτρέπεται πάντα στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στην τοποθεσία αυτής της συσκευής;"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Η εφαρμογή θα έχει πάντα πρόσβαση στην τοποθεσία, ακόμα και όταν δεν χρησιμοποιείτε την εφαρμογή."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Ημερολόγιο"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"έχει πρόσβαση στο ημερολόγιό σας"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στο ημερολόγιό σας;"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στη μουσική σας;"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Φωτογραφίες και βίντεο"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"πρόσβαση στις φωτογραφίες και στα βίντεό σας"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Να επιτρέπεται η πρόσβαση του <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> σε φωτογραφίες και βίντεο, μεταξύ άλλων σε επισημασμένες τοποθεσίες;"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ανάκτηση του περιεχομένου του παραθύρου"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Έλεγχος του περιεχομένου ενός παραθύρου με το οποίο αλληλεπιδράτε."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ενεργοποίηση της \"Εξερεύνησης με άγγιγμα\""</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Επιτρέπει στην εφαρμογή την επικοινωνία με ετικέτες, κάρτες και αναγνώστες της Επικοινωνίας κοντινού πεδίου (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"απενεργοποιεί το κλείδωμα οθόνης"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Επιτρέπει στην εφαρμογή την απενεργοποίηση του κλειδώματος πληκτρολογίου και άλλης σχετικής ασφάλειας με κωδικό πρόσβασης. Για παράδειγμα, το κλείδωμα πληκτρολογίου στο τηλέφωνο απενεργοποιείται όταν λαμβάνεται εισερχόμενη τηλεφωνική κλήση και ενεργοποιείται ξανά όταν η κλήση τερματιστεί."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"υποβολή αιτήματος για πολυπλοκότητα οθόνης κλειδώματος"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Επιτρέπει στην εφαρμογή να μάθει το επίπεδο πολυπλοκότητας του κλειδώματος οθόνης (υψηλό, μέσο, χαμηλό ή κανένα), το οποίο υποδεικνύει το πιθανό εύρος του μήκους και του τύπου κλειδώματος οθόνης. Η εφαρμογή μπορεί επίσης να προτείνει στους χρήστες να ενημερώσουν το κλείδωμα οθόνης σε ένα συγκεκριμένο επίπεδο, όμως οι χρήστες μπορούν να την αγνοήσουν και να συνεχίσουν. Λάβετε υπόψη ότι το κλείδωμα οθόνης δεν αποθηκεύεται σε απλό κείμενο. Συνεπώς, η εφαρμογή δεν γνωρίζει τον κωδικό."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"χρήση βιομετρικού εξοπλισμού"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί βιομετρικό εξοπλισμό για έλεγχο ταυτότητας"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"διαχειρίζεται τον εξοπλισμό δακτυλικού αποτυπώματος"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους προσθήκης/διαγραφής προτύπων για χρήση."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"χρήση υλικολογισμικού ελέγχου ταυτότητας προσώπου"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί υλικολογισμικό για έλεγχο ταυτότητας"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Αδυναμία επεξεργασίας προσώπου. Δοκιμάστε ξανά."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Υψηλή φωτεινότητα. Δοκιμάστε χαμηλότερο φωτισμό."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Πολύ σκοτεινό πρόσωπο. Ξεσκεπάστε την πηγή φωτός."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Μετακινήστε τον αισθητήρα πιο μακριά."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Τοποθετήστε τον αισθητήρα πιο κοντά στο πρόσωπο."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Μετακινήστε τον αισθητήρα ψηλότερα."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Μετακινήστε τον αισθητήρα χαμηλότερα."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Μετακινήστε τον αισθητήρα προς τα δεξιά."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Μετακινήστε τον αισθητήρα προς τα αριστερά."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Κοιτάξτε στον αισθητήρα."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Δεν εντοπίστηκε κάποιο πρόσωπο."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Υπερβολικά πολλή κίνηση."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Καταχωρίστε ξανά το πρόσωπό σας."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Ανιχνεύτηκε διαφορετικό πρόσωπο."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Πολύ παρόμοιο, αλλάξτε την πόζα σας."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Κοιτάξτε απευθείας στην κάμερα."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Κοιτάξτε απευθείας στην κάμερα."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Ευθυγραμμίστε το κεφάλι σας στον κατακόρυφο άξονα."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Μην καλύπτετε το πρόσωπό σας."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Το υλικολογισμικό προσώπου δεν είναι διαθέσιμο."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Λήξη χρονικού ορίου προσώπου. Δοκιμάστε ξανά."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Δεν είναι δυνατή η αποθήκευση του προσώπου."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Η ενέργεια προσώπου ακυρώθηκε."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Ο έλεγχος ταυτότητας προσώπου ακυρώθηκε από τον χρήστη."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Πολλές προσπάθειες. Αποτυχία ελέγ. ταυτ. προσώπου."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Δοκιμάστε ξανά."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Δεν έχει καταχωριστεί κάποιο πρόσωπο."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Η συσκευή δεν διαθέτει αισθητήρα ελέγχου ταυτότ. προσώπου."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Πρόσωπο <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Ανοίξτε την εφαρμογή <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"Η εφαρμογή <xliff:g id="OLD_APP">%1$s</xliff:g> θα κλείσει χωρίς αποθήκευση"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Η διαδικασία <xliff:g id="PROC">%1$s</xliff:g> υπερβαίνει το όριο μνήμης"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Το στιγμιότυπο οθόνης λήφθηκε. Πατήστε για κοινοποίηση."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Κοινή χρήση στιγμιότυπου μνήμης;"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Η διαδικασία <xliff:g id="PROC">%1$s</xliff:g> υπερβαίνει το όριο μνήμης <xliff:g id="SIZE">%2$s</xliff:g>. Είναι διαθέσιμο ένα στιγμιότυπο μνήμης για να μοιραστείτε με τον προγραμματιστή. Να είστε προσεκτικοί: αυτό το στιγμιότυπο μνήμης μπορεί να περιέχει οποιοδήποτε από τα προσωπικά σας στοιχεία στα οποία έχει πρόσβαση η εφαρμογή."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Επιλέξτε μια ενέργεια για το κείμενο"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ένταση ήχου ειδοποίησης"</string>
<string name="volume_music" msgid="5421651157138628171">"Ένταση ήχου πολυμέσων"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Πατήστε για να δείτε όλα τα δίκτυα"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Σύνδεση"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Όλα τα δίκτυα"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Είναι διαθέσιμο ένα δίκτυο Wi‑Fi που προτείνεται από <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Θέλετε να συνδέσετε τα δίκτυα που προτείνονται από <xliff:g id="NAME">%s</xliff:g>;"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ναι"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Όχι"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Το Wi‑Fi θα ενεργοποιηθεί αυτόματα"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Σύνδεση στο δίκτυο"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Το Wi-Fi δεν έχει πρόσβαση στο διαδίκτυο"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Πατήστε για να δείτε τις επιλογές"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Συνδέθηκε"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Αλλαγές στις ρυθμίσεις σημείου πρόσβασης Wi-Fi"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Το εύρος σημείου πρόσβασης Wi-Fi άλλαξε."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Αυτή η συσκευή δεν υποστηρίζει την προτίμησή σας για τη ζώνη 5 GHz μόνο. Αντ\' αυτού, αυτή η συσκευή θα χρησιμοποιεί τη ζώνη 5 GHz όταν είναι διαθέσιμη."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Συνδέθηκε ο εντοπισμός σφαλμάτων USB"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Πατήστε για να απενεργοποιήσετε τον εντοπισμό και τη διόρθωση σφαλμάτων USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Επιλογή για απενεργοποίηση του εντοπισμού σφαλμάτων USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Υγρασία ή ακαθαρσίες στη θύρα USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Η θύρα USB απενεργοποιείται αυτόματα. Πατήστε για να μάθετε περισσότερα."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Μπορείτε να χρησιμοποιήσετε με ασφάλεια τη θύρα USB"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Πατήστε για ξεκλ. προφίλ εργ."</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Συνδέθηκε με το <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Πατήστε για να δείτε τα αρχεία"</string>
- <string name="pin_target" msgid="3052256031352291362">"Καρφίτσωμα"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Ξεκαρφίτσωμα"</string>
<string name="app_info" msgid="6856026610594615344">"Πληροφορίες εφαρμογής"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Έναρξη επίδειξης…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ειδοποίηση πληροφοριών λειτουργίας Ρουτίνας"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Η μπαταρία μπορεί να εξαντληθεί πριν από τη συνηθισμένη φόρτιση"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Η Εξοικονόμηση μπαταρίας ενεργοποιήθηκε για την επέκταση της διάρκειας ζωής της μπαταρίας"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Φάκελος"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Εφαρμογή Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Αρχείο"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 8ed7bd8..a90fef7 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi Calling"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi only"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="global_action_logout" msgid="935179188218826050">"End session"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive report"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem and take screenshots. It might omit some less-used sections that take a long time to report."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device\'s location?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"The app will only have access to the location while you’re using the app."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Always allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device’s location?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"The app will always have access to the location, even when you’re not using the app."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your calendar?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your music?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Photos & videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"access your photos & videos"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your photos and videos, including tagged locations?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Allows the app to communicate with Near Field Communication (NFC) tags, cards and readers."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"disable your screen lock"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"request screen lock complexity"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Allows the app to learn the screen lock complexity level (high, medium, low or none), which indicates the possible range of length and type of the screen lock. The app can also suggest to users that they update the screen lock to a certain level but users can freely ignore and navigate away. Note that the screen lock is not stored in plain text so the app does not know the exact password."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"use biometric hardware"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Allows the app to use biometric hardware for authentication"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"manage fingerprint hardware"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Couldn’t process face. Please try again."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Face is too bright. Please try in lower light."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Face is too dark. Please uncover light source."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Please move sensor farther away from face."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Please bring sensor closer to face."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Please move sensor higher."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Please move sensor lower."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Please move sensor to the right."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Please move sensor to the left."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Please look at the sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"No face detected."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Too much motion."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Different face detected."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Please look more directly at the camera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Please look more directly at the camera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Please straighten your head vertically."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Please uncover your face."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Face hardware not available."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication cancelled by user."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"No face enrolled."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"This device does not have a face authentication sensor."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump collected. Tap to share."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"The process <xliff:g id="PROC">%1$s</xliff:g> has exceeded its process memory limit of <xliff:g id="SIZE">%2$s</xliff:g>. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringer volume"</string>
<string name="volume_music" msgid="5421651157138628171">"Media volume"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"A Wi‑Fi network proposed by <xliff:g id="NAME">%s</xliff:g> is available"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Do you want to connect to networks proposed by <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Sign in to network"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Connected"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Liquid or debris in USB port"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB port is automatically disabled. Tap to learn more."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Safe to use USB port"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tap to unlock work profile"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Connected to <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tap to view files"</string>
- <string name="pin_target" msgid="3052256031352291362">"Pin"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Starting demo…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 722d132..a10300e 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi Calling"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi only"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="global_action_logout" msgid="935179188218826050">"End session"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive report"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem and take screenshots. It might omit some less-used sections that take a long time to report."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device\'s location?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"The app will only have access to the location while you’re using the app."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Always allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device’s location?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"The app will always have access to the location, even when you’re not using the app."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your calendar?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your music?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Photos & videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"access your photos & videos"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your photos and videos, including tagged locations?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Allows the app to communicate with Near Field Communication (NFC) tags, cards and readers."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"disable your screen lock"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"request screen lock complexity"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Allows the app to learn the screen lock complexity level (high, medium, low or none), which indicates the possible range of length and type of the screen lock. The app can also suggest to users that they update the screen lock to a certain level but users can freely ignore and navigate away. Note that the screen lock is not stored in plain text so the app does not know the exact password."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"use biometric hardware"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Allows the app to use biometric hardware for authentication"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"manage fingerprint hardware"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Couldn’t process face. Please try again."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Face is too bright. Please try in lower light."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Face is too dark. Please uncover light source."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Please move sensor farther away from face."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Please bring sensor closer to face."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Please move sensor higher."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Please move sensor lower."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Please move sensor to the right."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Please move sensor to the left."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Please look at the sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"No face detected."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Too much motion."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Different face detected."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Please look more directly at the camera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Please look more directly at the camera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Please straighten your head vertically."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Please uncover your face."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Face hardware not available."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication cancelled by user."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"No face enrolled."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"This device does not have a face authentication sensor."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump collected. Tap to share."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"The process <xliff:g id="PROC">%1$s</xliff:g> has exceeded its process memory limit of <xliff:g id="SIZE">%2$s</xliff:g>. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringer volume"</string>
<string name="volume_music" msgid="5421651157138628171">"Media volume"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"A Wi‑Fi network proposed by <xliff:g id="NAME">%s</xliff:g> is available"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Do you want to connect to networks proposed by <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Sign in to network"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Connected"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Liquid or debris in USB port"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB port is automatically disabled. Tap to learn more."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Safe to use USB port"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tap to unlock work profile"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Connected to <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tap to view files"</string>
- <string name="pin_target" msgid="3052256031352291362">"Pin"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Starting demo…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 8ed7bd8..a90fef7 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi Calling"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi only"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="global_action_logout" msgid="935179188218826050">"End session"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive report"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem and take screenshots. It might omit some less-used sections that take a long time to report."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device\'s location?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"The app will only have access to the location while you’re using the app."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Always allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device’s location?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"The app will always have access to the location, even when you’re not using the app."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your calendar?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your music?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Photos & videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"access your photos & videos"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your photos and videos, including tagged locations?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Allows the app to communicate with Near Field Communication (NFC) tags, cards and readers."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"disable your screen lock"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"request screen lock complexity"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Allows the app to learn the screen lock complexity level (high, medium, low or none), which indicates the possible range of length and type of the screen lock. The app can also suggest to users that they update the screen lock to a certain level but users can freely ignore and navigate away. Note that the screen lock is not stored in plain text so the app does not know the exact password."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"use biometric hardware"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Allows the app to use biometric hardware for authentication"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"manage fingerprint hardware"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Couldn’t process face. Please try again."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Face is too bright. Please try in lower light."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Face is too dark. Please uncover light source."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Please move sensor farther away from face."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Please bring sensor closer to face."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Please move sensor higher."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Please move sensor lower."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Please move sensor to the right."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Please move sensor to the left."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Please look at the sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"No face detected."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Too much motion."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Different face detected."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Please look more directly at the camera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Please look more directly at the camera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Please straighten your head vertically."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Please uncover your face."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Face hardware not available."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication cancelled by user."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"No face enrolled."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"This device does not have a face authentication sensor."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump collected. Tap to share."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"The process <xliff:g id="PROC">%1$s</xliff:g> has exceeded its process memory limit of <xliff:g id="SIZE">%2$s</xliff:g>. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringer volume"</string>
<string name="volume_music" msgid="5421651157138628171">"Media volume"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"A Wi‑Fi network proposed by <xliff:g id="NAME">%s</xliff:g> is available"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Do you want to connect to networks proposed by <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Sign in to network"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Connected"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Liquid or debris in USB port"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB port is automatically disabled. Tap to learn more."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Safe to use USB port"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tap to unlock work profile"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Connected to <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tap to view files"</string>
- <string name="pin_target" msgid="3052256031352291362">"Pin"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Starting demo…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 8ed7bd8..a90fef7 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi Calling"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi only"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="global_action_logout" msgid="935179188218826050">"End session"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive report"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem and take screenshots. It might omit some less-used sections that take a long time to report."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device\'s location?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"The app will only have access to the location while you’re using the app."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Always allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device’s location?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"The app will always have access to the location, even when you’re not using the app."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your calendar?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your music?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Photos & videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"access your photos & videos"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your photos and videos, including tagged locations?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Allows the app to communicate with Near Field Communication (NFC) tags, cards and readers."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"disable your screen lock"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"request screen lock complexity"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Allows the app to learn the screen lock complexity level (high, medium, low or none), which indicates the possible range of length and type of the screen lock. The app can also suggest to users that they update the screen lock to a certain level but users can freely ignore and navigate away. Note that the screen lock is not stored in plain text so the app does not know the exact password."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"use biometric hardware"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Allows the app to use biometric hardware for authentication"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"manage fingerprint hardware"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Couldn’t process face. Please try again."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Face is too bright. Please try in lower light."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Face is too dark. Please uncover light source."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Please move sensor farther away from face."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Please bring sensor closer to face."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Please move sensor higher."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Please move sensor lower."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Please move sensor to the right."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Please move sensor to the left."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Please look at the sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"No face detected."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Too much motion."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Different face detected."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Please look more directly at the camera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Please look more directly at the camera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Please straighten your head vertically."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Please uncover your face."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Face hardware not available."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication cancelled by user."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"No face enrolled."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"This device does not have a face authentication sensor."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump collected. Tap to share."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"The process <xliff:g id="PROC">%1$s</xliff:g> has exceeded its process memory limit of <xliff:g id="SIZE">%2$s</xliff:g>. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringer volume"</string>
<string name="volume_music" msgid="5421651157138628171">"Media volume"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"A Wi‑Fi network proposed by <xliff:g id="NAME">%s</xliff:g> is available"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Do you want to connect to networks proposed by <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Sign in to network"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Connected"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Liquid or debris in USB port"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB port is automatically disabled. Tap to learn more."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Safe to use USB port"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tap to unlock work profile"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Connected to <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tap to view files"</string>
- <string name="pin_target" msgid="3052256031352291362">"Pin"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Starting demo…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index a8173dd..a531355 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"WiFi Calling"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi only"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Not forwarded"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="global_action_logout" msgid="935179188218826050">"End session"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an e-mail message. It will take a little time from starting the bug report until it is ready to be sent; please be patient."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive report"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem, and take screenshots. It might omit some less-used sections that take a long time to report."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device\'s location?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"The app will only have access to the location while you’re using the app."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Always allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access this device’s location?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"The app will always have access to the location, even when you’re not using the app."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your calendar?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your music?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Photos & videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"access your photos & videos"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Allow <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> to access your photos and videos, including tagged locations?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Allows the app to communicate with Near Field Communication (NFC) tags, cards, and readers."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"disable your screen lock"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"request screen lock complexity"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Allows the app to learn the screen lock complexity level (high, medium, low or none), which indicates the possible range of length and type of the screen lock. The app can also suggest to users that they update the screen lock to a certain level but users can freely ignore and navigate away. Note that the screen lock is not stored in plaintext so the app does not know the exact password."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"use biometric hardware"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Allows the app to use biometric hardware for authentication"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"manage fingerprint hardware"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Couldn’t process face. Please try again."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Face is too bright. Please try in lower light."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Face is too dark. Please uncover light source."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Please move sensor farther from face."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Please bring sensor closer to face."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Please move sensor higher."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Please move sensor lower."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Please move sensor to the right."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Please move sensor to the left."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Please look at the sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"No face detected."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Too much motion."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Different face detected."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Please look more directly at the camera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Please look more directly at the camera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Please straighten your head vertically."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Please uncover your face."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Face hardware not available."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Face operation canceled."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Face authentication canceled by user."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"No face enrolled."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"This device does not have a face authentication sensor."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump collected. Tap to share."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"The process <xliff:g id="PROC">%1$s</xliff:g> has exceeded its process memory limit of <xliff:g id="SIZE">%2$s</xliff:g>. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringer volume"</string>
<string name="volume_music" msgid="5421651157138628171">"Media volume"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"A Wi‑Fi network proposed by <xliff:g id="NAME">%s</xliff:g> is available"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Do you want to connect to networks proposed by <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Sign in to network"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no internet access"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Connected"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5GHz only. Instead, this device will use the 5GHz band when available."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Liquid or debris in USB port"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB port is automatically disabled. Tap to learn more."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Safe to use USB port"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tap to unlock work profile"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Connected to <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tap to view files"</string>
- <string name="pin_target" msgid="3052256031352291362">"Pin"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Starting demo…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 387eea3..d058728 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Llamada por Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivada"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Red Wi-Fi preferida"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Red móvil preferida"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Solo Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no se ha remitido"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe de errores"</string>
<string name="global_action_logout" msgid="935179188218826050">"Finalizar sesión"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Iniciar informe de errores"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Se recopilará información sobre el estado actual de tu dispositivo, que se enviará por correo. Pasarán unos minutos desde que se inicie el informe de errores hasta que se envíe, por lo que te recomendamos que tengas paciencia."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Informe interactivo"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso del informe, ingresar más detalles acerca del problema y tomar capturas de pantalla. Es posible que se omitan secciones menos usadas cuyos informes demoran más en completarse."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicación"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder a la ubicación de este dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a la ubicación de este dispositivo?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"La app solo tendrá acceso a la ubicación cuando la uses."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a la ubicación?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"La app siempre tendrá acceso a la ubicación, incluso cuando no la uses."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder al calendario"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a tu calendario?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"¿Quieres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a tu música?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos y videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acceder a tus fotos y videos"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a tus fotos y videos, incluidas las ubicaciones etiquetadas?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contenido de las ventanas"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de la ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la Exploración táctil"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Permite que la aplicación se comunique con lectores, tarjetas y etiquetas de Comunicación de campo cercano (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"desactivar el bloqueo de pantalla"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permite que la aplicación desactive el bloqueo del teclado y cualquier protección con contraseña asociada. Por ejemplo, el dispositivo puede desactivar el bloqueo del teclado cuando recibe una llamada telefónica y volver a activarlo cuando finaliza la llamada."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"solicitar complejidad del bloqueo de pantalla"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Permite que la app conozca el nivel de complejidad del bloqueo de pantalla (alta, media, baja o ninguna), lo que indica el rango de duración posible y el tipo de bloqueo. La app también puede sugerirles a los usuarios que actualicen el bloqueo de pantalla a un determinado nivel, aunque ellos pueden ignorar esta sugerencia y seguir navegando. Ten en cuenta que el bloqueo de pantalla no se almacena como texto sin formato, por lo que la app no conoce la contraseña exacta."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"usar hardware biométrico"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Permite que la app use hardware biométrico para realizar la autenticación"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"Administrar el hardware de huellas digitales"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar el hardware de autenticación facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que la app use el hardware de autenticación facial para reconocerte"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Error al procesar el rostro. Vuelve a intentarlo."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"El rostro se ve muy claro. Prueba con menos luz."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"El rostro se ve muy oscuro. Prueba con más luz."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Aleja el sensor del rostro."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Acerca el sensor al rostro."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Coloca el sensor más arriba."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Coloca el sensor más abajo."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Mueve el sensor hacia la derecha."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Mueve el sensor hacia la izquierda."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Mira al sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"No se detectó ningún rostro."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Te estás moviendo demasiado."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vuelve a registrar tu cara."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Se detectó otra cara."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Es muy similar a la anterior. Haz otra pose."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Mira directamente a la cámara."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Mira directamente a la cámara."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Mantén la cabeza en posición vertical."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"No te tapes la cara."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware de reconocimiento facial no disponible"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Se agotó el tiempo. Vuelve a intentarlo."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"No se puede almacenar el rostro."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Se canceló el reconocimiento facial."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"El usuario canceló la autenticación de rostro."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Inténtalo de nuevo más tarde."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autent. facial inhabilitada."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Vuelve a intentarlo."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"No registraste ningún rostro."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Este dispositivo no tiene sensor de autenticación facial."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Rostro <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Abrir <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> se cerrará sin guardar"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> superó el límite de memoria."</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Se recopiló el volcado de pila. Toca para compartir."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"¿Compartir volcado de pila?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"El proceso <xliff:g id="PROC">%1$s</xliff:g> superó el límite de memoria de proceso de <xliff:g id="SIZE">%2$s</xliff:g>. Hay un volcado de pila disponible para que puedas compartirlo con el programador. Ten cuidado, este volcado de pila puede contener información personal a la que la aplicación tiene acceso."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Seleccionar una acción para el texto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volumen del timbre"</string>
<string name="volume_music" msgid="5421651157138628171">"Volumen de los medios"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Presiona para ver todas las redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas las redes"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Está disponible una red Wi‑Fi sugerida por <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"¿Deseas conectarte a las redes sugeridas por <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sí"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Se activará la conexión Wi-Fi automáticamente"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Acceder a la red"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"La red Wi-Fi no tiene acceso a Internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Presiona para ver opciones"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Se estableció conexión"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Cambios en la configuración de tu hotspot"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Cambió la banda de tu hotspot."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Si bien este dispositivo no admite la opción para conectarse exclusivamente a bandas de 5 GHz, las usará cuando estén disponibles."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Presiona para desactivar la depuración USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Seleccionar para desactivar la depuración por USB"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Hay líquido o suciedad en el puerto USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"El puerto USB se inhabilitó automáticamente. Presiona para obtener más información."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Es seguro usar el puerto USB"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Presiona para desbloquear"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Conectado a <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Presiona para ver archivos"</string>
- <string name="pin_target" msgid="3052256031352291362">"Fijar"</string>
- <string name="unpin_target" msgid="3556545602439143442">"No fijar"</string>
<string name="app_info" msgid="6856026610594615344">"Información de apps"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Iniciando demostración…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificación de información del modo de Rutinas"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Es posible que la batería se agote antes de la carga habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Se activó el Ahorro de batería para extender la duración de la batería"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Carpeta"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplicación de Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Archivo"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index f87743a..6e212d7 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"WiFi-kõned"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Väljas"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"WiFi eelistusega"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Eelistatud on mobiilne andmeside"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Ainult WiFi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: pole suunatud"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Veaaruanne"</string>
<string name="global_action_logout" msgid="935179188218826050">"Seansi lõpp"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekraanipilt"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Veaaruande võtmine"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Nii kogutakse teavet teie seadme praeguse oleku kohta, et saata see meilisõnumina. Enne kui saate veaaruande ära saata, võtab selle loomine natuke aega; varuge kannatust."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interakt. aruanne"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Kasutage seda enamikul juhtudel. See võimaldab jälgida aruande edenemist, sisestada probleemi kohta täpsemat teavet ja jäädvustada ekraanipilte. Vahele võivad jääda mõned vähem kasutatud jaotised, millest teavitamine võtab rohkem aega."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Asukoht"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pääseda juurde selle seadme asukohale"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Kas lubada rakendusele <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> juurdepääs selle seadme asukohale?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Rakendusel on juurdepääs asukohale vaid siis, kui rakendust kasutate."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Kas lubada rak. <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> alati juurdepääs seadme asukohale?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Rakendusel on alati juurdepääs asukohale isegi siis, kui te rakendust ei kasuta."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"juurdepääs kalendrile"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Kas lubada rakendusele <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> juurdepääs teie kalendrile?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Kas lubada rakendusele <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> juurdepääs teie muusikale?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotod ja videod"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"Pääseda juurde teie fotodele ja videotele"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Kas lubada rakendusel <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> teie fotodele ja videotele, sh märgistatud asukohtadele, juurde pääseda?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Akna sisu toomine"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kasutatava akna sisu kontrollimine."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Puudutusega sirvimise sisselülitamine"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Võimaldab rakendusel suhelda lähiväljaside (NFC) märgendite, kaartide ja lugeritega."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"keelake ekraanilukk"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Võimaldab rakendusel keelata klahviluku ja muu seotud parooli turvalisuse. Näiteks keelab telefon klahviluku sissetuleva kõne vastuvõtmisel ja lubab klahviluku uuesti, kui kõne on lõpetatud."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"taotleda ekraaniluku keerukust"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Lubab rakendusel vaadata ekraaniluku keerukuse taset (kõrge, keskmine, madal või puudub), mis näitab ekraaniluku võimalikku pikkust ja tüüpi. Rakendus võib kasutajatele soovitada ka ekraaniluku viimist teatud tasemele, kuid kasutajad võivad seda eirata ja kuvalt lahkuda. Pange tähele, et ekraanilukku ei salvestata lihttekstina, seega ei tea rakendus täpset parooli."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"kasutada biomeetrilist riistvara"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Võimaldab rakendusel autentimiseks kasutada biomeetrilist riistvara"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"sõrmejälje riistvara haldamine"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Lubab rakendusel tühistada meetodid kasutatavate näomallide lisamiseks ja kustutamiseks."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"kasutada näo autentimise riistvara"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Võimaldab rakendusel autentimiseks kasutada näo autentimise riistvara"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nägu ei õnnestunud töödelda. Proovige uuesti."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Nägu on liiga hele. Proovige hämaramas."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Nägu on liiga tume. Kasutage valgusallikat."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Liigutage andur näost kaugemale."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Liigutage andur näole lähemale."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Liigutage andurit kõrgemale."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Liigutage andurit madalamale."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Liigutage andurit paremale."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Liigutage andurit vasakule."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Vaadake andurit."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nägu ei tuvastatud."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Liiga palju liikumist."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registreerige oma nägu uuesti."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Tuvastati teine nägu."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Liiga sarnane, palun muutke oma asendit."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Vaadake otse kaamerasse."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Vaadake otse kaamerasse."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Pange pea vertikaalselt otseks."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Tooge oma nägu esile."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Näotuvastuse riistvara pole saadaval."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Näotuvastuse taimeri ajalõpp. Proovige uuesti."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Nägu ei saa salvestada."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Näotuvastuse toiming tühistati."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Kasutaja tühistas näo autentimise."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Liiga palju katseid. Proovige hiljem uuesti."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Liiga palju katseid. Näotuvastus on keelatud."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Proovige uuesti."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nägu pole registreeritud."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Sellel seadmel pole näotuvastuse andurit."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Nägu <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Ava rakendus <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"Rakendus <xliff:g id="OLD_APP">%1$s</xliff:g> suletakse salvestamata"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Protsess <xliff:g id="PROC">%1$s</xliff:g> ületas mälupiirangu"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Mälutõmmis salvestati. Puudutage jagamiseks."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Kas jagada mälutõmmist?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Protsess <xliff:g id="PROC">%1$s</xliff:g> ületas protsessi mälupiirangu <xliff:g id="SIZE">%2$s</xliff:g>. Saate mälutõmmist jagada selle arendajaga. Olge ettevaatlik: see mälutõmmis võib sisaldada teie isiklikke andmeid, millele rakendusel on juurdepääs."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Valige teksti jaoks toiming"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Helina helitugevus"</string>
<string name="volume_music" msgid="5421651157138628171">"Meediumi helitugevus"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Puudutage kõikide võrkude nägemiseks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Ühenda"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Kõik võrgud"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Rakenduse <xliff:g id="NAME">%s</xliff:g> soovitatud WiFi-võrk on saadaval"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Kas soovite ühenduse luua rakenduse <xliff:g id="NAME">%s</xliff:g> soovitatud võrkudega?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Jah"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ei"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WiFi lülitub sisse automaatselt"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Võrku sisselogimine"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"WiFi-võrgul pole juurdepääsu Internetile"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Puudutage valikute nägemiseks"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Ühendatud"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Muudatused teie leviala seadetes"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Teie leviala riba on muutunud."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"See seade ei toeta teie eelistatud ainult 5 GHz riba. Seade kasutab 5 GHz riba ainult siis, kui see on saadaval."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-silumine ühendatud"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Puudutage USB silumise väljalülitamiseks"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Valige USB silumise keelamiseks"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB-pordis on vedelik või mustus"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-port on automaatselt keelatud. Puudutage lisateabe saamiseks."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB-porti on ohutu kasutada"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Puudut. tööprofiili avamiseks"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Ühendatud seadmega <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Failide vaatamiseks puudutage"</string>
- <string name="pin_target" msgid="3052256031352291362">"Kinnita"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Vabasta"</string>
<string name="app_info" msgid="6856026610594615344">"Rakenduse teave"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Demo käivitamine …"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rutiinirežiimi teabe märguanne"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Aku võib enne tavapärast laadimist tühjaks saada"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Akusäästja aktiveeriti aku tööea pikendamiseks"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Kaust"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Androidi rakendus"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fail"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 7835cfe..43c9b983 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"تماس ازطریق WiFi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"خاموش"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ترجیحی"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"داده شبکه تلفن همراه ارجح است"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"فقط Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: هدایت نشده"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"گزارش اشکال"</string>
<string name="global_action_logout" msgid="935179188218826050">"پایان جلسه"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"عکس صفحهنمایش"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"گرفتن گزارش اشکال"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"این گزارش اطلاعات مربوط به وضعیت دستگاه کنونی شما را جمعآوری میکند تا به صورت یک پیام ایمیل ارسال شود. از زمان شروع گزارش اشکال تا آماده شدن برای ارسال اندکی زمان میبرد؛ لطفاً شکیبا باشید."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"گزارش تعاملی"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"در بیشتر شرایط از این گزینه استفاده کنید. به شما امکان ردیابی پیشرفت گزارش و وارد کردن جزئیات بیشتری درباره مشکل را میدهد. ممکن است برخی از بخشهایی را که کمتر استفاده شده و باعث افزایش طول زمان گزارش میشود حذف کند."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"مکان"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"دسترسی به موقعیت مکانی این دستگاه"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه داده شود به مکان این دستگاه دسترسی پیدا کند؟"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"این برنامه تنها هنگامی که از آن استفاده میکنید، به مکان دسترسی خواهد داشت."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"همیشه به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه داده شود به مکان این دستگاه دسترسی داشته باشد؟"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"این برنامه همیشه به مکان دسترسی خواهد داشت، حتی اگر از آن استفاده نکنید."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"تقویم"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"دسترسی به تقویم شما"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه داده شود به تقویم شما دسترسی پیدا کند؟"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه داده شود به موسیقی شما دسترسی پیدا کند؟"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"عکس و ویدیو"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"دسترسی به عکسها و ویدیوهایتان"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> اجازه میدهید به عکسها و ویدیوهاتان، ازجمله مکانهای برچسبگذاریشده، دسترسی داشته باشد؟"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"محتوای پنجره را بازیابی کند"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"محتوای پنجرهای را که درحال تعامل با آن هستید بررسی میکند."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"فعالسازی کاوش لمسی"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"به برنامه اجازه میدهد تا با تگهای ارتباط میدان نزدیک (NFC)، کارتها و فایل خوان ارتباط برقرار کند."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"غیرفعال کردن قفل صفحه شما"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"به برنامه امکان میدهد قفل کلید و هر گونه امنیت گذرواژه مرتبط را غیرفعال کند. بهعنوان مثال تلفن هنگام دریافت یک تماس تلفنی ورودی قفل کلید را غیرفعال میکند و بعد از پایان تماس، قفل کلید را دوباره فعال میکند."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"درخواست پیچیدگی قفل صفحه"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"به برنامه اجازه میدهد سطح پیچیدگی قفل صفحه (بالا، متوسط، پایین یا هیچکدام) را بیاموزد که نشانگر طیف طول مدت و نوع قفل صفحه است. همچنین برنامه میتواند به کاربران پیشنهاد دهد قفل صفحه را به سطح خاصی بهروزرسانی کنند، اما کاربران میتوانند آزادانه این پیشنهاد را نادیده بگیرند و به سطح دیگری بروند. توجه داشته باشید که قفل صفحه در قالب نوشتار ساده ذخیره نمیشود، بنابراین برنامه گذرواژه دقیق را نمیداند."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"استفاده از سختافزار بیومتریک"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"به برنامه امکان میدهد از سختافزار بیومتریک برای احراز هویت استفاده کند"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"مدیریت سختافزار اثر انگشت"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"به برنامه امکان میدهد روشهایی را برای افزودن و حذف الگوهای چهره جهت استفاده فرابخواند."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"استفاده از سختافزار احراز هویت با چهره"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"به برنامه امکان میدهد از سختافزار احراز هویت با چهره برای احراز هویت استفاده کند"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"چهره پردازش نشد. لطفاً دوباره امتحان کنید."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"چهره خیلی روشن است. لطفاً در نور کمتری دوباره امتحان کنید."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"چهره خیلی تاریک است. لطفاً منبع نور را نپوشانید."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"لطفاً حسگر را از صورتتان دورتر کنید."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"لطفاً حسگر را به صورتتان نزدیکتر کنید."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"لطفاً حسگر را بالاتر ببرید."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"لطفاً حسگر را پایینتر بیاورید."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"لطفاً حسگر را به راست حرکت دهید."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"لطفاً حسگر را به چپ حرکت دهید."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"لطفاً به حسگر نگاه کنید."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"چهرهای شناسایی نشد."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"حرکت خیلی زیاد است."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"لطفاً چهرهتان را مجدداً ثبت کنید."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"چهره دیگری شناسایی شد."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"بسیار شبیه قبلی است، لطفاً قیافه دیگری بگیرید."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"لطفاً مستقیم به دوربین نگاه کنید."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"لطفاً مستقیم به دوربین نگاه کنید."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"لطفاً سرتان را بهصورت عمود نگه دارید."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"لطفاً چهرهتان را نپوشانید."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"سختافزار چهره دردسترس نیست."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"مهلت زمانی شناسایی چهره تمام شد. دوباره امتحان کنید"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"نمیتوان چهره را ذخیره کرد."</string>
<string name="face_error_canceled" msgid="283945501061931023">"عملیات شناسایی چهره لغو شد."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"احراز هویت چهره توسط کاربر لغو شد."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"چندین تلاش ناموفق. احراز هویت با چهره غیرفعال شد."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"دوباره امتحان کنید."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"هیچ چهرهای ثبت نشده است."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"این دستگاه حسگر احراز هویت با چهره ندارد."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"چهره <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> را باز کنید"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> بدون ذخیره شدن بسته میشود"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> از حد مجاز حافظه فراتر رفت"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"رونوشت حافظه جمعآوری شد. برای همرسانی ضربه بزنید."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"رونوشت حافظه آزاد به اشتراک گذاشته شود؟"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"فرآیند <xliff:g id="PROC">%1$s</xliff:g> از حد مجاز حافظه پردازش خود <xliff:g id="SIZE">%2$s</xliff:g> فراتر رفته است. یک رونوشت حافظه آزاد برای شما در دسترس است که با برنامهنویس به اشتراک بگذارید. مواظب باشید: این رونوشت حافظه آزاد میتواند حاوی هر نوع اطلاعات شخصی شما باشد که برنامه به آن دسترسی دارد."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"انتخاب یک عملکرد برای نوشتار"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"میزان صدای زنگ"</string>
<string name="volume_music" msgid="5421651157138628171">"میزان صدای رسانه"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"برای دیدن همه شبکهها ضربه بزنید"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"اتصال"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"همه شبکهها"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"شبکه Wi-Fi پیشنهادی <xliff:g id="NAME">%s</xliff:g> دردسترس است"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"مایلید به شبکههای پیشنهادی <xliff:g id="NAME">%s</xliff:g> متصل شوید؟"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"بله"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"خیر"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi بهطور خودکار روشن خواهد شد"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ورود به سیستم شبکه"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi به اینترنت دسترسی ندارد"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"برای گزینهها ضربه بزنید"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"متصل"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"تغییرات در تنظیمات نقطه اتصال"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"نوار نقطه اتصال شما تغییر کرد."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"این دستگاه از اولویت فقط ۵ گیگاهرتز شما پشتیبانی نمیکند. هرزمان نوار ۵ گیگاهرتزی دردسترس باشد این دستگاه از آن استفاده خواهد کرد."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"اشکالزدایی USB متصل شد"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"برای خاموش کردن اشکالزدایی USB ضربه بزنید"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"انتخاب کنید تا رفع عیب USB غیرفعال شود."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"مایعات یا خاکروبه در درگاه USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"درگاه USB بهطور خودکار غیرفعال شده است. برای اطلاعات بیشتر، ضربه بزنید."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"ایمن برای استفاده از درگاه USB"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"برای باز کردن قفل ضربه بزنید"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"به <xliff:g id="PRODUCT_NAME">%1$s</xliff:g> متصل شد"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"برای دیدن فایلها، ضربه بزنید"</string>
- <string name="pin_target" msgid="3052256031352291362">"پین کردن"</string>
- <string name="unpin_target" msgid="3556545602439143442">"برداشتن پین"</string>
<string name="app_info" msgid="6856026610594615344">"اطلاعات برنامه"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"در حال شروع نسخه نمایشی…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"اعلان اطلاعات حالت روال معمول"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ممکن است شارژ باتری قبل از شارژ معمول تمام شود"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"جهت افزایش عمر باتری، بهینهسازی باتری فعال شد"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"پوشه"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"برنامه Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"فایل"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 6efc8be..1b2d533 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi-puhelut"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Ei käytössä"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ensisijainen"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobiiliverkko ensisijainen"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Vain Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ei siirretty"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Virheraportti"</string>
<string name="global_action_logout" msgid="935179188218826050">"Lopeta käyttökerta"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Kuvakaappaus"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Luo virheraportti"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Toiminto kerää tietoja laitteen tilasta ja lähettää ne sähköpostitse. Virheraportti on valmis lähetettäväksi hetken kuluttua - kiitos kärsivällisyydestäsi."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiivinen"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Valitse tämä vaihtoehto useimmissa tapauksissa. Voit seurata raportin etenemistä, antaa lisätietoja ongelmasta ja tallentaa kuvakaappauksia. Tämä vaihtoehto saattaa ohittaa joitakin harvoin käytettyjä osioita, joiden käsittely raportissa kestää kauan."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Sijainti"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"käyttää laitteen sijaintia"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Saako <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tämän laitteen sijainnin käyttöoikeuden?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Sovellus saa sijainnin käyttöoikeuden vain jos käytät sovellusta."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Saako <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tämän laitteen sijainnin käyttöoikeuden?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Sovellus saa sijainnin käyttöoikeuden aina, vaikka et käyttäisi sovellusta."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalenteri"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"käyttää kalenteria"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Saako <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> kalenterisi käyttöoikeuden?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Saako <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> käyttää musiikkiasi?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Kuvat ja videot"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"käyttää kuvia ja videoita"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Saako <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pääsyn kuviin ja videoihin, mukaan lukien tagattuihin sijainteihin?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Noutaa ikkunan sisältöä"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tarkistaa käyttämäsi ikkunan sisältö."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ottaa kosketuksella tutkimisen käyttöön"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Antaa sovelluksen kommunikoida NFC (Near Field Communication) -tagien, -korttien ja -lukijoiden kanssa."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"poista näytön lukitus käytöstä"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Antaa sovelluksen ottaa näppäinlukon ja siihen liittyvän salasanasuojauksen pois käytöstä. Esimerkki: puhelin poistaa näppäinlukon käytöstä puhelun saapuessa ja asettaa lukon takaisin käyttöön puhelun päättyessä."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"pyytää näytön lukituksen monimutkaisuutta"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Sovellus saa luvan selvittää näytön lukituksen monimutkaisuuden (korkea, keskitaso tai matala) eli sen pituusluokan ja tyypin. Sovellus voi myös ehdottaa käyttäjille näytön lukituksen vaihtamista tietylle tasolle, mutta he voivat ohittaa tämän ja poistua. Itse näytön lukitusta ei säilytetä tekstimuodossa, joten sovellus ei tiedä sitä tarkalleen."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"käytä biometristä laitteistoa"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Sallii sovelluksen käyttää biometristä laitteistoa todennukseen"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"sormenjälkilaitteiston hallinnointi"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Sallii sovelluksen käyttää menetelmiä, joilla voidaan lisätä tai poistaa kasvomalleja."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"käyttää kasvojentodennuslaitteistoa"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Sallii sovelluksen käyttää todennuslaitteistoa todennukseen"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Kasvojen käsittely epäonnistui. Yritä uudelleen."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Kasvokuva on liian kirkas. Kokeile hämärää valoa."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Kasvokuva on liian tumma. Älä peitä valonlähdettä."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Siirrä anturia kauemmas kasvoista."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Tuo anturi lähemmäs kasvoja."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Siirrä anturia korkeammalle."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Siirrä anturia alemmas."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Siirrä anturia oikealle."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Siirrä anturia vasemmalle."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Katso anturia."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Kasvoja ei havaittu."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Laite liikkui liikaa."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Rekisteröi kasvot uudelleen."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Toiset kasvot havaittu."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Liian samanlainen, vaihda asentoa."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Katso suoremmin kameraan."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Katso suoremmin kameraan."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Suorista pää pystysuunnassa."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Älä peitä kasvojasi."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Kasvolaitteisto ei ole käytettävissä."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Kasvotoiminto aikakatkaistiin. Yritä uudelleen."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Kasvoja ei voi tallentaa."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Kasvotoiminto peruutettu"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Käyttäjä peruutti kasvojentunnistuksen."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Liikaa yrityksiä. Kasvojentodennus ei käytössä."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Yritä uudelleen."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Kasvoja ei ole otettu käyttöön."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Laitteessa ei ole kasvojentunnistusanturia."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Kasvot <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Avaa <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> suljetaan tallentamatta tietoja"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ylitti muistirajan."</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Keon vedos on kerätty, jaa se napauttamalla."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Jaetaanko keon vedos?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Prosessi <xliff:g id="PROC">%1$s</xliff:g> on ylittänyt muistirajan (<xliff:g id="SIZE">%2$s</xliff:g>). Keon vedos on jaettavissa kehittäjän kanssa. Ole varovainen: tämä keon vedos voi sisältää sellaisia henkilötietojasi, joihin sovelluksella on käyttöoikeus."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Valitse tekstille toiminto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Soittoäänen voimakkuus"</string>
<string name="volume_music" msgid="5421651157138628171">"Median äänenvoimakkuus"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Napauta, niin näet kaikki verkot."</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Yhdistä"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Kaikki verkot"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Wi-Fi-verkko, jota <xliff:g id="NAME">%s</xliff:g> ehdotti, on käytettävissä"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Haluatko muodostaa yhteyden verkkoihin, joita <xliff:g id="NAME">%s</xliff:g> ehdottaa?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Kyllä"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ei"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi käynnistyy automaattisesti"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Kirjaudu verkkoon"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi ei ole yhteydessä internetiin"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Näytä vaihtoehdot napauttamalla."</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Yhdistetty"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot-asetustesi muutokset"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot-taajuutesi on muuttunut."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Tämä laite ei tue asetustasi (vain 5 GHz). Sen sijaan laite käyttää 5 GHz:n taajuutta sen ollessa käytettävissä."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-vianetsintä yhdistetty"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Poista USB-virheenkorjaus käytöstä napauttamalla."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Poista USB-vianetsintä käytöstä valitsemalla tämä."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Nestettä tai likaa USB-portissa"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-portti poistetaan käytöstä automaattisesti. Napauta nähdäksesi lisätietoja."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB-portin käyttö on turvallista"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Avaa profiili koskettamalla."</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> yhdistetty"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Näytä tiedostot koskettamalla"</string>
- <string name="pin_target" msgid="3052256031352291362">"Kiinnitä"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Irrota"</string>
<string name="app_info" msgid="6856026610594615344">"Sovelluksen tiedot"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Aloitetaan esittelyä…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ohjelmatilan tietoilmoitus"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akku saattaa loppua ennen normaalia latausaikaa"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Virransäästö otettu käyttöön akunkeston pidentämiseksi"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Kansio"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android-sovellus"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Tiedosto"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 78f6ecc..36a47fb 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Chamadas por wifi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivado"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wifi preferida"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Datos móbiles preferidos"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Só por wifi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: non desviada"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe de erros"</string>
<string name="global_action_logout" msgid="935179188218826050">"Finalizar a sesión"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Crear informe de erros"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Este informe recompilará información acerca do estado actual do teu dispositivo para enviala en forma de mensaxe de correo electrónico. O informe de erros tardará un pouco en completarse desde o seu inicio ata que estea preparado para enviarse, polo que che recomendamos que teñas paciencia."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Informe interactivo"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Usa esta opción na maioría das circunstancias. Permíteche realizar un seguimento do progreso do informe, introducir máis detalles sobre o problema e facer capturas de pantalla. É posible que omita algunhas seccións menos usadas para as que se tarda máis en facer o informe."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Localización"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder á localización deste dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda á localización deste dispositivo?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"A aplicación só terá acceso á localización mentres a esteas utilizando."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Queres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda á localización?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"A aplicación sempre terá acceso á localización, aínda que non a esteas utilizando."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder ao teu calendario"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda ao teu calendario?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda á túa música?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos e vídeos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acceder ás fotos e aos vídeos"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Queres permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda ás túas fotos e vídeos, incluídas as localizacións etiquetadas?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar contido da ventá"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona o contido dunha ventá coa que estás interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar a exploración táctil"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Permite á aplicación comunicarse con etiquetas, tarxetas e lectores Near Field Communication (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"desactivar o bloqueo da pantalla"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permite á aplicación desactivar o bloqueo do teclado e calquera seguranza dos contrasinais asociada. Por exemplo, o teléfono desactiva o bloqueo do teclado ao recibir unha chamada telefónica entrante e, a continuación, volve activar o bloqueo do teclado unha vez finalizada a chamada."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"solicitar o nivel de complexidade do bloqueo de pantalla"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Permite que a aplicación consulte o nivel (alto, medio, baixo ou inexistente) de complexidade do bloqueo de pantalla para saber a lonxitude aproximada do contrasinal e o tipo de bloqueo de pantalla. A aplicación tamén pode suxerirlles aos usuarios que aumenten o nivel de complexidade do bloqueo de pantalla, aínda que poden ignorar a suxestión e seguir navegando. Ten en conta que o bloqueo de pantalla non se almacena como texto sen formato, polo que a aplicación non pode consultar o contrasinal exacto."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"utilizar hardware biométrico"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Permite que a aplicación utilice hardware biométrico para a autenticación"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"xestionar hardware de impresión dixital"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que a aplicación invoque métodos para engadir e eliminar modelos faciais de uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticación facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que a aplicación utilice hardware facial para a autenticación"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Non se puido procesar a cara. Téntao de novo."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"A cara vese demasiado brillante. Proba con menos luz."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"A cara vese demasiado escura. Proba con máis luz."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Afasta o sensor da cara."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Achega o sensor á cara."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Sube máis o sensor."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Baixa o sensor."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Move o sensor cara á dereita."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Move o sensor cara á esquerda."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Mira ao sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Non se detectou ningunha cara."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Demasiado movemento."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Volve rexistrar a túa cara."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Detectouse unha cara diferente."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"É moi similar. Cambia a pose."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Mira máis directamente á cámara."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Mira máis directamente á cámara."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Endereita a cabeza."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Descubre a cara."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"O hardware facial non está dispoñible."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Esgotouse o tempo de espera. Téntao de novo."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Non se puido almacenar a cara."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Cancelouse a operación relacionada coa cara"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"O usuario cancelou a autenticación da cara."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Téntao de novo máis tarde."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autenticación desactivada."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Téntao de novo."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Non se rexistrou ningunha cara."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Este dispositivo non ten sensor de autenticación de caras."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Abrir a aplicación <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"A aplicación <xliff:g id="OLD_APP">%1$s</xliff:g> pecharase sen gardar o contido"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> superou o límite de memoria"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Recompilouse un baleirado de montóns. Toca para compartilo."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Queres compartir o baleirado de montóns?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"O proceso <xliff:g id="PROC">%1$s</xliff:g> superou o seu límite de memoria de proceso de <xliff:g id="SIZE">%2$s</xliff:g>. Tes dispoñible un baleirado de montóns para compartir co seu programador. Debes ter coidado, pois este baleirado de montóns pode conter información persoal á que ten acceso a aplicación."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Seleccionar unha acción para o texto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume do timbre"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume dos elementos multimedia"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectarse"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Hai unha rede wifi dispoñible proposta por <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Queres conectarte ás redes propostas por <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Si"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Non"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"A wifi activarase automaticamente"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Inicia sesión na rede"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"A wifi non ten acceso a Internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca para ver opcións."</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Estableceuse conexión"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Cambios na configuración da zona wifi"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Modificouse a banda da zona wifi."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo non admite a opción de conectarse só a bandas de 5 GHz, pero usaraas se están dispoñibles."</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Toca para desactivar a depuración por USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecciona a opción para desactivar a depuración por USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Hai líquido ou residuos no porto USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"O porto USB desactivouse automaticamente. Toca para obter máis información."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"É seguro usar o porto USB"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Toca para desbloquear o perfil"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Conectado a <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Toca para ver os ficheiros"</string>
- <string name="pin_target" msgid="3052256031352291362">"Fixar"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Soltar"</string>
<string name="app_info" msgid="6856026610594615344">"Info. da aplicación"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Iniciando demostración…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificación da información do modo de rutina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"A batería pode esgotarse antes do habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Para ampliar a duración da batería activouse a función Aforro de batería"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Cartafol"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplicación Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Ficheiro"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 8131c0d..b8e2612 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"વાઇ-ફાઇ કૉલિંગ"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"બંધ"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"વાઇ-ફાઇ પસંદ કર્યું"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"મોબાઇલને પસંદગી"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"ફક્ત વાઇ-ફાઇ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ફોરવર્ડ કર્યો નથી"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"બગ રિપોર્ટ"</string>
<string name="global_action_logout" msgid="935179188218826050">"સત્ર સમાપ્ત કરો"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"સ્ક્રીનશૉટ"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"બગ રિપોર્ટ લો"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"આ, એક ઇ-મેઇલ સંદેશ તરીકે મોકલવા માટે, તમારા વર્તમાન ઉપકરણ સ્થિતિ વિશેની માહિતી એકત્રિત કરશે. એક બગ રિપોર્ટ પ્રારંભ કરીને તે મોકલવા માટે તૈયાર ન થઈ જાય ત્યાં સુધી તેમાં થોડો સમય લાગશે; કૃપા કરીને ધીરજ રાખો."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ક્રિયાપ્રતિક્રિયાત્મક રિપોર્ટ"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"મોટાભાગના સંજોગોમાં આનો ઉપયોગ કરો. તે રિપોર્ટની પ્રગતિને ટ્રૅક કરવા, સમસ્યા વિશે વધુ વિગતો દાખલ કરવાની અને સ્ક્રીનશૉટ્સ લેવાની મંજૂરી આપે છે. તે કેટલાક ઓછા ઉપયોગમાં આવતાં વિભાગો કે જે જાણ કરવામાં વધુ સમય લેતાં હોય તેને છોડી દઈ શકે છે."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"સ્થાન"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"માત્ર જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યાં હોય ત્યારે જ ઍપ સ્થાનને ઍક્સેસ કરી શકશે."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને હંમેશાં આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"તમે ઍપનો ઉપયોગ કરી રહ્યાં ન હોય, તો પણ ઍપ હંમેશાં સ્થાનને ઍક્સેસ કરી શકશે."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"કૅલેન્ડર"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"તમારા કેલેન્ડરને ઍક્સેસ કરવાની"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને તમારા કૅલેન્ડરને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને તમારા સંગીતમાં ઍક્સેસ કરવાની મંજૂરી આપવી છે?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ફોટા અને વીડિયો"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"તમારા ફોટો & વિડિઓ ઍક્સેસ કરો"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને તમારા ટૅગ કરેલાં સ્થાનો સહિત ફોટા અને વીડિયો ઍક્સેસ કરવાની મંજૂરી આપવી છે?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"વિંડો કન્ટેન્ટ પુનઃપ્રાપ્ત કરો"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"તમે જેની સાથે ક્રિયા-પ્રતિક્રિયા કરી રહ્યાં છો તે વિંડોનું કન્ટેન્ટ તપાસો."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"સ્પર્શ કરીને શોધખોળ કરવું ચાલુ કરો"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ઍપ્લિકેશનને નિઅર ફીલ્ડ કમ્યુનિકેશન (NFC) ટૅગ, કાર્ડ અને રીડર સાથે સંચાર કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"તમારું સ્ક્રીન લૉક અક્ષમ કરો"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"એપ્લિકેશનને કીલૉક અને કોઈપણ સંકળાયેલ પાસવર્ડ સુરક્ષા અક્ષમ કરવાની મંજૂરી આપે છે. ઉદાહરણ તરીકે, ઇનકમિંગ ફોન કૉલ પ્રાપ્ત કરતી વખતે ફોન, કીલૉકને અક્ષમ કરે છે, પછી કૉલ સમાપ્ત થઈ જવા પર કીલૉક ફરીથી સક્ષમ કરે છે."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"સ્ક્રીન લૉકની જટિલતા જાણવા માટે વિનંતી કરો"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"ઍપને સ્ક્રીન લૉકની જટિલતાનું લેવલ (ઊંચું, મધ્યમ, નીચું અથવા કોઈ નહીં) જાણવાની મંજૂરી આપે છે, જે સ્ક્રીન લૉકના પ્રકાર અને લંબાઈની સંભવિત શ્રેણી સૂચવે છે. ઍપ વપરાશકર્તાઓને સ્ક્રીન લૉકને ચોક્કસ લેવલ સુધી અપડેટ કરવાનું સૂચન પણ કરી શકે છે, પરંતુ વપરાશકર્તાઓ મુક્ત રીતે તેને અવગણીને નૅવિગેટ કરી શકે છે. એ વાતની નોંધ કરજો કે સ્ક્રીન લૉકનો સાદા ટેક્સ્ટમાં સંગ્રહ કરવામાં આવતો નથી, તેથી ઍપને ચોક્કસ પાસવર્ડની જાણ હોતી નથી."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"બાયોમેટ્રિક હાર્ડવેરનો ઉપયોગ કરો"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"ઍપને પ્રમાણીકરણ માટે બાયોમેટ્રિક હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ફિંગરપ્રિન્ટ હાર્ડવેરને સંચાલિત કરો"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ઍપને ઉપયોગ માટે ચહેરાના નમૂના ઉમેરવા અને ડિલીટ કરવાની પદ્ધતિને રદ કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરો"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ઍપને પ્રમાણીકરણ માટે ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"ચહેરાની પ્રક્રિયા કરી શકાઈ નથી. ફરી પ્રયાસ કરો."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"ચહેરો ખૂબ ચળકે છે. કૃપા કરીને ઓછા પ્રકાશવાળા સ્થાનમાં પ્રયાસ કરો."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"ચહેરો ખૂબ શ્યામ છે. કૃપા કરીને પ્રકાશના સૉર્સ ઉઘાડો."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"કૃપા કરીને સેન્સરને ચહેરાથી દૂર ખસેડો."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"કૃપા કરીને સેન્સરને ચહેરાની નજીક ખસેડો."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"કૃપા કરીને સેન્સરને ઉપર ખસેડો."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"કૃપા કરીને સેન્સર નીચે ખસેડો."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"કૃપા કરીને સેન્સરને જમણી બાજુ ખસેડો."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"કૃપા કરીને સેન્સરને ડાબી બાજુ ખસેડો."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"કૃપા કરીને સેન્સરની સામે જુઓ."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"કોઈ ચહેરો મળ્યો નથી."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"ડિવાઇસ ઘણો હલી રહ્યો છે."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"અલગ ચહેરાની ઓળખ થઈ."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"ઘણી સમાનતા ધરાવે છે, કૃપા કરીને તમારો પોઝ બદલો."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"કૃપા કરીને કૅમેરા તરફ સીધું જુઓ."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"કૃપા કરીને કૅમેરા તરફ સીધું જુઓ."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"કૃપા કરીને તમારું માથું સીધું ઊભું રાખો."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"કૃપા કરીને તમારો ચહેરો ઢાંકો નહીં."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"ચહેરા માટેનું હાર્ડવેર ઉપલબ્ધ નથી."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"ચહેરા માટેનો સમય સમાપ્ત થયો. ફરી પ્રયાસ કરો."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"ચહેરો સંગ્રહિત કરી શકાશે નહીં."</string>
<string name="face_error_canceled" msgid="283945501061931023">"ચહેરા સંબંધિત કાર્યવાહી રદ કરવામાં આવી છે."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"વપરાશકર્તાએ ચહેરા પ્રમાણીકરણ રદ કર્યુ."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"ઘણા બધા પ્રયત્નો. થોડા સમય પછી ફરી પ્રયાસ કરો."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"ઘણા બધા પ્રયત્નો. ચહેરાનું પ્રમાણીકરણ બંધ કરવામાં આવ્યું છે."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"ફરી પ્રયાસ કરો."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"કોઈ ચહેરાની નોંધણી કરવામાં આવી નથી."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"આ ડિવાઇસમાં ચહેરાના પ્રમાણીકરણ માટે કોઈ સેન્સર નથી."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"ચહેરાનું <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> ખોલો"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ફેરફારો સાચવ્યા વિના બંધ થશે"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> એ મેમરી સીમા વટાવી"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"હીપ ડમ્પ એકત્રિત કરવામાં આવ્યો છે. શેર કરવા માટે ટૅપ કરો."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"હીપ ડમ્પ શેર કરીએ?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"પ્રક્રિયા <xliff:g id="PROC">%1$s</xliff:g> એ તેની <xliff:g id="SIZE">%2$s</xliff:g> ની પ્રક્રિયા મેમરી મર્યાદા ઓળંગી. તેના વિકાસકર્તા સાથે શેર કરવા તમારી માટે એક હીપ ડમ્પ ઉપલબ્ધ છે. સાવચેત રહો: આ હીપ ડમ્પમાં તમારી વ્યક્તિગત માહિતી શામેલ હોઈ શકે છે કે જેની એપ્લિકેશનને ઍક્સેસ છે."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"ટેક્સ્ટ માટે ક્રિયા પસંદ કરો"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"રિંગર વૉલ્યૂમ"</string>
<string name="volume_music" msgid="5421651157138628171">"મીડિયા વૉલ્યૂમ"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"બધા નેટવર્ક જોવા ટૅપ કરો"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"કનેક્ટ કરો"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"બધા નેટવર્કો"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> દ્વારા સૂચિત કરવામાં આવેલ વાઇ-ફાઇ નેટવર્ક ઉપલબ્ધ છે"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"તમે <xliff:g id="NAME">%s</xliff:g> દ્વારા સૂચવવામાં આવેલાં નેટવર્ક સાથે કનેક્ટ કરવા માગો છો?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"હા"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ના"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"વાઇ-ફાઇ આપમેળે ચાલુ થઈ જશે"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"નેટવર્ક પર સાઇન ઇન કરો"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"વાઇ-ફાઇને કોઈ ઇન્ટરનેટ ઍક્સેસ નથી"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"વિકલ્પો માટે ટૅપ કરો"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"કનેક્ટેડ"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"તમારી હૉટસ્પૉટ સેટિંગને બદલે છે"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"તમારું હૉટસ્પૉટ બેન્ડ બદલાયેલ છે."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"આ ઉપકરણ તમારી ફક્ત 5GHz માટેની પસંદગીને સમર્થન આપતું નથી. તેના બદલે, જ્યારે આ ઉપકરણ જ્યારે 5GHz બેન્ડ ઉપલબ્ધ હશે ત્યારે તેનો ઉપયોગ કરશે."</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ડીબગિંગ કનેક્ટ થયું."</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB ડિબગીંગ બંધ કરવા માટે ટૅપ કરો"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ડિબગીંગને અક્ષમ કરવા માટે પસંદ કરો."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB પોર્ટમાં પ્રવાહી કે ધૂળ"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB પોર્ટ ઑટોમૅટિક રીતે બંધ કરવામાં આવ્યો છે. વધુ જાણવા માટે ટૅપ કરો."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB પોર્ટનો ઉપયોગ કરવો સુરક્ષિત છે"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"કાર્યાલયની પ્રોફાઇલ અનલૉક કરવા ટૅપ કરો"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> થી કનેક્ટ કરેલું છે"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ફાઇલો જોવા માટે ટૅપ કરો"</string>
- <string name="pin_target" msgid="3052256031352291362">"પિન"</string>
- <string name="unpin_target" msgid="3556545602439143442">"અનપિન કરો"</string>
<string name="app_info" msgid="6856026610594615344">"ઍપ્લિકેશન માહિતી"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ડેમો પ્રારંભ કરી રહ્યાં છે…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"રૂટિન મોડની માહિતીનું નોટિફિકેશન"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"સામાન્ય રીતે ચાર્જ કરવાના સમય પહેલાં બૅટરી સમાપ્ત થઈ શકે છે"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"બૅટરી આવરદા વધારવા માટે બૅટરી સેવર ચાલુ કર્યું"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ફોલ્ડર"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android ઍપ"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ફાઇલ"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 2fd884e..dca9f86 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"वाई-फ़ाई कॉलिंग"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"बंद"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"वाई-फ़ाई को प्राथमिकता"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"मोबाइल को प्राथमिकता"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"केवल वाई-फ़ाई"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अग्रेषित नहीं किया गया"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"गड़बड़ी की रिपोर्ट"</string>
<string name="global_action_logout" msgid="935179188218826050">"सत्र खत्म करें"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रीनशॉट"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"गड़बड़ी की रिपोर्ट लें"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"इससे ईमेल भेजने के लिए, आपके डिवाइस की मौजूदा स्थिति से जुड़ी जानकारी इकट्ठा की जाएगी. गड़बड़ी की रिपोर्ट बनना शुरू होने से लेकर भेजने के लिए तैयार होने तक कुछ समय लगेगा; कृपया इंतज़ार करें."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"सहभागी रिपोर्ट"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"अधिकांश परिस्थितियों में इसका उपयोग करें. यह आपको रिपोर्ट की प्रगति ट्रैक करने देता है, समस्या के बारे में अधिक विवरण डालने देता है और स्क्रीनशॉट लेने देता है. यह आपको ऐसे कम उपयोग किए गए अनुभाग मिटाने दे सकता है जिनकी रिपोर्ट करने में अधिक समय लगता है."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"जगह"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"इस डिवाइस की जगह तक पहुंचने दें"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को इस डिवाइस की \'जगह की जानकारी\' ऐक्सेस करने की अनुमति देना चाहते हैं?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ऐप्लिकेशन, डिवाइस की \'जगह की जानकारी\' सिर्फ़ तभी देख पाएगा जब आप इसका इस्तेमाल कर रहे हों."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को हमेशा डिवाइस की \'जगह की जानकारी\' एक्सेस करने दें?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ऐप्लिकेशन के पास हमेशा डिवाइस की \'जगह की जानकारी\' देखने की मंज़ूरी होगी, तब भी जब आप इसका इस्तेमाल न कर रहे हों."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"कैलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"अपने कैलेंडर को ऐक्सेस करने"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपना कैलेंडर देखने की अनुमति देना चाहते हैं?"</string>
@@ -308,17 +314,17 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"फ़ोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फ़ोन कॉल करने और उन्हें प्रबंधित करने की अनुमति दें"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को फ़ोन कॉल करने और उन्हें प्रबंधित करने की अनुमति दें?"</string>
- <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"बॉडी सेंसर"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"अपने महत्वपूर्ण संकेतों के बारे में सेंसर डेटा को ऐक्सेस करें"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने स्वास्थ्य से जुड़ी ज़रूरी जानकारी इस्तेमाल करने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"संगीत"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"अपना संगीत संग्रह एक्सेस करने दें"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपना संगीत एक्सेस करने दें?"</string>
- <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
- <skip />
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"फ़ोटो और वीडियो"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"अपने फ़ोटो और वीडियो एक्सेस करने दें"</string>
- <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
<skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडो की सामग्री वापस पाएं"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"उस विंडो की सामग्री की जाँच करें, जिसका आप इस्तेमाल कर रहे हैं."</string>
@@ -512,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ऐप्स को नियर फ़ील्ड कम्यूनिकेशन (NFC) टैग, कार्ड, और रीडर के साथ संचार करने देता है."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"अपना स्क्रीन लॉक अक्षम करें"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ऐप्स को कीलॉक और कोई भी संबद्ध पासवर्ड सुरक्षा अक्षम करने देता है. उदाहरण के लिए, इनकमिंग फ़ोन कॉल प्राप्त करते समय फ़ोन, कीलॉक को अक्षम कर देता है, फिर कॉल समाप्त होने पर कीलॉक को पुन: सक्षम कर देता है."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"जानें कि स्क्रीन लॉक कितना मुश्किल है"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"यह मंज़ूरी मिलने के बाद ऐप्लिकेशन जान पाता है कि स्क्रीन लॉक कितना मुश्किल (बहुत ज़्यादा, मध्यम, कम या बिल्कुल नहीं) है. इस स्तर से यह पता चलता है कि स्क्रीन लॉक कितना लंबा या किस तरह का है. ऐप्लिकेशन उपयोगकर्ताओं को यह सुझाव भी दे सकता है कि वे स्क्रीन लॉक को एक तय स्तर तक अपडेट करें. हालांकि, उपयोगकर्ता बेझिझक इसे अनदेखा करके आगे बढ़ सकते हैं. ध्यान दें कि स्क्रीन लॉक को सादे टेक्स्ट में सेव नहीं किया जाता है इसलिए ऐप्लिकेशन को बिल्कुल सही पासवर्ड पता नहीं होता."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"बायोमीट्रिक हार्डवेयर इस्तेमाल करने दें"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"पुष्टि के लिए, ऐप्लिकेशन को बायोमीट्रिक हार्डवेयर इस्तेमाल करने की मंज़ूरी दें"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"उंगली की छाप के लिए हार्डवेयर को प्रबंधित करें"</string>
@@ -568,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ऐप्लिकेशन को चेहरे के टेम्पलेट इस्तेमाल के तरीके जोड़ने और मिटाने की मंज़ूरी मिलती है."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"चेहरे की पुष्टि करने वाला हार्डवेयर इस्तेमाल करें"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ऐप्लिकेशन को चेहरे की पुष्टि करने वाले हार्डवेयर का इस्तेमाल करने की मंज़ूरी मिलती है"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"चेहरे की पहचान नहीं हो पाई. कृपया फिर कोशिश करें."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"चेहरे पर रोशनी ज़्यादा है. कृपया कम रोशनी में कोशिश करें."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"चेहरे पर रोशनी बहुत कम है. कृपया रोशनी बढ़ाएं."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"कृपया डिवाइस को चेहरे से दूर ले जाएं."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"कृपया डिवाइस को चेहरे के करीब लाएं."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"कृपया डिवाइस को ऊपर करें."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"कृपया डिवाइस को नीचे की ओर ले जाएं."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"कृपया डिवाइस को चेहरे की दाईं ओर ले जाएं."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"कृपया डिवाइस को चेहरे के बाईं ओर ले जाएं."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"कृपया सेंसर की ओर देखें."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"चेहरे की पहचान नहीं हो पाई."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"डिवाइस बहुत ज़्यादा हिल रहा है."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया फिर से अपने चेहरे की पहचान कराएं."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"यह चेहरा किसी और का है."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"चेहरा काफ़ी मिलता-जुलता है, कृपया अपना पोज़ बदलें."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"कृपया कैमरे की तरफ़ सीधा देखें."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"कृपया कैमरे की तरफ़ सीधा देखें."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"कृपया अपना सिर सीधा करें, दाएं-बाएं न झुकाएं"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"चेहरा साफ़ नहीं दिख रहा. कृपया रोशनी बढ़ाएं."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"चेहरे की पहचान करने वाला हार्डवेयर मौजूद नहीं है."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"चेहरे की पहचान का समय खत्म हुआ. फिर से कोशिश करें."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"चेहरा सेव करने की सीमा पूरी हो गई है."</string>
<string name="face_error_canceled" msgid="283945501061931023">"चेहरा पहचानने की कार्रवाई रद्द की गई."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"उपयोगकर्ता ने चेहरे की पहचान रद्द कर दी."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"कई बार कोशिश की गई. बाद में कोशिश करें."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"कई बार कोशिश की. चेहरा पहचानने की सुविधा बंद हुई."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"फिर से कोशिश करें."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"कोई चेहरा रजिस्टर नहीं किया गया है."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"इस डिवाइस में चेहरे की पहचान करने वाला सेंसर नहीं है."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1216,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> खोलें"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> बिना सेव किए बंद हो जाएगा"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> मेमोरी सीमा को पार कर गई है"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"हीप डंप (Java™ प्रोसेस मेमोरी का स्नैपशॉट) ले लिया गया है. शेयर करने के लिए टैप करें."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"हीप डंप शेयर करें?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"यह प्रक्रिया <xliff:g id="PROC">%1$s</xliff:g> इसकी <xliff:g id="SIZE">%2$s</xliff:g> की मेमोरी की सीमा को पार कर गई है. एक हीप डंप मौजूद है जिसे आप इसके डेवलपर से शेयर कर सकते हैं. सावधान रहें: इस हीप डंप में आपकी ऐसी कोई भी निजी जानकारी हो सकती है जिस पर ऐप्लिकेशन की पहुंच हो."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"मैसेज करने के लिए कोई कार्रवाई चुनें"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"रिंगर वॉल्यूम"</string>
<string name="volume_music" msgid="5421651157138628171">"मीडिया वॉल्यूम"</string>
@@ -1257,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सभी नेटवर्क देखने के लिए यहां पर टैप करें"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करें"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सभी नेटवर्क"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> का बताया हुआ वाई-फ़ाई नेटवर्क उपलब्ध नहीं है"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"क्या आप <xliff:g id="NAME">%s</xliff:g> के बताए हुए नेटवर्क से कनेक्ट करना चाहते हैं?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"हां"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"नहीं"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"वाई-फ़ाई अपने आप चालू हो जाएगा"</string>
@@ -1270,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"नेटवर्क में साइन इन करें"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"वाई-फ़ाई के लिए इंटरनेट नहीं मिल रहा है"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"विकल्पों के लिए टैप करें"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"जुड़ गया है"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"आपकी हॉटस्पॉट सेटिंग के हिसाब से बदलाव हो गए हैं"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"आपका हॉटस्पॉट बैंड बदल गया है."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"यह डिवाइस सिर्फ़ 5 गीगाहर्ट्ज़ की आपकी पसंद की सेटिंग पर काम नहीं करता, लेकिन जब भी 5 गीगाहर्ट्ज़ बैंड मौजूद होगा, डिवाइस उसका इस्तेमाल करने लगेगा."</string>
@@ -1357,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"डीबग करने के लिए एडीबी कनेक्ट किया गया"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"यूएसबी को डीबग करने की सुविधा बंद करने के लिए टैप करें"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB डीबग करना अक्षम करने के लिए चुनें."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"यूएसबी पोर्ट में तरल चीज़ या कचरा है"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"यूएसबी पोर्ट अपने आप बंद हो गया है. ज़्यादा जानने के लिए टैप करें."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"यूएसबी पोर्ट का इस्तेमाल करना सुरक्षित है"</string>
@@ -1908,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"कार्य प्रोफाइल अनलॉक करने हेतु टैप करें"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> से कनेक्ट किया गया"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"फ़ाइलें देखने के लिए टैप करें"</string>
- <string name="pin_target" msgid="3052256031352291362">"पिन करें"</string>
- <string name="unpin_target" msgid="3556545602439143442">"अनपिन करें"</string>
<string name="app_info" msgid="6856026610594615344">"ऐप्लिकेशन की जानकारी"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"डेमो प्रारंभ हो रहा है…"</string>
@@ -2000,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"रूटीन मोड जानकारी की सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"बैटरी आम तौर पर जितने समय चलती है, उससे पहले खत्म हो सकती है"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"बैटरी लाइफ़ बढ़ाने के लिए \'बैटरी सेवर\' चालू हो गया है"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"फ़ोल्डर"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android ऐप्लिकेशन"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"फ़ाइल"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index d50fda6..478fdad 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -142,8 +142,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi pozivi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Isključeno"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Prednost ima Wi-Fi mreža"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Za mobilne uređaje"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Samo Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije proslijeđeno"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -230,7 +232,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Izvješće o bugovima"</string>
<string name="global_action_logout" msgid="935179188218826050">"Završi sesiju"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Snimka zaslona"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Izvješće o programskoj pogrešci"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Time će se prikupiti podaci o trenutačnom stanju vašeg uređaja koje ćete nam poslati u e-poruci. Za pripremu izvješća o programskoj pogrešci potrebno je nešto vremena pa vas molimo za strpljenje."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktivno izvješće"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"To možete upotrebljavati u većini slučajeva. Moći ćete pratiti izradu izvješća, unijeti više pojedinosti o problemu i izraditi snimke zaslona. Mogu se izostaviti neki odjeljci koji se upotrebljavaju rjeđe i produljuju izradu izvješća."</string>
@@ -284,9 +287,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupiti lokaciji ovog uređaja"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupa lokaciji ovog uređaja?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacija će imati pristup lokaciji samo dok upotrebljavate aplikaciju."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupa lokaciji ovog uređaja?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacija će uvijek imati pristup lokaciji, čak i dok ne upotrebljavate aplikaciju."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupati kalendaru"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupa vašem kalendaru?"</string>
@@ -319,7 +325,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Želite li dopustiti aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupa vašoj glazbi?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografije i videozapisi"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pristup fotografijama i & videozapisima"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Želite li dopustiti da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa vašim fotografijama i videozapisima, uključujući označene lokacije?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dohvaćati sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregledat će sadržaj prozora koji upotrebljavate."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključiti značajku Istraži dodirom"</string>
@@ -512,8 +521,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Aplikaciji omogućuje komunikaciju s oznakama, karticama i čitačima komunikacije kratkog dometa (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"onemogućavanje zaključavanja zaslona"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Aplikaciji omogućuje onemogućavanje zaključavanja tipkovnice i svih pripadajućih sigurnosnih zaporki. Na primjer, telefon onemogućuje zaključavanje tipkovnice kod primanja dolaznog telefonskog poziva, nakon kojeg se zaključavanje tipkovnice ponovo omogućuje."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"zahtijevati složenost zaključavanja zaslona"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Omogućuje aplikaciji da sazna razinu složenosti zaključavanja zaslona (visoka, srednja, niska ili nijedna), što upućuje na mogući raspon duljine i vrstu zaključavanja zaslona. Aplikacija također korisnicima može predložiti da ažuriraju zaključavanje zaslona na određenu razinu, no korisnici to mogu slobodno zanemariti i nastaviti dalje. Napominjemo da se zaključavanje zaslona ne pohranjuje u običnom tekstu, pa aplikacija ne zna točnu zaporku."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"koristiti biometrijski hardver"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Aplikaciji omogućuje upotrebu biometrijskog hardvera radi autentifikacije"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"upravljanje hardverom za čitanje otisaka prstiju"</string>
@@ -568,37 +579,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Aplikaciji omogućuje pozivanje načina za dodavanje i brisanje predložaka lica za upotrebu."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"upotrebljavati hardver za autentifikaciju lica"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aplikaciji omogućuje upotrebu hardvera za autentifikaciju lica radi autentifikacije"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Obrada lica nije uspjela. Pokušajte ponovo."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Lice je presvijetlo. Smanjite osvjetljenje."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Lice je pretamno. Otkrijte izvor svjetlosti."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Odmaknite senzor od lica."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Približite senzor licu."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Podignite senzor."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Spustite senzor."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Pomaknite senzor udesno."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Pomaknite senzor ulijevo."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Gledajte senzor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Lice nije otkriveno."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Previše kretanja."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrirajte svoje lice."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Otkriveno je neko drugo lice."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Previše slično, promijenite pozu."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Gledajte izravnije u kameru."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Gledajte izravnije u kameru."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Izravnajte glavu okomito."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Otkrijte lice."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardver za lice nije dostupan."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Isteklo je vrijeme čekanja za lice. Pokušajte opet"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće pohraniti lice."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Otkazana je radnja s licem."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Autentifikaciju lica otkazao je korisnik."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Previše pokušaja. Autentifikacija lica onemogućena"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Pokušajte ponovo."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nije registrirano nijedno lice."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Ovaj uređaj nema senzor za autentifikaciju lica."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1233,9 +1266,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Otvori aplikaciju <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"Aplikacija <xliff:g id="OLD_APP">%1$s</xliff:g> zatvorit će se bez spremanja"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> premašio je ograničenje memorije"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Generirana je snimka memorije. Dodirnite za dijeljenje."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Žalite li dijeliti snimku memorije procesa?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> premašio je ograničenje memorije od <xliff:g id="SIZE">%2$s</xliff:g>. Dostupna vam je snimka memorije procesa koju možete podijeliti s razvojnim programerom. Budite oprezni: ta snimka memorije može sadržavati vaše osobne podatke kojoj aplikacija ima pristup."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Izaberite radnju za tekst"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Glasnoća zvona"</string>
<string name="volume_music" msgid="5421651157138628171">"Glasnoća medija"</string>
@@ -1276,8 +1316,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite za prikaz svih mreža"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Poveži"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Dostupna je Wi‑Fi mreža koju predlaže <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Želite li se povezati s mrežama koje predlaže <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi će se uključiti automatski"</string>
@@ -1289,9 +1331,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Prijava na mrežu"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nema pristup internetu"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Povezano"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Promjene postavki vaše žarišne točke"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Promijenila se frekvencija vaše žarišne točke."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ovaj uređaj ne podržava vašu postavku za upotrebu samo 5 GHz. Upotrebljavat će frekvenciju od 5 GHz kada je dostupna."</string>
@@ -1376,6 +1423,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Priključen je alat za otklanjanje pogrešaka putem USB-a"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Dodirnite da biste isključili otklanjanje pogrešaka putem USB-a"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Odaberite da biste onemogućili rješavanje programske pogreške na USB-u."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Tekućina ili prljavština u USB priključku"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB priključak automatski je onemogućen. Dodirnite da biste saznali više."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Upotreba USB priključka ponovo je sigurna"</string>
@@ -1939,8 +1990,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Dodirnite za otključavanje"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> – veza je uspostavljena"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Dodirnite da biste pregledali datoteke"</string>
- <string name="pin_target" msgid="3052256031352291362">"Prikvači"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Otkvači"</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Pokretanje demo-načina..."</string>
@@ -2032,6 +2081,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Obavještavanje o informacijama u Rutinskom načinu rada"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterija se može isprazniti prije uobičajenog vremena punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Štednja baterije aktivirana je kako bi se produljilo trajanje baterije"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Mapa"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android aplikacija"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Datoteka"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 5d0086b..2632482 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi-hívás"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Ki"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi előnyben részesítve"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferált: mobil"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Csak Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nincs átirányítva"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Programhiba bejelentése"</string>
<string name="global_action_logout" msgid="935179188218826050">"Munkamenet befejezése"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Képernyőkép"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Hibajelentés készítése"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Ezzel információt fog gyűjteni az eszköz jelenlegi állapotáról, amelyet a rendszer e-mailben fog elküldeni. Kérjük, legyen türelemmel, amíg a hibajelentés elkészül, és küldhető állapotba kerül."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktív jelentés"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Ezt használja a legtöbb esetben. Segítségével nyomon követheti a jelentés folyamatát, további részleteket adhat meg a problémáról, illetve képernyőképeket készíthet. A folyamat során kimaradhatnak az olyan kevésbé használt részek, amelyek jelentése túl sok időt igényel."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Helyadatok"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"hozzáférés az eszköz földrajzi helyéhez"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Engedélyezi a(z) <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> számára, hogy hozzáférjen az eszköz helyadataihoz?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Az alkalmazás csak akkor férhet hozzá a helyadatokhoz, amikor használja az alkalmazást."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Engedélyezi, hogy a(z) <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> hozzáférjen a helyadatokhoz?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Az alkalmazás bármikor hozzáférhet majd a helyadatokhoz, akkor is, amikor nem használja az alkalmazást."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Naptár"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"hozzáférés a naptárhoz"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Engedélyezi a(z) <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> számára, hogy hozzáférjen a naptárhoz?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Engedélyezi a(z) <b><xliff:g id="APP_NAME">%1$s</xliff:g></b&gt számára, hogy hozzáférjen az Ön zenéihez?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotók és videók"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"hozzáférés a fényképekhez és videókhoz"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Engedélyezi a(z) <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> számára a fotókhoz és videókhoz (köztük a címkézett helyekhez) való hozzáférést?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ablaktartalom lekérdezése"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"A használt ablak tartalmának vizsgálata."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Felfedezés érintéssel bekapcsolása"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Lehetővé teszi az alkalmazás számára, hogy NFC (Near Field Communication - kis hatósugarú vezeték nélküli kommunikáció) technológiát használó címkékkel, kártyákkal és leolvasókkal kommunikáljon."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"képernyőzár kikapcsolása"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Lehetővé teszi az alkalmazás számára a billentyűzár és bármely kapcsolódó jelszavas védelem kikapcsolását. Például a telefon feloldja a billentyűzárat bejövő hívás esetén, majd újra bekapcsolja azt a hívás végeztével."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"képernyőzár összetettségi szintjének lekérése"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Lehetővé teszi az alkalmazás számára, hogy megismerje a képernyőzár összetettségi szintjét (magas, közepes, alacsony vagy nincs), amely jelzi a képernyőzár lehetséges típusát és hosszát. Az alkalmazás ezenkívül javaslatot tehet a felhasználóknak a képernyőzár bizonyos szintre való frissítésére, de ezt a javaslatot a felhasználók figyelmen kívül hagyhatják. A képernyőzárat nem egyszerű szöveges formátumban tárolja a rendszer, ezért az alkalmazás nem fogja tudni a pontos jelszót."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"biometrikus hardver használata"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Lehetővé teszi az alkalmazás számára a biometrikus hardver hitelesítésre való használatát"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ujjlenyomat-olvasó hardver kezelése"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Engedélyezi, hogy az alkalmazás arcsablon-hozzáadási és -törlési metódusokat hívjon."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"arcfelismerő hardver használata"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcfelismerő hardvert"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nem sikerült feldolgozni az arcot. Próbálja újra."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Az arc túl világos. Kevesebb fény szükséges."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Az arc túl sötét. Több fény szükséges."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Tartsa az érzékelőt távolabb az arctól."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Tartsa az érzékelőt közelebb az archoz."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Emelje magasabbra az érzékelőt."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Engedje lejjebb az érzékelőt."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Mozdítsa el jobbra az érzékelőt."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Mozdítsa el balra az érzékelőt."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Nézzen az érzékelőbe."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nem észlelhető arc."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Túlságosan sok a mozgás."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<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="5553210341111255124">"Másik arcot észleltünk."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Túlságosan hasonló, változtasson a pózon."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Nézzen szemből a kamerába."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Nézzen szemből a kamerába."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Fejét tartsa egyenesen, függőleges irányban."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Ne takarja el az arcát."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Az arcfelismerő hardver nem áll rendelkezésre."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Időtúllépés az arcbeolvasásnál. Próbálja újra."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Az arc nem tárolható."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Az arccal kapcsolatos művelet törölve."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Az arc hitelesítését a felhasználó visszavonta."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Túl sok próbálkozás. Próbálja újra később."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Túl sok próbálkozás. Arcfelismerés letiltva."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Próbálkozzon újra."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nincs regisztrált arc."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Ez az eszköz nem rendelkezik arcfelismerő érzékelővel."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> arc"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> megnyitása"</string>
<string name="new_app_description" msgid="5894852887817332322">"A(z) <xliff:g id="OLD_APP">%1$s</xliff:g> mentés nélkül bezáródik"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"A(z) <xliff:g id="PROC">%1$s</xliff:g> túllépte a memóriakorlátot"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Elkészült a memória-pillanatfelvétel (heap dump). A megosztáshoz koppintson rá."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Megosztja a memória-pillanatfelvételt?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"A(z) <xliff:g id="PROC">%1$s</xliff:g> folyamat túllépte a(z) <xliff:g id="SIZE">%2$s</xliff:g> méretű memóriakorlátot. Elérhető a memória-pillanatfelvétel (heap dump), hogy megossza a fejlesztővel. Figyelem: ez a felvétel tartalmazhatja az Ön olyan személyes adatait, amelyekhez az alkalmazásnak hozzáférése van."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Válasszon ki egy műveletet a szöveghez"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Csengetés hangereje"</string>
<string name="volume_music" msgid="5421651157138628171">"Média hangereje"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Koppintással megjelenítheti az összes hálózatot"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Kapcsolódás"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Összes hálózat"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Rendelkezésre áll egy <xliff:g id="NAME">%s</xliff:g> által javasolt Wi-Fi-hálózat"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Szeretne csatlakozni a(z) <xliff:g id="NAME">%s</xliff:g> által javasolt hálózatokhoz?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Igen"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nem"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"A Wi-Fi automatikusan bekapcsol"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Bejelentkezés a hálózatba"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"A Wi-Fi-hálózaton nincs internetkapcsolat"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Koppintson a beállítások megjelenítéséhez"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Csatlakozva"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"A hotspot beállításainak módosítása"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"A hotspot sávja megváltozott."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ez az eszköz nem támogatja a csak 5 GHz-es sávra vonatkozó beállítást. Az eszköz akkor használ 5 GHz-es sávot, ha a sáv rendelkezésre áll."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hibakereső csatlakoztatva"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Koppintson az USB-hibakeresés kikapcsolásához"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Válassza ezt az USB hibakeresés kikapcsolásához."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Folyadék vagy szennyeződés az USB-portban"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-port automatikusan letiltva. Koppintson, ha további információra van szüksége."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Az USB-port biztonságosan használható"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"A feloldáshoz koppintson rá"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Csatlakoztatva a(z) <xliff:g id="PRODUCT_NAME">%1$s</xliff:g> eszközhöz"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Koppintson ide a fájlok megtekintéséhez"</string>
- <string name="pin_target" msgid="3052256031352291362">"Rögzítés"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Feloldás"</string>
<string name="app_info" msgid="6856026610594615344">"Alkalmazásinformáció"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Bemutató indítása…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Információs értesítés a rutinmódról"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Előfordulhat, hogy az akkumulátor lemerül a szokásos töltési időszak előtt"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Akkumulátorkímélő mód aktiválva az akkumulátor üzemidejének növelése érdekében"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Mappa"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android-alkalmazás"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fájl"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 6432e37..dc77319 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Panggilan WiFi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Nonaktif"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi dipilih"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Seluler dipilih"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Khusus Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Tidak diteruskan"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Laporan bug"</string>
<string name="global_action_logout" msgid="935179188218826050">"Akhiri sesi"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Ambil laporan bug"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Ini akan mengumpulkan informasi status perangkat Anda saat ini, untuk dikirimkan sebagai pesan email. Harap bersabar, mungkin perlu waktu untuk memulai laporan bug hingga siap dikirim."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Laporan interaktif"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Gunakan ini di berbagai keadaan. Ini memungkinkan Anda melacak kemajuan laporan, memasukkan detail masalah selengkapnya, dan mengambil screenshot. Mungkin menghilangkan beberapa bagian yang jarang digunakan dan yang perlu waktu lama untuk dilaporkan."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokasi"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"mengakses lokasi perangkat ini"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Izinkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses lokasi perangkat ini?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikasi ini hanya akan memiliki akses ke lokasi saat Anda sedang menggunakan aplikasi."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Selalu izinkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses lokasi perangkat ini?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikasi ini akan selalu memiliki akses ke lokasi, bahkan saat Anda sedang tidak menggunakan aplikasi."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"mengakses kalender"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Izinkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses kalender?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Izinkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> untuk mengakses musik?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Foto & video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"mengakses foto & video Anda"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Izinkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses foto dan video Anda, termasuk lokasi yang diberi tag?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Mengambil konten jendela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Memeriksa konten jendela tempat Anda berinteraksi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Mengaktifkan Jelajahi dengan Sentuhan"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Mengizinkan apl berkomunikasi dengan tag, kartu, dan alat pembaca Komunikasi Nirkabel Jarak Dekat (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"nonaktifkan kunci layar Anda"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Memungkinkan aplikasi menonaktifkan kunci tombol dan keamanan sandi apa pun yang terkait. Misalnya, ponsel menonaktifkan kunci tombol saat menerima panggilan telepon masuk, kemudian mengaktifkan kembali kunci tombol ketika panggilan selesai."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"meminta kompleksitas kunci layar"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Mengizinkan aplikasi mempelajari tingkat kompleksitas kunci layar (tinggi, sedang, rendah, atau tidak ada), yang menunjukkan kemungkinan rentang durasi dan jenis kunci layar. Aplikasi juga dapat menyarankan agar pengguna memperbarui kunci layar ke tingkat tertentu, namun pengguna dapat mengabaikan dan keluar dengan bebas. Perlu diperhatikan bahwa kunci layar tidak disimpan dalam teks biasa, sehingga aplikasi tidak mengetahui sandi yang sebenarnya."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"gunakan hardware biometrik"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Mengizinkan aplikasi menggunakan hardware biometrik untuk autentikasi"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"kelola hardware sidik jari"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Mengizinkan apl memicu metode untuk menambah & menghapus template wajah untuk digunakan."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gunakan hardware autentikasi wajah"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Mengizinkan aplikasi untuk menggunakan hardware autentikasi wajah untuk autentikasi"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Tidak dapat memproses wajah. Harap coba lagi."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Wajah terlalu cerah. Coba dengan cahaya lebih redup."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Wajah terlalu gelap. Buka sumber cahaya."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Jauhkan sensor dari wajah."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Dekatkan sensor ke wajah."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Naikkan sensor."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Turunkan sensor."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Gerakkan sensor ke kanan."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Gerakkan sensor ke kiri."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Lihat sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Tidak ada wajah yang terdeteksi"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Terlalu banyak gerakan."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Daftarkan ulang wajah Anda."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Wajah yang berbeda terdeteksi."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Terlalu mirip, ubah pose Anda."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Lihat langsung ke kamera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Lihat langsung ke kamera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Luruskan kepala secara vertikal."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Tunjukkan wajah Anda."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware pemrosesan wajah tidak tersedia."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Waktu tunggu wajah habis. Harap coba lagi."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Wajah tidak dapat disimpan."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Pemrosesan wajah dibatalkan."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Autentikasi wajah dibatalkan oleh pengguna."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percobaan. Coba lagi nanti."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Terlalu sering dicoba. Autentikasi wajah dinonaktifkan."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Coba lagi."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Tidak ada wajah yang didaftarkan."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Perangkat ini tidak memiliki sensor autentikasi wajah."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> wajah"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Buka <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> akan ditutup tanpa menyimpan"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> melampaui batas memori"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Informasi memori dikumpulkan. Tap untuk membagikan."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share tumpukan membuang?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Proses <xliff:g id="PROC">%1$s</xliff:g> telah melampaui batas memori proses <xliff:g id="SIZE">%2$s</xliff:g>. Tumpukan sampah tersedia untuk Anda bagikan kepada pengembangnya. Hati-hati, tumpukan sampah ini hanya dapat memuat informasi pribadi yang dapat diakses oleh aplikasi."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Pilih tindakan untuk teks"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume dering"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume media"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap untuk melihat semua jaringan"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Hubungkan"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Semua jaringan"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Jaringan Wi‑Fi yang diusulkan oleh <xliff:g id="NAME">%s</xliff:g> tersedia"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Sambungkan ke jaringan yang diusulkan oleh <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ya"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Tidak"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi akan aktif otomatis"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Login ke jaringan"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tidak memiliki akses internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap untuk melihat opsi"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Tersambung"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Perubahan pada setelan hotspot Anda"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pita hotspot Anda telah berubah."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Perangkat ini tidak mendukung preferensi Anda, yaitu hanya 5GHz. Sebagai gantinya, perangkat ini akan menggunakan pita frekuensi 5GHz jika tersedia."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debugging USB terhubung"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tap untuk menonaktifkan debug USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Pilih untuk menonaktifkan debugging USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Cairan atau kotoran di port USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Port USB otomatis dinonaktifkan. Tap untuk mempelajari lebih lanjut."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Port USB aman digunakan"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tap untuk membuka kunci profil kerja"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Tersambung ke <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tap untuk melihat file"</string>
- <string name="pin_target" msgid="3052256031352291362">"Pasang pin"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Lepas pin"</string>
<string name="app_info" msgid="6856026610594615344">"Info aplikasi"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Memulai demo..."</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notifikasi info Mode Rutinitas"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterai mungkin habis sebelum pengisian daya biasanya"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Penghemat Baterai diaktifkan untuk memperpanjang masa pakai baterai"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplikasi Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index d27d8b5..3f8c960 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"WiFi símtöl"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Slökkt"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi í forgangi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Farsímakerfi í forgangi"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi eingöngu"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ekki áframsent"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Villutilkynning"</string>
<string name="global_action_logout" msgid="935179188218826050">"Ljúka lotu"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skjámynd"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Útbúa villutilkynningu"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Þetta safnar upplýsingum um núverandi stöðu tækisins til að senda með tölvupósti. Það tekur smástund frá því villutilkynningin er ræst og þar til hún er tilbúin til sendingar – sýndu biðlund."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Gagnvirk skýrsla"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Þú getur notað þetta í flestum tilvikum. Með þessu móti geturðu fylgst með framgangi tilkynningarinnar og slegið inn viðbótarupplýsingar um vandamálið. Hugsanlegt er að lítið notuðum hlutum verði sleppt til að spara tíma."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Staðsetning"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"fá aðgang að staðsetningu þessa tækis"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Viltu veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að staðsetningu þessa tækis?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Forritið hefur aðeins aðgang að staðsetningunni á meðan þú notar forritið."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Viltu alltaf veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að staðsetningu þessa tækis?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Forritið hefur alltaf aðgang að staðsetningunni, jafnvel þegar þú ert ekki að nota forritið."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Dagatal"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"fá aðgang að dagatalinu þínu"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Viltu veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að dagatalinu þínu?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Viltu veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að tónlistinni þinni?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Myndir og myndskeið"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"fá aðgang að myndunum og myndskeiðunum þínum"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Viltu veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að myndunum þínum og myndskeiðum, þ.m.t. merktum staðsetningum?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Sækja innihald glugga"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kanna innihald glugga sem þú ert að nota."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Kveikja á snertikönnun"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Leyfir forriti að eiga samskipti við NFC-merki, -spjöld og -lesara (nándarsamskipti)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"slökkva á skjálásnum"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Leyfir forriti að slökkva á símalásnum og öðrum öryggisaðgerðum tengdum aðgangsorði. Til dæmis gerir síminn lásinn óvirkan þegar símtal berst og læsist svo aftur að símtali loknu."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"biðja um flókinn skjálás"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Leyfir forritinu að læra hversu flókinn skjálásinn er (erfiður, miðlungs, léttur eða enginn), sem gefur til kynna lengd og tegund skjálássins. Forritið getur einnig lagt til að notendur geri skjálásinn flóknari upp að tilteknu marki, en notendur geta valið að hunsa það og halda áfram að vafra. Hafðu í huga að skjálásinn er ekki geymdur í ódulkóðuðum texta svo forritið veit ekki nákvæmt aðgangsorð."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"nota búnað fyrir líffræðileg gögn"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Leyfir forritinu að nota búnað fyrir líffræðileg gögn til auðkenningar"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"stjórna fingrafarabúnaði"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Leyfir forritinu að beita aðferðum til að bæta við og eyða andlitssniðmátum til notkunar."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"nota vélbúnað andlitsgreiningar"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Leyfir forritinu að nota andlitsgreiningarvélbúnað til auðkenningar"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Ekki tókst að vinna úr andlitinu. Reyndu aftur."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Andlitið er of bjart. Prófaðu í minni birtu."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Andlitið er of dökkt. Finndu betri lýsingu."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Færðu skynjarann lengra frá andlitinu."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Færðu skynjarann nær andlitinu."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Færðu skynjarann ofar."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Færðu skynjarann neðar."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Færðu skynjarann til hægri."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Færðu skynjarann til vinstri."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Horfðu á skynjarann."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Ekkert andlit fannst."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Of mikil hreyfing."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Skráðu nafnið þitt aftur."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Annað andlit greint."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Of svipað. Stilltu þér öðruvísi upp."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Líttu beint í myndavélina."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Líttu beint í myndavélina."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Vinsamlega réttu úr höfðinu."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Ekki hylja andlitið."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Andlitsvélbúnaður ekki til staðar."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Tímamörk runnu út fyrir andlit. Reyndu aftur."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Ekki tókst að geyma andlit."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Hætt við andlitsgreiningu."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Notandi hætti við andlitsgreiningu."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Of margar tilraunir. Reyndu aftur síðar."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Of margar tilraunir. Slökkt á andlitsgreiningu."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Reyndu aftur."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Ekkert andlit skráð."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Þetta tæki er ekki með skynjara fyrir andlitsgreiningu."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Andlit <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Opna <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> verður lokað án þess að vista"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> er yfir minnishámarki"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Minnisgögnum hefur verið safnað. Ýttu til að deila."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Deila minnisgögnum?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Ferlið <xliff:g id="PROC">%1$s</xliff:g> er komið yfir <xliff:g id="SIZE">%2$s</xliff:g> minnishámark sitt. Þú getur deilt minnisgögnum (heap dump) með þróunaraðilanum. Athugaðu að minnisgögnin kunna að innihalda allar þær persónuupplýsingar sem forritið hefur aðgang að um þig."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Veldu aðgerð fyrir texta"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Hljóðstyrkur hringingar"</string>
<string name="volume_music" msgid="5421651157138628171">"Hljóðstyrkur efnisspilunar"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ýttu til að sjá öll netkerfi"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Tengjast"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Öll netkerfi"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Wi‑Fi net sem <xliff:g id="NAME">%s</xliff:g> stakk upp á er í boði"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Viltu tengjast netum sem <xliff:g id="NAME">%s</xliff:g> stakk upp á?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Já"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nei"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Kveikt verður sjálfkrafa á Wi‑Fi"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Skrá inn á net"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi er ekki með tengingu við internetið"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ýttu til að sjá valkosti"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Tengt"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Breytingar á stillingum heits reits"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Tíðnisvið heita reitsins hefur breyst."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Þetta tæki styður ekki val þitt fyrir aðeins 5 GHz. Í staðinn mun þetta tæki nota 5 GHz tíðnisvið þegar það er í boði."</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-villuleit tengd"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Ýttu til að slökkva á USB-villuleit"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Veldu til að gera USB-villuleit óvirka."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Vökvi eða óhreinindi í USB-tengi"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-tengi er gert óvirkt sjálfkrafa. Ýttu til að fá frekari upplýsingar."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Óhætt að nota USB-tengi"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Ýttu til að opna vinnusnið"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Tengt við <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Ýttu til að skoða skrárnar"</string>
- <string name="pin_target" msgid="3052256031352291362">"Festa"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Losa"</string>
<string name="app_info" msgid="6856026610594615344">"Forritsupplýsingar"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Byrjar kynningu…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Upplýsingatilkynning aðgerðastillingar"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Rafhlaðan kann að tæmast áður en hún kemst í hleðslu"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Kveikt á rafhlöðusparnaði til að lengja endingu rafhlöðunnar"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Mappa"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android forrit"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Skrá"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index c5592b6..255510a 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Chiamate Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Non attiva"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Rete preferita: Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Rete preferita: dati mobili"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Solo Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: inoltro non effettuato"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Segnalazione di bug"</string>
<string name="global_action_logout" msgid="935179188218826050">"Termina sessione"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Apri segnalazione bug"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Verranno raccolte informazioni sullo stato corrente del dispositivo che saranno inviate sotto forma di messaggio email. Passerà un po\' di tempo prima che la segnalazione di bug aperta sia pronta per essere inviata; ti preghiamo di avere pazienza."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Rapporto interattivo"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Utilizza questa opzione nella maggior parte dei casi. Ti consente di monitorare l\'avanzamento della segnalazione, di inserire maggiori dettagli relativi al problema e di acquisire screenshot. Potrebbero essere omesse alcune sezioni meno utilizzate il cui inserimento nella segnalazione richiede molto tempo."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Geolocalizzazione"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accedere alla posizione di questo dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere alla posizione di questo dispositivo?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"L\'app avrà accesso alla posizione soltanto quando la usi."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Vuoi consentire sempre a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere alla posizione di questo dispositivo?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"L\'app avrà sempre accesso alla posizione, anche quando non la usi."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accedere al calendario"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere al tuo calendario?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vuoi consentire all\'app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere alla tua musica?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Foto e video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"Accesso alle tue foto e ai tuoi video"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vuoi consentire a <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> di accedere alle tue foto e ai tuoi video, incluse le località taggate?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperare contenuti della finestra"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Esaminare i contenuti di una finestra con cui interagisci."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Attivare Esplora al tocco"</string>
@@ -509,8 +518,10 @@
<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_requestScreenLockComplexity" msgid="7028982116060987169">"richiedi complessità del blocco schermo"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"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>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<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>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilizza l\'hardware per l\'autenticazione dei volti"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Consente all\'app di utilizzare hardware per l\'autenticazione dei volti"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Impossibile elaborare il volto. Riprova."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Volto troppo luminoso. Prova dove c\'è meno luce."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Volto troppo scuro. Non coprire la fonte di luce."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Allontana il sensore dal volto."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Avvicina il sensore al volto."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Sposta il sensore verso l\'alto."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Sposta il sensore verso il basso."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Sposta il sensore verso destra."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Sposta il sensore verso sinistra."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Guarda il sensore."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nessun volto rilevato."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Troppo movimento."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ripeti l\'acquisizione del volto."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"È stato rilevato un volto diverso."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Troppo simile; cambia posa."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Guarda più direttamente verso la fotocamera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Guarda più direttamente verso la fotocamera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Raddrizza la testa in verticale."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Scopri il volto."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware per il volto non disponibile."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Timeout operazione associata al volto. Riprova."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Il volto non può essere memorizzato."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Operazione associata al volto annullata."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Autenticazione del volto annullata dall\'utente."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Troppi tentativi. Riprova più tardi."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Troppi tentativi. Autenticazione disattivata."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Riprova."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nessun volto registrato."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Questo dispositivo non dispone di sensore di autenticazione."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Volto <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Apri <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> si chiuderà senza salvare"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superato il limite di memoria"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Dump dell\'heap raccolto. Tocca per condividere."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Condividere il dump dell\'heap?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Il processo <xliff:g id="PROC">%1$s</xliff:g> ha superato il suo limite di memoria pari a <xliff:g id="SIZE">%2$s</xliff:g>. È disponibile un dump dell\'heap che puoi condividere con lo sviluppatore. Presta attenzione: questo dump dell\'heap può contenere tue informazioni personali a cui l\'applicazione ha accesso."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Scegli un\'azione per il testo"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume suoneria"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume contenuti multimediali"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tocca per vedere tutte le reti"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connetti"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tutte le reti"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"È disponibile una rete Wi-Fi suggerita da <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Vuoi collegarti alle reti suggerite da <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sì"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Il Wi‑Fi verrà attivato automaticamente"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Accedi alla rete"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"La rete Wi-Fi non ha accesso a Internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tocca per le opzioni"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Connesso"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Modifiche alle tue impostazioni dell\'hotspot"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"La tua banda di hotspot è cambiata."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Questo dispositivo non supporta la tua preferenza esclusiva per 5 GHz. Utilizzerà invece la banda a 5 GHz solo quando è disponibile."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debug USB collegato"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tocca per disattivare il debug USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Seleziona per disattivare il debug USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Liquidi o detriti nella porta USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"La porta USB viene disattivata automaticamente. Tocca per avere ulteriori informazioni."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Puoi usare la porta USB in sicurezza"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tocca per sbloc. prof. di lav."</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Connesso a <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tocca per visualizzare i file"</string>
- <string name="pin_target" msgid="3052256031352291362">"Blocca"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Sgancia"</string>
<string name="app_info" msgid="6856026610594615344">"Informazioni app"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Avvio della demo…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notifica di informazioni sulla modalità Routine"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"La batteria potrebbe esaurirsi prima della ricarica abituale"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Risparmio energetico attivo per far durare di più la batteria"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Cartella"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Applicazione Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 89813a7..a42f6cc 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -143,8 +143,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"שיחות Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"כבוי"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi מועדף"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"מצב מועדף: רשת סלולרית"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi בלבד"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ללא העברה"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -232,7 +234,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"דיווח על באג"</string>
<string name="global_action_logout" msgid="935179188218826050">"סיום הפעלה"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"צילום מסך"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"שלח דיווח על באג"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"פעולה זו תאסוף מידע על מצב המכשיר הנוכחי שלך על מנת לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת דיווח הבאג ועד לשליחת ההודעה בפועל. אנא המתן בסבלנות."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"דוח אינטראקטיבי"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"השתמש באפשרות זו ברוב המקרים. היא מאפשרת לך לעקוב אחר התקדמות הדוח, להזין פרטים נוספים על הבעיה וליצור צילומי מסך. היא עשויה להשמיט כמה קטעים שנמצאים פחות בשימוש ואשר יצירת הדיווח עליהם נמשכת זמן רב."</string>
@@ -287,9 +290,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"מיקום"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"גישה אל מיקום המכשיר הזה"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה למיקום המכשיר?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"לאפליקציה תהיה גישה אל נתוני המיקום רק במהלך השימוש באפליקציה."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"תמיד לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה למיקום המכשיר?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"לאפליקציה תמיד תהיה גישה לנתוני המיקום, גם כשהאפליקציה אינה בשימוש."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"יומן"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"גישה אל היומן"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה ליומן?"</string>
@@ -322,7 +328,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"האם לתת לאפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> הרשאת גישה למוזיקה שלך?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"תמונות וסרטונים"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"גישה לתמונות ולסרטונים שלך"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"האם לאפשר ל-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> לקבל גישה לתמונות ולסרטונים שלך, כולל מיקומים מתויגים?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"אחזור תוכן של חלון"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"הפעלה של \'גילוי באמצעות מגע\'"</string>
@@ -515,8 +524,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"מאפשר לאפליקציה נהל תקשורת עם תגים, כרטיסים וקוראים מסוג \'תקשורת מטווח קצר\'."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ביטול נעילת המסך שלך"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"מאפשר לאפליקציה להשבית את נעילת המקשים וכל אמצעי אבטחה משויך המבוסס על סיסמה. לדוגמה, הטלפון משבית את נעילת המקשים בעת קבלה של שיחת טלפון נכנסת, ולאחר מכן מפעיל מחדש את נעילת המקשים עם סיום השיחה."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"בקשה לפרטי המורכבות של נעילת מסך"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"מאפשרת לאפליקציה ללמוד את רמת המורכבות של נעילת המסך (גבוהה, בינונית, נמוכה או ללא). רמה זו מציינת את הטווח האפשרי לאורך ולסוג של נעילת המסך. האפליקציה יכולה גם להציע למשתמשים שיעדכנו את נעילת המסך ברמה מסוימת, אבל המשתמשים יכולים להתעלם מההצעה ולנווט לפריט אחר כרצונם. יש לשים לב שנעילת המסך לא מאוחסנת ב-plaintext, ולכן האפליקציה לא יודעת מה הסיסמה המדויקת."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"שימוש בחומרה ביומטרית"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"מאפשרת לאפליקציה להשתמש בחומרה ביומטרית לצורך אימות"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ניהול חומרה של טביעות אצבעות"</string>
@@ -571,37 +582,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"שימוש בחומרה של זיהוי פנים לצורך אימות"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"מאפשרת לאפליקציה להשתמש בחומרה של זיהוי פנים לצורך אימות"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"לא ניתן היה לעבד את הפנים. יש לנסות שוב."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"הפנים בהירים מדי. יש לנסות באור עמום יותר."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"הפנים כהים מדי. יש להוסיף מקור אור."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"יש להרחיק את החיישן מהפנים."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"יש לקרב את החיישן לפנים."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"יש להזיז את החיישן גבוה יותר."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"יש להזיז את החיישן נמוך יותר."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"יש להזיז את החיישן ימינה."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"יש להזיז את החיישן שמאלה."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"יש להסתכל על החיישן."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"לא זוהו פנים."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"יש יותר מדי תנועה."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"יש לרשום מחדש את הפנים."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"זוהו פנים שונות."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"דומה מדי, יש לשנות תנוחה."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"יש להביט ישירות אל המצלמה."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"יש להביט ישירות אל המצלמה."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"יש ליישר את הראש במאונך."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"יש להסיר את הכיסוי מהפנים."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"החומרה לזיהוי הפנים לא זמינה."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"חלף הזמן הקצוב לזיהוי הפנים. יש לנסות שוב."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"לא ניתן לשמור את הפנים."</string>
<string name="face_error_canceled" msgid="283945501061931023">"פעולת הפנים בוטלה."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"זיהוי הפנים בוטל על ידי המשתמש."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"יותר מדי ניסיונות. אימות הפנים הושבת."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"יש לנסות שוב."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"לא נרשמו פנים."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"במכשיר זה אין חיישן לאימות פנים."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"פנים <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1253,9 +1286,16 @@
<string name="new_app_action" msgid="6694851182870774403">"פתיחת <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> האפליקציה תיסגר ללא שמירה"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> חורג מהגבלת הזיכרון"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Dump של ערימה נאסף. יש להקיש כדי לשתף."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"האם לשתף את נתוני ה-Dump של הערימה?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"התהליך <xliff:g id="PROC">%1$s</xliff:g> חרג ממגבלת זיכרון התהליך שלו, בגודל <xliff:g id="SIZE">%2$s</xliff:g>. נתונים על Dump של ערימה זמינים לך לשיתוף עם המפתח של התהליך. זהירות: ה-Dump של הערימה יכול להכיל מידע אישי הזמין לאפליקציה."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"בחירת פעולה לביצוע עם טקסט"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"עוצמת קול של צלצול"</string>
<string name="volume_music" msgid="5421651157138628171">"עוצמת קול של מדיה"</string>
@@ -1298,8 +1338,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"יש להקיש כדי לראות את כל הרשתות"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"התחבר"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"כל הרשתות"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"רשת ה-Wi‑Fi שהוצעה על ידי <xliff:g id="NAME">%s</xliff:g> לא זמינה"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"רוצה להתחבר לרשתות שהוצעו על ידי <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"כן"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"לא"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ה-Wi-Fi יופעל אוטומטית"</string>
@@ -1311,9 +1353,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"היכנס לרשת"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"לרשת ה-Wi-Fi אין גישה לאינטרנט"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"הקש לקבלת אפשרויות"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"הרשת מחוברת"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"שינויים להגדרות של הנקודה לשיתוף אינטרנט"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"התדר של הנקודה לשיתוף אינטרנט השתנה."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"מכשיר זה לא תומך בהעדפות שלך ל-5GHz בלבד. במקום זאת, מכשיר זה ישתמש בתדר 5GHz כשיהיה זמין."</string>
@@ -1398,6 +1445,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"ניפוי באגים של USB מחובר"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"יש להקיש כדי לכבות את ניפוי הבאגים ב-USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"בחר להשבית ניפוי באגים ב-USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"יש נוזלים או חלקיקים ביציאת ה-USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"יציאת ה-USB הושבתה באופן אוטומטי. יש להקיש לקבלת מידע נוסף."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"יציאת ה-USB בטוחה לשימוש"</string>
@@ -1973,8 +2024,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"הקש לביטול נעילת פרופיל העבודה"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"מחובר אל <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"הקש כדי להציג קבצים"</string>
- <string name="pin_target" msgid="3052256031352291362">"הצמד"</string>
- <string name="unpin_target" msgid="3556545602439143442">"בטל הצמדה"</string>
<string name="app_info" msgid="6856026610594615344">"פרטי אפליקציה"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"מתחיל בהדגמה…"</string>
@@ -2067,6 +2116,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"התראת מידע לגבי מצב שגרתי"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"הסוללה עלולה להתרוקן לפני המועד הרגיל של הטעינה"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"תכונת החיסכון בסוללה הופעלה כדי להאריך את חיי הסוללה"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"תיקייה"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"אפליקציית Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"קובץ"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 79e2f09..9e466cb 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi 通話"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"OFF"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi優先"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"モバイル優先"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fiのみ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:転送できません"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"バグレポート"</string>
<string name="global_action_logout" msgid="935179188218826050">"セッションを終了"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"スクリーンショット"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"バグレポートを取得"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"現在の端末の状態に関する情報が収集され、その内容がメールで送信されます。バグレポートが開始してから送信可能な状態となるまでには多少の時間がかかりますのでご了承ください。"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"対話型レポート"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"ほとんどの場合はこのオプションを使用します。レポートの進行状況を追跡し、問題についての詳細情報の確認やスクリーンショットの作成が可能です。レポート作成に時間がかかる、あまり使用されない項目は省略されることがあります。"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"位置情報"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"この端末の位置情報へのアクセス"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"この端末の位置情報へのアクセスを <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> に許可しますか?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"このアプリは、使用時のみ、位置情報にアクセスできるようになります。"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"この端末の位置情報へのアクセスを <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> に常に許可しますか?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"このアプリは、未使用時も含め、常に位置情報にアクセスできるようになります。"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"カレンダー"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"カレンダーへのアクセス"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"カレンダーへのアクセスを <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> に許可しますか?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"音楽へのアクセスを <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> に許可しますか?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"写真と動画"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"写真と動画へのアクセス"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"タグ付けされた場所を含め、写真と動画へのアクセスを <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> に許可しますか?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ウィンドウコンテンツの取得"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ユーザーがアクセスしているウィンドウのコンテンツを検査します。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"タッチガイドの有効化"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"NFCタグ、カード、リーダーとの通信をアプリに許可します。"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"画面ロックの無効化"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"キーロックとキーロックに関連付けられたパスワードのセキュリティを無効にすることをアプリに許可します。たとえば、かかってきた電話を受ける際にキーロックを無効にし、通話が終了したらキーロックを再度有効にする場合などに使用します。"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"画面ロックの複雑さのリクエスト"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"このアプリに画面ロックの複雑さレベル(高、中、低、なし)を認識することを許可します。複雑さレベルは、画面ロックの文字数の範囲やタイプを示すものです。アプリから一定レベルまで画面ロックを更新するよう推奨されることもありますが、ユーザーは無視したり別の操作を行ったりできます。画面ロックは平文で保存されないため、アプリが正確なパスワードを知ることはありません。"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"生体認証ハードウェアの使用"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"生体認証ハードウェアを認証に使用することをアプリに許可します"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"指紋ハードウェアの管理"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"使用する顔テンプレートの追加や削除を行うメソッドの呼び出しをアプリに許可します。"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"顔認証ハードウェアの使用"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"顔認証ハードウェアを認証に使用することをアプリに許可します"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"顔を認識できませんでした。もう一度お試しください。"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"顔が明るすぎます。照明を暗くしてみてください。"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"顔が暗すぎます。光源のカバーを外してください。"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"センサーを顔から遠ざけてください。"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"センサーを顔に近づけてください。"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"センサーを上に動かしてください。"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"センサーを下に動かしてください。"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"センサーを右に動かしてください。"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"センサーを左に動かしてください。"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"センサーを見てください。"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"顔を検出できません。"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"あまり動かさないでください。"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"顔を登録し直してください。"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"別の顔が検出されました。"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"似すぎています。ポーズを変えてください。"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"もっとまっすぐ顔をカメラに向けてください。"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"もっとまっすぐカメラに顔を向けてください。"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"頭を左右に傾けず、まっすぐにしてください。"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"顔を隠さないでください。"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"顔認証ハードウェアが使用できません。"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"読み取りのタイムアウトです。もう一度お試しください。"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"顔の情報を保存できません。"</string>
<string name="face_error_canceled" msgid="283945501061931023">"顔の操作をキャンセルしました。"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"顔の認証がユーザーによりキャンセルされました。"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"試行回数の上限です。後でもう一度お試しください。"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"試行回数の上限です。顔認証は無効になりました。"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"もう一度お試しください。"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"顔の情報が登録されていません。"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"このデバイスには顔認証センサーがありません。"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"顔 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> を開く"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> を保存せずに閉じます"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>はメモリの上限を超えました"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"ヒープダンプを収集しました。共有するにはタップしてください。"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ヒープダンプを共有しますか?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"プロセス<xliff:g id="PROC">%1$s</xliff:g>はプロセスメモリの上限<xliff:g id="SIZE">%2$s</xliff:g>を超えました。ヒープダンプをデベロッパーと共有できます。このヒープダンプには、アプリがアクセスできる個人情報が含まれている可能性があるのでご注意ください。"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"アプリケーションを選択"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"着信音量"</string>
<string name="volume_music" msgid="5421651157138628171">"メディアの音量"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"すべてのネットワークを表示するにはタップします"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"接続"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"すべてのネットワーク"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> でおすすめの Wi-Fi ネットワークが利用可能です"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"<xliff:g id="NAME">%s</xliff:g> でおすすめのネットワークに接続してもよろしいですか?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"はい"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"いいえ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi は自動的にオンになります"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ネットワークにログインしてください"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi‑Fi はインターネットに接続していません"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"タップしてその他のオプションを表示"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"接続しました"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"アクセス ポイントの設定の変更"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"アクセス ポイントの帯域幅が変更されました。"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"この端末は 5 GHz のみという設定に対応していません。ただし、5 GHz 周波数帯が利用できるときには利用します。"</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USBデバッグが接続されました"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"タップして USB デバッグを無効にしてください"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USBデバッグを無効にする場合に選択します。"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB ポート内の液体やゴミ"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB ポートが自動的に無効になりました。タップして詳細をご確認ください。"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB ポートを安全に使用できます"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"タップしてプロファイルをロック解除"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> に接続しました"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"タップしてファイルを表示"</string>
- <string name="pin_target" msgid="3052256031352291362">"固定"</string>
- <string name="unpin_target" msgid="3556545602439143442">"固定を解除"</string>
<string name="app_info" msgid="6856026610594615344">"アプリ情報"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"デモを開始しています…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ルーティン モード情報の通知"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"通常の充電を行う前に電池が切れる可能性があります"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"電池を長持ちさせるため、バッテリー セーバーが有効になりました"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"フォルダ"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android アプリ"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ファイル"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 4a3cb8b..c6e636d 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"WiFi დარეკვა"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"გამორთული"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"სასურველია Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"უპირატესობა მიენიჭოს მობილურს"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"მხოლოდ Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: არ არის გადამისამართებული"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ხარვეზის შესახებ ანგარიში"</string>
<string name="global_action_logout" msgid="935179188218826050">"სესიის დასრულება"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ეკრანის ანაბეჭდი"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"შექმენით შეცდომის ანგარიში"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"იგი შეაგროვებს ინფორმაციას თქვენი მოწყობილობის ამჟამინდელი მდგომარეობის შესახებ, რათა ის ელფოსტის შეტყობინების სახით გააგზავნოს. ხარვეზის ანგარიშის მომზადებასა და შეტყობინების გაგზავნას გარკვეული დრო სჭირდება. გთხოვთ, მოითმინოთ."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ინტერაქტიული ანგარიში"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"გამოიყენეთ ეს ვარიანტი შემთხვევათა უმეტესობაში. ის საშუალებას მოგცემთ, თვალი მიადევნოთ ანგარიშის პროგრესს, პრობლემის შესახებ მეტი დეტალი შეიყვანოთ და გადაიღოთ ეკრანის ანაბეჭდები. ამ ვარიანტის არჩევის შემთხვევაში, შეიძლება მოხდეს ზოგიერთი ნაკლებად გამოყენებადი სექციის გამოტოვება, რომელთა შესახებ მოხსენებასაც დიდი დრო სჭირდება."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"მდებარეობა"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"მოწყობილობის მდებარეობაზე წვდომა"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"გსურთ, მიანიჭოთ <b><xliff:g id="APP_NAME">%1$s</xliff:g>-ს</b> ამ მოწყობილობის მდებარეობაზე წვდომის ნებართვა?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ამ აპს მდებარეობაზე წვდომა მხოლოდ მაშინ ექნება, როცა თქვენ მას გამოიყენებთ."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"გსურთ, მიანიჭოთ <b><xliff:g id="APP_NAME">%1$s</xliff:g>-ს</b> ამ მოწყობილობის მდებარეობაზე წვდომის ნებართვა?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ამ აპს ყოველთვის ექნება მდებარეობაზე წვდომა, მაშინაც კი, როცა თქვენ მას არ იყენებთ."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"კალენდარი"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"თქვენს კალენდარზე წვდომა"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"გსურთ, მიანიჭოთ <b><xliff:g id="APP_NAME">%1$s</xliff:g>-ს</b> თქვენს კალენდარზე წვდომის ნებართვა?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"გსურთ, მიანიჭოთ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-ს თქვენს მუსიკაზე წვდომა?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ფოტოები და ვიდეოები"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"თქვენს ფოტოებსა და ვიდეოებზე წვდომა"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"გსურთ, მიანიჭოთ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-ს წვდომა თქვენს ფოტოებსა და ვიდეოებზე, მათ შორის, თეგებით მონიშნულ მდებარეობებზე?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ფანჯრის კონტენტის მოძიება"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"იმ ფანჯრის კონტენტის შემოწმება, რომელშიც მუშაობთ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"„შეხებით აღმოჩენის“ ჩართვა"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"აპს შეეძლება ახლო მოქმედების რადიოკავშირის (NFC) მეშვეობით ტეგების, ბარათებისა და წამკითხველების შემცველი მონაცემების მიმოცვლა."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"თქვენი ეკრანის ბლოკის გათიშვა"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"შეეძლება კლავიატურის დაბლოკვისა და პაროლით უზრუნველყოფილი ნებისმიერი უსაფრთხოების ფუნქციის დეაქტივაცია. მაგალითად, ტელეფონი შემომავალი ზარის დროს აუქმებს კლავიატურის დაბლოკვას და კვლავ ააქტიურებს მას, როგორც კი ზარი დასრულდება."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ეკრანის დაბლოკვის მეთოდის სირთულის შესახებ ინფორმაციის მოთხოვნა"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"საშუალებას აძლევს აპს, შეიტყოს ეკრანის დაბლოკვის მეთოდის სირთულე (მაღალი, საშუალო, დაბალი ან არანაირი), რისი მეშვეობითაც შესაძლებელია ეკრანის დაბლოკვის მეთოდის სიგრძის შესაძლო დიაპაზონისა და ტიპის განსაზღვრა. გარდა ამისა, აპს შეუძლია მომხმარებლებისთვის ეკრანის დაბლოკვის მეთოდის გარკვეულ დონემდე გაძლიერების შეთავაზება, თუმცა მომხმარებლებს შეეძლებათ აღნიშნული შეტყობინების უგულებელყოფა და სხვა ეკრანზე გადასვლა. გაითვალისწინეთ, რომ ეკრანის დაბლოკვის მეთოდი არ ინახება ჩვეულებრივი ტექსტის სახით, ამიტომ აპს არ ეცოდინება ზუსტი პაროლი."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ბიომეტრიული აპარატის გამოყენება"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"საშუალებას აძლევს აპს, ავტორიზაციისთვის გამოიყენოს ბიომეტრიული აპარატი"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"თითის ანაბეჭდის აპარატის მართვა"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"საშუალებას აძლევს აპს, დაამატოს და წაშალოს სახეების შაბლონები."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"სახის ამოცნობის აპარატურის გამოყენება"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"საშუალებას აძლევს აპს, ავტორიზაციისთვის გამოიყენოს სახის ამოცნობის აპარატურა"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"სახე ვერ მუშავდება. გთხოვთ, ცადოთ ხელახლა."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"სახე გადანათებულია. დაუკელით განათებას."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"სახე ჩაბნელებულია. მოუმატეთ განათებას."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"დააშორეთ მოწყობილობის სენსორი სახეს."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"მიუახლოვეთ მოწყობილობის სენსორი სახეს."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"ასწიეთ მოწყობილობის სენსორი ოდნავ ზემოთ."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"ჩასწიეთ მოწყობილობის სენსორი ოდნავ ქვემოთ."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"გასწიეთ მოწყობილობის სენსორი ოდნავ მარჯვნივ."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"გასწიეთ მოწყობილობის სენსორი ოდნავ მარცხნივ."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"შეხედეთ სენსორს."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"სახის ამოცნობა ვერ მოხერხდა."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"დაფიქსირდა მეტისმეტად ბევრი მოძრაობა."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"ამოცნობილია განსხვავებული სახე."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"მეტისმეტად მსგავსია. გთხოვთ, შეცვალოთ პოზა."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"გთხოვთ, უფრო პირდაპირ შეხედოთ კამერას."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"გთხოვთ, უფრო პირდაპირ შეხედოთ კამერას."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"გთხოვთ, ვერტიკალურად გაასწოროთ თავი."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"გთხოვთ, გამოაჩინოს სახე."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"სახის ამოცნობის აპარატურა მიუწვდომელია."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"სახის ამოცნობის დრო ამოიწურა. ცადეთ ხელახლა."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"სახის შენახვა ვერ მოხერხდა."</string>
<string name="face_error_canceled" msgid="283945501061931023">"სახის ამოცნობა გაუქმდა."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"სახის ავტორიზაცია გაუქმდა მომხმარებლის მიერ."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"დაფიქსირდა ბევრი მცდელობა. ცადეთ მოგვიანებით."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"დაფიქსირდა ბევრი მცდელობა. სახის ამოცნობა გაითიშა."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"ცადეთ ხელახლა."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"სახე რეგისტრირებული არ არის."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"ამ მოწყობილობას არ აქვს სახის ამოცნობის სენსორი."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"სახე <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"გახსენით <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> დაიხურება მონაცემთა შენახვის გარეშე"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>-მა გადააჭარბა მეხსიერების ლიმიტს"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"გროვის ამონაწერი მომზადდა, შეეხეთ გასაზიარებლად."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"გავაზიაროთ გროვის ამონაწერი?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"პროცესმა <xliff:g id="PROC">%1$s</xliff:g> გადააჭარბა საპროცესო მეხსიერების <xliff:g id="SIZE">%2$s</xliff:g>-იან ლიმიტს. გროვის ამონაწერი ხელმისაწვდომია მის დეველოპერთან გასაზიარებლად. ფრთხილად: გროვის ამონაწერი შეიძლება შეიცავდეს ნებისმიერ თქვენს პირად ინფორმაციას, რომელზეც ამ აპლიკაციას წვდომა აქვს."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"შეარჩიეთ ქმედება ტექსტისთვის."</string>
<string name="volume_ringtone" msgid="6885421406845734650">"მრეკავის ხმა"</string>
<string name="volume_music" msgid="5421651157138628171">"მედიის ხმა"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"შეეხეთ ყველა ქსელის სანახავად"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"დაკავშირება"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ყველა ქსელი"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"ხელმისაწვდომია <xliff:g id="NAME">%s</xliff:g>-ის მიერ შემოთავაზებული Wi‑Fi ქსელი"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"გსურთ <xliff:g id="NAME">%s</xliff:g>-ის მიერ შემოთავაზებულ ქსელებთან დაკავშირება?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"დიახ"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"არა"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi ავტომატურად ჩაირთვება"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ქსელში შესვლა"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi‑Fi ქსელს ინტერნეტზე წვდომა არ აქვს"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"შეეხეთ ვარიანტების სანახავად"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"დაკავშირებულია"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"თქვენი უსადენო ქსელის პარამეტრების ცვლილება"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"თქვენი უსადენო ქსელის დიაპაზონი შეიცვალა."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ამ მოწყობილობას არ შეუძლია მხოლოდ 5 გჰც სიხშირეზე მუშაობა. აღნიშნული სიხშირის გამოყენება მოხდება მაშინ, როცა ეს შესაძლებელია."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB გამართვა შეერთებულია"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"შეეხეთ, რათა გამორთოთ USB შეცდომების გამართვა"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"მონიშნეთ რათა შეწყვიტოთ USB-ის გამართვა"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB პორტში აღმოჩენილია სითხე ან ჭუჭყი"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB პორტი ავტომატურად გათიშულია. შეეხეთ დამატებითი ინფორმაციისთვის."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB პორტის გამოყენება ახლა უსაფრთხოა"</string>
@@ -1396,8 +1447,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"დაყენება"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"გამოღება"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"დათვალიერება"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"გამომავალი სიგნალის გადართვა"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> აკლია"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"ისევ მიუერთეთ მოწყობილობა"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"მიმდინარეობს <xliff:g id="NAME">%s</xliff:g>-ის გადატანა"</string>
@@ -1906,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"შეეხეთ პროფილის განსაბლოკად"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"დაკავშირებულია <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>-თან"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"შეეხეთ ფაილების სანახავად"</string>
- <string name="pin_target" msgid="3052256031352291362">"ჩამაგრება"</string>
- <string name="unpin_target" msgid="3556545602439143442">"ჩამაგრების მოხსნა"</string>
<string name="app_info" msgid="6856026610594615344">"აპის შესახებ"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"მიმდინარეობს დემონსტრაციის დაწყება…"</string>
@@ -1998,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"რუტინის რეჟიმის საინფორმაციო შეტყობინება"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ბატარეა შეიძლება დაჯდეს დატენის ჩვეულ დრომდე"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ბატარეის დამზოგი გააქტიურდა ბატარეის მუშაობის გასახანგრძლივლებლად"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"საქაღალდე"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android-ის აპლიკაცია"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ფაილი"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index cb38ea1..494f26a 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"ការហៅតាម Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"បិទ"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ជាអាទិភាព"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ទិន្នន័យទូរសព្ទចល័តជាអាទិភាព"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi តែប៉ុណ្ណោះ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> ៖ មិនបានបញ្ជូនបន្ត"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"របាយការណ៍កំហុស"</string>
<string name="global_action_logout" msgid="935179188218826050">"បញ្ចប់សម័យ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"រូបថតអេក្រង់"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"យករបាយការណ៍កំហុស"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"វានឹងប្រមូលព័ត៌មានអំពីស្ថានភាពឧបករណ៍របស់អ្នក ដើម្បីផ្ញើជាសារអ៊ីមែល។ វានឹងចំណាយពេលតិចពីពេលចាប់ផ្ដើមរបាយការណ៍រហូតដល់ពេលវារួចរាល់ដើម្បីផ្ញើ សូមអត់ធ្មត់។"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"របាយការណ៍អន្តរកម្ម"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"ប្រើក្នុងកាលៈទេសៈភាគច្រើន។ វាអនុញ្ញាតឲ្យអ្នកតាមដានដំណើរការនៃរបាយការណ៍ និងបញ្ចូលព័ត៌មានលម្អិតបន្ថែមអំពីបញ្ហា និងថតរូបអេក្រង់។ វាអាចនឹងរំលងផ្នែកមួយចំនួនដែលមិនសូវប្រើ ដែលធ្វើឲ្យចំណាយពេលយូរក្នុងការរាយការណ៍។"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ទីតាំង"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ចូលដំណើរការទីតាំងរបស់ឧបករណ៍នេះ"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើទីតាំងរបស់ឧបករណ៍នេះ?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"កម្មវិធីនេះនឹងមានសិទ្ធិចូលប្រើទីតាំង នៅពេលអ្នកប្រើកម្មវិធីនេះតែប៉ុណ្ណោះ។"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើទីតាំងរបស់ឧបករណ៍នេះជានិច្ចមែនទេ?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"កម្មវិធីនេះនឹងមានសិទ្ធិចូលប្រើទីតាំងជានិច្ច ទោះបីជានៅពេលអ្នកមិនប្រើកម្មវិធីនេះក៏ដោយ។"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ប្រតិទិន"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ចូលប្រើប្រិតិទិនរបស់អ្នក"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើប្រតិទិនរបស់អ្នក?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើតន្រ្តីរបស់អ្នក?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"រូបថត និងវីដេអូ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ចូលប្រើរូបថត និងវីដេអូរបស់អ្នក"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"អនុញ្ញាតឱ្យ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ចូលប្រើរូបថត និងវីដេអូរបស់អ្នក រួមទាំងទីតាំងដែលបានដាក់ស្លាក?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ទាញយកខ្លឹមសារវិនដូ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ពិនិត្យខ្លឹមសារវិនដូដែលអ្នកកំពុងទាក់ទងជាមួយ។"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"បើកការរកមើលដោយប៉ះ"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ឲ្យកម្មវិធីទាក់ទងជាមួយស្លាក (NFC) កាត និងកម្មវិធីអាន។"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"បិទការចាក់សោអេក្រង់របស់អ្នក"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ឲ្យកម្មវិធីបិទការចាក់សោសុវត្ថិភាពពាក្យសម្ងាត់ដែលបានភ្ជាប់ណាមួយ។ ឧទាហរណ៍ត្រឹមត្រូវនៃការបិទទូរស័ព្ទពេលទទួលការហៅចូល បន្ទាប់មបើកសោពេលការហៅបានបញ្ចប់។"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ស្នើសុំកម្រិតស្មុគស្មាញនៃការចាក់សោអេក្រង់"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"អនុញ្ញាតឱ្យកម្មវិធីរៀនអំពីកម្រិតស្មុគស្មាញនៃការចាក់សោអេក្រង់ (ខ្ពស់ មធ្យម ទាប ឬគ្មាន) ដែលបញ្ជាក់អំពីចន្លោះប្រវែងដែលអាចមាន និងប្រភេទនៃការចាក់សោអេក្រង់។ កម្មវិធីនេះក៏អាចណែនាំឱ្យអ្នកប្រើប្រាស់ធ្វើបច្ចុប្បន្នភាពការចាក់សោអេក្រង់ទៅកម្រិតជាក់លាក់ផងដែរ ប៉ុន្តែអ្នកប្រើប្រាស់អាចមិនអើពើនឹងការណែនាំនេះដោយសេរី។ សូមចំណាំថា ការចាក់សោអេក្រង់មិនត្រូវបានរក្សាទុកជាអត្ថបទធម្មតាទេ ដូច្នេះកម្មវិធីនេះមិនស្គាល់ពាក្យសម្ងាត់ពិតប្រាកដឡើយ។"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ប្រើឧបករណ៍ស្កេនស្នាមម្រាមដៃ"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"អនុញ្ញាតឱ្យកម្មវិធីប្រើឧបករណ៍ស្កេនស្នាមម្រាមដៃសម្រាប់ការផ្ទៀងផ្ទាត់"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"គ្រប់គ្រងផ្នែករឹងស្នាមម្រាមដៃ"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"អនុញ្ញាតឱ្យកម្មវិធីប្រើវិធីសាស្ត្រដើម្បីបញ្ចូល និងលុបទម្រង់គំរូផ្ទៃមុខសម្រាប់ប្រើប្រាស់។"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ប្រើផ្នែករឹងផ្ទៀងផ្ទាត់ផ្ទៃមុខ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"អនុញ្ញាតឱ្យកម្មវិធីប្រើផ្នែករឹងផ្ទៀងផ្ទាត់ផ្ទៃមុខសម្រាប់ការផ្ទៀងផ្ទាត់"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"មិនអាចដំណើរការផ្ទៃមុខបានទេ។ សូមព្យាយាមម្តងទៀត។"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"ផ្ទៃមុខចាំងពេក។ សូមសាកល្បងនៅកន្លែងដែលមានពន្លឺទាបជាងនេះ។"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"ផ្ទៃមុខងងឹតពេក។ សូមរកកន្លែងដែលមានប្រភពពន្លឺ។"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"សូមផ្លាស់ទីឧបករណ៍ចាប់សញ្ញាឱ្យឆ្ងាយពីមុខ។"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"សូមដាក់ឧបករណ៍ចាប់សញ្ញាឱ្យនៅជិតមុខជាងនេះ។"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"សូមផ្លាស់ទីឧបករណ៍ចាប់សញ្ញាឱ្យខ្ពស់ជាងនេះ។"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"សូមផ្លាស់ទីឧបករណ៍ចាប់សញ្ញាឱ្យទាបជាងនេះ។"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"សូមផ្លាស់ទីឧបករណ៍ចាប់សញ្ញាទៅស្ដាំ។"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"សូមផ្លាស់ទីឧបករណ៍ចាប់សញ្ញាទៅឆ្វេង។"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"សូមមើលទៅឧបករណ៍ចាប់សញ្ញា។"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"រកមិនឃើញមុខទេ។"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"មានចលនាខ្លាំងពេក។"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"សូមស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត។"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"បានរកឃើញមុខផ្សេង។"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"ស្រដៀងគ្នាពេក សូមផ្លាស់ប្ដូរកាយវិការរបស់អ្នក។"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"សូមមើលឱ្យចំកាមេរ៉ាជាងមុន។"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"សូមមើលឱ្យចំកាមេរ៉ាជាងមុន។"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"សូមងើយក្បាលរបស់អ្នកឱ្យត្រង់។"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"សូមកុំបាំងមុខរបស់អ្នក។"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"មិនអាចប្រើផ្នែករឹងចាប់ផ្ទៃមុខបានទេ។"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"ការសម្គាល់ផ្ទៃមុខបានអស់ម៉ោង។ សូមព្យាយាមម្ដងទៀត។"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"មិនអាចរក្សាទុកផ្ទៃមុខបានទេ។"</string>
<string name="face_error_canceled" msgid="283945501061931023">"បានបោះបង់ប្រតិបត្តិការចាប់ផ្ទៃមុខ។"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"ការផ្ទៀងផ្ទាត់មុខត្រូវបានបោះបង់ដោយអ្នកប្រើប្រាស់។"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"ព្យាយាមចូលច្រើនពេកហើយ។ បានបិទការផ្ទៀងផ្ទាត់ផ្ទៃមុខ។"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"សូមព្យាយាមម្ដងទៀត។"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"មិនអាចថតបញ្ចូលផ្ទៃមុខបានទេ។"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"ឧបករណ៍នេះមិនមានឧបករណ៍ផ្ទៀងផ្ទាត់មុខទេ។"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"ផ្ទៃមុខទី <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1215,9 +1248,16 @@
<string name="new_app_action" msgid="6694851182870774403">"បើក <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> នឹងបិទដោយមិនរក្សាទុក"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> លើសពីកម្រិតកំណត់មេម៉ូរី"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"ព័ត៌មានកែបញ្ហាត្រូវបានប្រមូល។ សូមចុចដើម្បីចែករំលែក។"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ចែករំលែក heap dump?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"ដំណើរការ <xliff:g id="PROC">%1$s</xliff:g> បានលើសកម្រិតកំណត់មេម៉ូរីរបស់វាដែលមានទំហំ <xliff:g id="SIZE">%2$s</xliff:g>។ Heap dump មានផ្តល់ជូនដល់អ្នកដើម្បីចែករំលែកជាមួយអ្នកអភិវឌ្ឍន៍របស់វា។ ត្រូវប្រុងប្រយ័ត្ន៖ Heap dump នេះអាចផ្ទុកព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នកណាមួយ ដែលកម្មវិធីអាចចូលប្រើបាន។"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"ជ្រើសសកម្មភាពសម្រាប់អត្ថបទ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"កម្រិតសំឡេងរោទ៍"</string>
<string name="volume_music" msgid="5421651157138628171">"កម្រិតសំឡេងមេឌៀ"</string>
@@ -1256,8 +1296,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ចុចដើម្បីមើលបណ្តាញទាំងអស់"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ភ្ជាប់"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"បណ្ដាញទាំងអស់"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"អាចប្រើបណ្ដាញ Wi‑Fi ដែលណែនាំដោយ <xliff:g id="NAME">%s</xliff:g> បាន"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"តើអ្នកចង់ភ្ជាប់ទៅកាន់បណ្ដាញដែលណែនាំដោយ <xliff:g id="NAME">%s</xliff:g> ដែរទេ?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"បាទ/ចាស"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ទេ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi នឹងបើកដោយស្វ័យប្រវត្តិ"</string>
@@ -1269,9 +1311,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ចូលទៅបណ្តាញ"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi មិនមានការតភ្ជាប់អ៊ីនធឺណិតទេ"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ប៉ះសម្រាប់ជម្រើស"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"បានភ្ជាប់"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"ប្ដូរទៅការកំណត់ហតស្ប៉តរបស់អ្នក"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"រលកសញ្ញាហតស្ប៉តរបស់អ្នកបានផ្លាស់ប្ដូរ។"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ឧបករណ៍នេះមិនអាចប្រើចំណូលចិត្តរបស់អ្នកសម្រាប់តែ 5GHz ទេ។ ផ្ទុយមកវិញ ឧបករណ៍នេះនឹងប្រើរលកសញ្ញា 5GHz នៅពេលដែលអាចប្រើបាន។"</string>
@@ -1356,6 +1403,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"បានភ្ជាប់ការកែកំហុសតាម USB"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"ចុចដើម្បីបិទការកែកំហុសតាម USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ជ្រើសរើស ដើម្បីបិទការកែកំហុសតាម USB ។"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"មានទឹក ឬកម្ទេចផ្សេងៗនៅក្នុងរន្ធ USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"រន្ធ USB ត្រូវបានបិទដោយស្វ័យប្រវត្តិ។ សូមចុចដើម្បីស្វែងយល់បន្ថែម។"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"អាចប្រើរន្ធ USB បានដោយសុវត្ថិភាព"</string>
@@ -1907,8 +1958,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"ប៉ះដើម្បីដោះសោប្រវត្តិរូបការងារ"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"បានភ្ជាប់ទៅ <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ប៉ះដើម្បីមើលឯកសារ"</string>
- <string name="pin_target" msgid="3052256031352291362">"ខ្ទាស់"</string>
- <string name="unpin_target" msgid="3556545602439143442">"មិនខ្ទាស់"</string>
<string name="app_info" msgid="6856026610594615344">"ព័ត៌មានកម្មវិធី"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"កំពុងចាប់ផ្តើមការបង្ហាញសាកល្បង…"</string>
@@ -1999,6 +2048,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ការជូនដំណឹងព័ត៌មានរបស់មុខងារទម្លាប់"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ថ្មអាចនឹងអស់ មុនពេលសាកថ្មធម្មតា"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"បានបើកដំណើរការកម្មវិធីសន្សំថ្ម ដើម្បីបង្កើនកម្រិតថាមពលថ្ម"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ថត"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"កម្មវិធី Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ឯកសារ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 69963ef05..1409e33 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi 통화"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"꺼짐"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi를 기본으로 설정"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"모바일에 최적화됨"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi에서만"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: 착신전환 안됨"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"버그 신고"</string>
<string name="global_action_logout" msgid="935179188218826050">"세션 끝내기"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"스크린샷"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"버그 신고"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"현재 기기 상태에 대한 정보를 수집하여 이메일 메시지로 전송합니다. 버그 신고를 시작하여 전송할 준비가 되려면 약간 시간이 걸립니다."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"대화형 보고서"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"대부분의 경우 이 옵션을 사용합니다. 신고 진행 상황을 추적하고 문제에 대한 세부정보를 입력하고 스크린샷을 찍을 수 있습니다. 신고하기에 시간이 너무 오래 걸리고 사용 빈도가 낮은 일부 섹션을 생략할 수 있습니다."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"위치"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"이 기기의 위치정보에 액세스"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>에서 내 기기 위치에 액세스하도록 허용하시겠습니까?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"앱을 사용할 때만 앱에서 위치에 액세스합니다."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>에서 내 기기 위치에 액세스하도록 허용하시겠습니까?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"앱을 사용하지 않을 때에도 앱에서 항상 위치에 액세스합니다."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"캘린더"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"캘린더에 액세스"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>에서 내 캘린더에 액세스하도록 허용하시겠습니까?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>에서 내 음악에 액세스하도록 허용하시겠습니까?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"사진 및 동영상"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"사진 및 동영상에 액세스"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>에서 태그가 지정된 위치를 포함한 내 사진과 동영상에 액세스하도록 허용하시겠습니까?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"창 콘텐츠 가져오기"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"터치하여 탐색 사용"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"앱이 NFC(근거리 무선 통신) 태그, 카드 및 리더와 통신할 수 있도록 허용합니다."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"화면 잠금 사용 중지"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"앱이 키 잠금 및 관련 비밀번호 보안을 사용중지할 수 있도록 허용합니다. 예를 들어, 휴대전화가 수신전화를 받을 때 키 잠금을 사용중지했다가 통화가 끝나면 키 잠금을 다시 사용할 수 있습니다."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"화면 잠금 복잡도 요청"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"앱이 화면 잠금 길이와 유형의 가능한 범위를 나타내는 잠금 화면 복잡도 수준(높음, 보통, 낮음 또는 없음)을 파악하도록 허용합니다. 앱이 사용자에게 화면 잠금을 특정 수준으로 업데이트할 것을 제안할 수도 있지만, 사용자는 자유롭게 이를 무시하고 다른 곳으로 이동할 수 있습니다. 화면 잠금은 일반 텍스트로 저장되지 않으므로 앱에서 정확한 비밀번호를 알 수 없습니다."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"생체 인식 하드웨어 사용"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"앱에서 생체 인식 하드웨어를 인증에 사용하도록 허용합니다."</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"지문 하드웨어 관리"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"사용할 얼굴 템플릿의 추가 및 삭제 메서드를 앱에서 호출하도록 허용합니다."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"얼굴 인증 하드웨어 사용"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"앱에서 얼굴 인증 하드웨어를 인증에 사용하도록 허용합니다."</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"얼굴을 인식할 수 없습니다. 다시 시도해 주세요."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"얼굴이 너무 밝습니다. 조명을 더 어둡게 해 보세요."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"얼굴이 너무 어둡습니다. 조명을 더 밝게 해 보세요."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"센서를 얼굴에서 더 멀리 떨어뜨려 주세요."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"센서를 얼굴에 더 가까이 대 주세요."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"센서를 위쪽으로 옮겨 주세요."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"센서를 아래쪽으로 옮겨 주세요."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"센서를 오른쪽으로 옮겨 주세요."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"센서를 왼쪽으로 옮겨 주세요."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"센서를 바라보세요."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"얼굴을 감지할 수 없습니다."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"너무 많이 움직였습니다."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"얼굴을 다시 등록해 주세요."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"다른 얼굴이 감지되었습니다."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"너무 비슷합니다. 다른 포즈를 취해 보세요."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"카메라를 더 똑바로 바라보세요."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"카메라를 더 똑바로 바라보세요."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"고개를 똑바로 세워 주세요."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"얼굴이 보이게 해 주세요."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"얼굴 인식 하드웨어를 사용할 수 없습니다."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"얼굴 인식 시간이 초과되었습니다. 다시 시도하세요."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"얼굴을 저장할 수 없습니다."</string>
<string name="face_error_canceled" msgid="283945501061931023">"얼굴 인식 작업이 취소되었습니다."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"사용자가 얼굴 인증을 취소했습니다."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"시도 횟수가 너무 많아 얼굴 인증이 사용 중지되었습니다."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"다시 시도해 보세요."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"등록된 얼굴이 없습니다."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"이 기기에는 얼굴 인증 센서가 없습니다."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"얼굴 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> 열기"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g>이(가) 저장되지 않고 종료됩니다."</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>에서 메모리 제한을 초과했습니다."</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"힙 덤프가 수집되었습니다. 공유하려면 탭하세요."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"힙 덤프를 공유할까요?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"프로세스 <xliff:g id="PROC">%1$s</xliff:g>에서 프로세스 메모리 한도(<xliff:g id="SIZE">%2$s</xliff:g>)를 초과했습니다. 힙 덤프를 개발자와 공유할 수 있습니다. 주의: 애플리케이션이 액세스할 수 있는 개인 정보가 이 힙 덤프에 포함되어 있을 수 있습니다."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"텍스트에 대한 작업 선택"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"벨소리 볼륨"</string>
<string name="volume_music" msgid="5421651157138628171">"미디어 볼륨"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"모든 네트워크를 보려면 탭하세요."</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"연결"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"모든 네트워크"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g>에서 제안한 Wi‑Fi 네트워크를 사용할 수 있습니다"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"<xliff:g id="NAME">%s</xliff:g>이(가) 제안한 네트워크에 연결하시겠습니까?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"예"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"아니요"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi가 자동으로 사용 설정됨"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"네트워크에 로그인"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi가 인터넷에 연결되어 있지 않습니다"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"탭하여 옵션 보기"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"연결되었습니다."</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"핫스팟 설정 변경"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"핫스팟 대역이 변경되었습니다."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"이 기기에서는 5GHz 전용 환경설정이 지원되지 않습니다. 대신 가능할 때만 기기에서 5GHz 대역이 사용됩니다."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB 디버깅 연결됨"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB 디버깅을 사용 중지하려면 탭하세요."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB 디버깅을 사용하지 않으려면 선택합니다."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB 포트에서 액체 또는 이물질 감지됨"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB 포트가 자동으로 사용 중지되었습니다. 자세한 내용을 보려면 탭하세요."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB 포트를 사용해도 좋음"</string>
@@ -1396,8 +1447,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"설정"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"마운트 해제"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"둘러보기"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"출력 전환"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> 없음"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"기기를 다시 삽입하세요."</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> 이동 중"</string>
@@ -1906,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"탭하여 직장 프로필 잠금 해제"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g>에 연결됨"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"파일을 확인하려면 탭하세요."</string>
- <string name="pin_target" msgid="3052256031352291362">"고정"</string>
- <string name="unpin_target" msgid="3556545602439143442">"고정 해제"</string>
<string name="app_info" msgid="6856026610594615344">"앱 정보"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"데모 시작 중..."</string>
@@ -1998,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"루틴 모드 정보 알림"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"평소에 충전하는 시간 전에 배터리가 소진될 수 있습니다."</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"배터리 수명을 연장하기 위해 배터리 세이버가 활성화되었습니다."</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"폴더"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android 애플리케이션"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"파일"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 95e85c6..b66ec15 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi аркылуу чалынууда"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Өчүк"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi тандалган"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Тандалган мобилдик түзмөк"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi гана"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Багытталган эмес"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Ката тууралуу билдирүү"</string>
<string name="global_action_logout" msgid="935179188218826050">"Сеансты бүтүрүү"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Ката тууралуу билдирүү түзүү"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Ушуну менен түзмөгүңүздүн учурдагы абалы тууралуу маалымат топтолуп, электрондук почта аркылуу жөнөтүлөт. Отчет даяр болгуча бир аз күтө туруңуз."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактивдүү кабар"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Ката жөнүндө кабардын абалын жана көйгөй тууралуу кошумча маалыматты көрсөтүү үчүн ушул функцияны колдонууну сунуштайбыз. Ката жөнүндө кабар жөнөтүлүп жатканда көп убакыт талап кылынбашы үчүн негизги бөлүмдөр гана көрүнөт."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Жайгашкан жер"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"түзмөктүн жайгашкан жерин аныктоого"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосу бул түзмөктүн кайда жүргөнүн көрүп турганга уруксат бересизби?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Сиз бул колдонмону пайдаланып жатканда гана ал жайгашкан жериңизди көрө алат."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна бул түзмөктүн жайгашкан жерин пайдаланууга дайыма уруксат берилсинби?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Сиз бул колдонмону пайдаланбай турганда да ал жайгашкан жериңизди көрүп турат."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Жылнаама"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"жылнаамаңызды пайдалануу"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна жылнаамаңызды пайдаланууга уруксат берилсинби?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна музыканы пайдаланууга уруксат берилсинби?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Сүрөттөр жана видеолор"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"сүрөттөр менен видеолорго кирүү мүмкүнчүлүгү"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> колдонмосуна сүрөттөрүңүздү, видеолоруңузду, анын ичинде тегделген жайгашкан жерлериңизди көрүүгө уруксат бересизби?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезедеги мазмунду алып турат"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Учурда ачылып турган терезедеги маалыматты талдайт."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Сыйпалап изилдөө\" мүмкүнчүлүгүн иштетет"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Колдонмого Жакынкы аралыкта байланышуу (NFC) белгилери, карталары жана окугучтары менен байланышуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"экранды бөгөттөөнү өчүрүү"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Колдонмого экрандын бөгөттөөчү жана ага байланыштуу сырсөз коргоосун өчүрүү уруксатын берет. Мисалы, чалуу келгенде экрандын бөгөтүн алып салат, чалуу бүткөндө кайрадан орнотот."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"экранды бөгөттөөнүн татаалдык деңгээлин суроо"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Колдонмого экранды бөгөттөөнүн татаалдыгын (татаал, орточо, оңой же такыр жок) үйрөнүүгө мүмкүнчүлүк берет. Татаалдык деңгээли сырсөздүн узундугу жана экранды бөгөттөөнүн түрү боюнча айырмаланат. Колдонмо экранды бөгөттөөнү белгилүү деңгээлге тууралоону колдонуучуларга сунуштай да алат, бирок колдонуучулар ага көңүл бурбай койсо болот. Сырсөздү колдонмо билбеши үчүн, экранды бөгөттөө сырсөзүн кадимки текстте сактоого болбойт."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"биометрикалык аппаратты колдонуу"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Колдонмого аныктыгын текшерүү үчүн биометрикалык аппаратты пайдалануу мүмкүндүгүн берет"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"манжа изинин аппараттык камсыздоосун башкаруу"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Колдонмого пайдалануу үчүн жүздүн үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"жүздүн аныктыгын текшерүүчү аппараттык камсыздоону колдонуу"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Колдонмого аныктыгын текшерүү үчүн жүздүн аныктыгын текшерүүчү аппараттык камсыздоону пайдалануу мүмкүндүгүн берет"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Жүзүңүз таанылбай койду. Кайра аракет кылыңыз."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Өтө жарык болуп жатат. Жаракты азайтып көрүңүз."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Өтө караңгы болуп жатат. Жарыкты ачып коюңуз."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Сенсорду бетиңизден алысыраак жылдырыңыз."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Сенсорду бетиңизге жакыныраак жылдырыңыз."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Сенсорду жогору жакка жылдырыңыз."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Сенсорду төмөн жакка жылдырыңыз."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Сенсорду оң жакка жылдырыңыз."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Сенсорду сол жакка жылдырыңыз."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Сенсорду караңыз."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Жүзүңүз табылган жок."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Кыймылдап жибердиңиз."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Жүзүңүздү кайра таанытыңыз."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Башка жүз аныкталды."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Мурункуга окшош болуп калды, башкача туруңуз."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Камерага түз караңыз."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Камерага түз караңыз."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Башыңызды түз кармаңыз."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Жүзүңүздү ачыңыз."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Жүздү аныктоочу аппараттык камсыздоо жеткиликсиз."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Жүздүн аныктыгын текшерүүнү күтүү мөөнөтү бүттү. Кайра аракет кылыңыз."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Жүздү сактоо мүмкүн эмес."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Жүздүн аныктыгын текшерүү жокко чыгарылды."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Жүздүн аныктыгын текшерүү колдонуучу аркылуу жокко чыгарылды."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Өтө көп жолу аракет жасадыңыз. Кийинчерээк кайра аракет кылыңыз."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Өтө көп жолу аракет жасадыңыз. Жүздүн аныктыгын текшерүү сенсору өчүрүлдү."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Кайра аракет кылыңыз."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Бир да жүз катталган жок."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Бул түзмөктө жүздүн аныктыгын текшерүү сенсору жок."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Жүз <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> колдонмосун ачуу"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> сакталбастан жабылат"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> эстутум чегинен ашып кетти"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Үймө дамп топтолду. Бөлүшүү үчүн таптап коюңуз."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Үймө дамп бөлүшүлсүнбү?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> процесси өзүнүн <xliff:g id="SIZE">%2$s</xliff:g> процесс чегинен ашып кетти. Үймө дамп сиз үчүн иштеп чыгуучу менен бөлүшүүгө даяр. Абайлаңыз: бул үймө дампта колдонмонун уруксаты бар жеке маалыматыңыз камтылышы мүмкүн."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Текст үчүн аракет тандаңыз"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Коңгуроонун үн көлөмү"</string>
<string name="volume_music" msgid="5421651157138628171">"Мультимедианын үнү"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бардык тармактарды көрүү үчүн басыңыз"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Туташуу"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Бардык тармактар"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> сунуштаган Wi‑Fi тармагы жеткиликтүү"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"<xliff:g id="NAME">%s</xliff:g> сунуштаган тармактарга туташкыңыз келеби?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ооба"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Жок"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматтык түрдө күйөт"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Тармакка кирүү"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi тармагы Интернетке туташпай турат"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Параметрлерди ачуу үчүн таптап коюңуз"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Туташты"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Туташуу түйүнүңүздүн жөндөөлөрүнө өзгөртүүлөр киргизилди"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Туташуу түйүнүңүздүн жыштыгы өзгөрдү."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Бул түзмөк 5ГГцти гана колдонуу жөндөөсүн колдоого албайт. Анын ордуна, бул түзмөк 5ГГц жыштыгын ал жеткиликтүү болгондо колдонот."</string>
@@ -1356,6 +1403,10 @@
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB аркылуу мүчүлүштүктөрдү оңдоону өчүрүү үчүн таптаңыз"</string>
<!-- no translation found for adb_active_notification_message (8470296818270110396) -->
<skip />
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB портунда суюктук же урандылар бар"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB порт автоматтык түрдө өчүрүлдү. Кененирээк маалымат алуу үчүн таптап коюңуз."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB портун колдонууга болот"</string>
@@ -1907,8 +1958,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Таптап жумуш профилин ачыңыз"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> менен туташты"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Файлдарды көрүү үчүн таптап коюңуз"</string>
- <string name="pin_target" msgid="3052256031352291362">"Кадоо"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Кадоодон алып коюу"</string>
<string name="app_info" msgid="6856026610594615344">"Колдонмо тууралуу"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Демо режим башталууда…"</string>
@@ -1999,6 +2048,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Режимдин адаттагы билдирмеси"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарея кубаттоого чейин отуруп калышы мүмкүн"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Батареянын отуруп калбашы үчүн Батареяны үнөмдөгүч режими иштетилди"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android колдонмосу"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 1e76147..84c4000 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"ການໂທ Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ປິດ"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ເລືອກໃຊ້ Wi-Fi ກ່ອນ"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ຕ້ອງການໃຊ້ມືຖື"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi ເທົ່ານັ້ນ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ບໍ່ຖືກສົ່ງຕໍ່"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ລາຍງານຂໍ້ຜິດພາດ"</string>
<string name="global_action_logout" msgid="935179188218826050">"ສິ້ນສຸດເຊດຊັນ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ພາບໜ້າຈໍ"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"ໃຊ້ລາຍງານຂໍ້ບົກພ່ອງ"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"ນີ້ຈະເປັນການເກັບກຳຂໍ້ມູນກ່ຽວກັບ ສະຖານະປັດຈຸບັນຂອງອຸປະກອນທ່ານ ເພື່ອສົ່ງເປັນຂໍ້ຄວາມທາງອີເມວ. ມັນຈະໃຊ້ເວລາໜ້ອຍນຶ່ງ ໃນການເລີ່ມຕົ້ນການລາຍງານຂໍ້ຜິດພາດ ຈົນກວ່າຈະພ້ອມທີ່ຈະສົ່ງໄດ້, ກະລຸນາລໍຖ້າ."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ລາຍງານແບບໂຕ້ຕອບ"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"ໃຊ້ພາຍໃຕ້ສະຖານະການສ່ວນໃຫຍ່. ມັນອະນຸຍາດໃຫ້ທ່ານສາມາດຕິດຕາມສະຖານະລາຍງານ, ປ້ອນລາຍລະອຽດເພີ່ມເຕີມກ່ຽວກັບບັນຫາ ແລະ ຖ່າຍຮູບໜ້າຈໍໄດ້. ມັນອາດລະເລີຍພາກສ່ວນທີ່ບໍ່ຄ່ອຍໃຊ້ທີ່ໃຊ້ເວລາລາຍງານດົນອອກໄປ."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ສະຖານທີ່"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ເຂົ້າເຖິງຂໍ້ມູນສະຖານທີ່ຂອງອຸປະກອນນີ້"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"ອະນຸຍາດ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ໃຫ້ເຂົ້າເຖິງສະຖານທີ່ຂອງອຸປະກອນບໍ?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ແອັບຈະມີສິດເຂົ້າເຖິງສະຖານທີ່ໃນເວລາທີ່ທ່ານກຳລັງໃຊ້ແອັບຢູ່ເທົ່ານັ້ນ."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ອະນຸຍາດໃຫ້ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ເຂົ້າເຖິງສະຖານທີ່ຂອງອຸປະກອນນີ້ບໍ?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ແອັບຈະມີສິດເຂົ້າເຖິງສະຖານທີ່ທຸກເທື່ອ ເຖິງແມ່ນໃນເວລາທ່ານບໍ່ໃຊ້ແອັບຢູ່ກໍຕາມ."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ປະຕິທິນ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ເຂົ້າຫາປະຕິທິນຂອງທ່ານ"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"ອະນຸຍາດ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ໃຫ້ເຂົ້າເຖິງປະຕິທິນຂອງທ່ານບໍ?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ອະນຸຍາດ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ໃຫ້ເຂົ້າເຖິງເພງຂອງທ່ານບໍ?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ຮູບພາບ ແລະ ວິດີໂອ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ເຂົ້າເຖິງຮູບພາບ ແລະ ວິດີໂອຂອງທ່ານ"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"ອະນຸຍາດໃຫ້ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ເຂົ້າເຖິງຮູບພາບ ແລະ ວິດີໂອຂອງທ່ານ, ຮວມທັງສະຖານທີ່ທີ່ຖືກແທັກນຳບໍ?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ດຶງຂໍ້ມູນເນື້ອຫາໃນໜ້າຈໍ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ກວດກາເນື້ອຫາຂອງໜ້າຈໍທີ່ທ່ານກຳລັງມີປະຕິສຳພັນນຳ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ເປີດໃຊ້ \"ການສຳຫຼວດໂດຍສຳຜັດ\""</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ອະນຸຍາດໃຫ້ແອັບຯຕິດຕໍ່ສື່ສານກັບປ້າຍກຳກັບ, ບັດ ແລະໂຕອ່ານຂອງການສື່ສານໄລຍະສັ້ນ (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ປິດການລັອກໜ້າຈໍ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ອະນຸຍາດໃຫ້ແອັບຯປິດການເຮັດວຽກຂອງປຸ່ມລັອກ ແລະລະບົບຄວາມປອດໄພຂອງລະຫັດຜ່ານທີ່ເຊື່ອມໂຍງກັນ. ໂຕຢ່າງ: ໂທລະສັບຈະປິດການເຮັດວຽກຂອງປຸ່ມລັອກເມື່ອມີສາຍໂທເຂົ້າ ຈາກນັ້ນຈຶ່ງເປີດໃຊ້ໄດ້ອີກເມື່ອວາງສາຍແລ້ວ."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ຮ້ອງຂໍຄວາມຊັບຊ້ອນການລັອກໜ້າຈໍ"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"ອະນຸຍາດໃຫ້ແອັບສຶກສາລະດັບຄວາມຊັບຊ້ອນຂອງໜ້າຈໍລັອກ (ສູງ, ກາງ, ຕ່ຳ ຫຼື ບໍ່ມີ), ເຊິ່ງລະບຸຂອບເຂດຄວາມເປັນໄປໄດ້ຂອງຄວາມຍາວ ແລະ ປະເພດຂອງການລັອກໜ້າຈໍ. ແອັບນີ້ສາມາດແນະນຳຜູ້ໃຊ້ວ່າເຂົາເຈົ້າສາມາດອັບເດດໜ້າຈໍລັອກເປັນລະດັບໃດໜຶ່ງເປັນການສະເພາະໄດ້, ແຕ່ຜູ້ໃຊ້ສາມາດທີ່ຈະບໍ່ສົນໃຈ ຫຼື ເປີດໄປອັນອື່ນໄດ້. ກະລຸນາຮັບຊາບວ່າການລັອກໜ້າຈໍບໍ່ໄດ້ບັນທຶກໃນແບບຂໍ້ຄວາມທຳມະດາ, ດັ່ງນັ້ນແອັບຈະບໍ່ຮູ້ລະຫັດຜ່ານທີ່ແນ່ນອນ."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ໃຊ້ຮາດແວຊີວະມິຕິ"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"ອະນຸຍາດໃຫ້ແອັບນຳໃຊ້ຮາດແວຊີວະມິຕິສຳລັບການພິສູດຢືນຢັນ"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ຈັດການຮາດແວລາຍນີ້ວມື"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ອະນຸຍາດໃຫ້ແອັບເປີດວິທີການຕ່າງໆເພື່ອເພີ່ມ ແລະ ລຶບແມ່ແບບໃບໜ້າສຳລັບການນຳໃຊ້."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າສຳລັບການກວດສອບຄວາມຖືກຕ້ອງ"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"ບໍ່ສາມາດປະມວນຜົນຂໍ້ມູນໃບໜ້າໄດ້. ກະລຸນາລອງອີກຄັ້ງ."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"ໃບໜ້າສະຫວ່າງເກີນໄປ. ກະລຸນາລອງໃນບ່ອນທີ່ແສງໜ້ອຍກວ່າ."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"ໃບໜ້າມືດເກີນໄປ. ກະລຸນາເປີດແຫຼ່ງກຳເນີດແສງ."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"ກະລຸນາຍ້າຍເຊັນເຊີອອກຫ່າງຈາກໃບໜ້າຕື່ມອີກ."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"ກະລຸນາຍ້າຍເຊັນເຊີເຂົ້າໃກ້ໃບໜ້າຕື່ມອີກ."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"ກະລຸນາຍ້າຍເຊັນເຊີໃຫ້ສູງຂຶ້ນອີກ."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"ກະລຸນາຍ້າຍເຊັນເຊີໃຫ້ຕໍ່າລົງອີກ."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"ກະລຸນາຍ້າຍເຊັນເຊີໄປເບື້ອງຂວາ."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"ກະລຸນາຍ້າຍເຊັນເຊີໄປເບື້ອງຊ້າຍ."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"ກະລຸນາແນມເບິ່ງເຊັນເຊີ."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"ກວດບໍ່ພົບໃບໜ້າ."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"ເຄື່ອນໄຫວຫຼາຍເກີນໄປ."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"ກະລຸນາລົງທະບຽນອຸປະກອນຂອງທ່ານອີກເທື່ອໜຶ່ງ."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"ກວດພົບໃບໜ້າຕ່າງກັນ."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"ຄ້າຍກັນເກີນໄປ, ກະລຸນາປ່ຽນທ່າຂອງທ່ານ."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"ກະລຸນາເບິ່ງຊື່ໆໄປທາງກ້ອງຫຼາຍຂຶ້ນ."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"ກະລຸນາເບິ່ງຊື່ໆໄປທາງກ້ອງຫຼາຍຂຶ້ນ."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"ກະລຸນາຍັບຫົວຂອງທ່ານໃຫ້ຊື່ຕາມລວງຕັ້ງ."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"ກະລຸນາຢ່າປິດບັງໃບໜ້າຂອງທ່ານ."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"ຮາດແວກວດໃບໜ້າບໍ່ສາມາດໃຊ້ໄດ້."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"ໝົດເວລາກວດໃບໜ້າແລ້ວ. ກະລຸນາລອງອີກຄັ້ງ."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"ບໍ່ສາມາດເກັບຮັກສາໃບໜ້າໄວ້ໄດ້."</string>
<string name="face_error_canceled" msgid="283945501061931023">"ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"ຜູ້ໃຊ້ຍົກເລີກການພິສູດຢືນຢັນໃບໜ້າແລ້ວ."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ປິດນຳໃຊ້ການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າແລ້ວ."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"ລອງອີກຄັ້ງ."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"ບໍ່ໄດ້ລົງທະບຽນໃບໜ້າໃດ."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"ອຸປະກອນນີ້ບໍ່ມີເຊັນເຊີກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"ໃບໜ້າ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ເກີນຂີດຄວາມຈຳແລ້ວ"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"ກວດພົບ Heap dump. ແຕະເພື່ອແບ່ງປັນ."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ແບ່ງປັນການເທກອງບໍ?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"ຂະບວນການ <xliff:g id="PROC">%1$s</xliff:g> ເກີນຂີດຈຳກັດຄວາມຈຳຂະບວນການຂອງມັນຂອງ <xliff:g id="SIZE">%2$s</xliff:g> ແລ້ວ. ການເທກອງມີໃຫ້ສຳລັບທ່ານ ເພື່ອແບ່ງປັນກັບຜູ້ພັດທະນາຂອງມັນ. ລະວັງ: ການເທກອງນີ້ສາມາດມີຂໍ້ມູນສ່ວນຕົວໃດໜຶ່ງຂອງທ່ານ ທີ່ແອັບພລິເຄຊັນມີການເຂົ້າຫາ."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"ເລືອກການເຮັດວຽກຂອງຂໍ້ຄວາມ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ລະດັບສຽງເອີ້ນເຂົ້າ"</string>
<string name="volume_music" msgid="5421651157138628171">"ລະດັບສຽງຂອງສື່"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ແຕະເພື່ອເບິ່ງເຄືອຂ່າຍທັງໝົດ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ເຊື່ອມຕໍ່"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ເຄືອຂ່າຍທັງໝົດ"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"ສາມາດໃຊ້ເຄືອຂ່າຍ Wi‑Fi ທີ່ <xliff:g id="NAME">%s</xliff:g> ສະເໜີໄດ້"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"ທ່ານຕ້ອງການເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍທີ່ສະເໜີໂດຍ <xliff:g id="NAME">%s</xliff:g> ຫຼືບໍ່?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ແມ່ນ"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ບໍ່ແມ່ນ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ຈະມີການເປີດໃຊ້ Wi‑Fi ອັດຕະໂນມັດ"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ລົງຊື່ເຂົ້າເຄືອຂ່າຍ"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi ບໍ່ມີສັນຍານອິນເຕີເນັດ"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ແຕະເພື່ອເບິ່ງຕົວເລືອກ"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"ເຊື່ອມຕໍ່ແລ້ວ"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"ການປ່ຽນແປງການຕັ້ງຄ່າຮັອດສະປອດຂອງທ່ານ"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ຄື້ນຄວາມຖີ່ຮັອດສະປອດຂອງທ່ານປ່ຽນແປງແລ້ວ."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ອຸປະກອນນີ້ບໍ່ຮອງຮັບການຕັ້ງຄ່າຂອງທ່ານສຳລັບ 5GHz ເທົ່ານັ້ນ. ແຕ່ວ່າອຸປະກອນນີ້ຈະໃຊ້ຄື້ນຄວາມຖີ່ 5GHz ເມື່ອສາມາດໃຊ້ໄດ້."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕໍ່ການດີບັກຜ່ານ USB ແລ້ວ"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"ແຕະເພື່ອປິດການດີບັກ USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ເລືອກເພື່ອປິດການດີບັ໊ກຜ່ານ USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"ມີຂອງແຫລວ ຫຼື ເສດດິນໃນຜອດ USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"ປິດຜອດ USB ໂດຍອັດຕະໂນມັດແລ້ວ. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"ປອດໄພທີ່ຈະໃຊ້ຜອດ USB ແລ້ວ"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"ແຕະເພື່ອປົດລັອກໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"ເຊື່ອມຕໍ່ກັບ <xliff:g id="PRODUCT_NAME">%1$s</xliff:g> ແລ້ວ"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ແຕະເພື່ອເບິ່ງໄຟລ໌"</string>
- <string name="pin_target" msgid="3052256031352291362">"ປັກໝຸດ"</string>
- <string name="unpin_target" msgid="3556545602439143442">"ຖອນປັກໝຸດ"</string>
<string name="app_info" msgid="6856026610594615344">"ຂໍ້ມູນແອັບ"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ກຳລັງເລີ່ມເດໂມ…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ການແຈ້ງເຕືອນຂໍ້ມູນໂໝດກິດຈະວັດປະຈຳວັນ"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ແບັດເຕີຣີອາດໝົດກ່ອນການສາກຕາມປົກກະຕິ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ເປີດຕົວປະຢັດແບັດເຕີຣີເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ໂຟນເດີ"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"ແອັບພລິເຄຊັນ Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ໄຟລ໌"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 94ab46c..2d6e4cb 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -143,8 +143,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"„Wi-Fi“ skambinimas"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Išjungta"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Pageidautinas „Wi-Fi“ ryšys"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Pirmenybė mobiliojo ryšio tinklui"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Tik „Wi-Fi“"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: neperadresuota"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -232,7 +234,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Pranešimas apie riktą"</string>
<string name="global_action_logout" msgid="935179188218826050">"Baigti seansą"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekrano kopija"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Pranešti apie riktą"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Bus surinkta informacija apie dabartinę įrenginio būseną ir išsiųsta el. pašto pranešimu. Šiek tiek užtruks, kol pranešimas apie riktą bus paruoštas siųsti; būkite kantrūs."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interakt. ataskaita"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Naudokite tai esant daugumai aplinkybių. Galite stebėti ataskaitos eigą, įvesti daugiau išsamios informacijos apie problemą ir padaryti ekrano kopijų. Gali būti praleidžiamos kelios rečiau naudojamos skiltys, kurių ataskaitų teikimas ilgai trunka."</string>
@@ -287,9 +290,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Vietovė"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pasiekti įrenginio vietovės informaciją"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> galimybę pasiekti įrenginio vietovę?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Programa galės pasiekti vietovę, tik kai ją naudosite."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Visada leisti programai <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pasiekti šio įrenginio vietovę?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Programa visada galės pasiekti vietovę, net kai jos nenaudosite."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendorius"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pasiekti kalendorių"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> galimybę pasiekti kalendorių?"</string>
@@ -322,7 +328,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Suteikti programai <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prieigą prie muzikos?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Nuotraukos ir vaizdo įrašai"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pasiekti nuotraukas ir vaizdo įrašus"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Leisti programai <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pasiekti nuotraukas ir vaizdo įrašus, įskaitant pažymėtas vietoves?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Gauti lango turinį"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tikrinti lango, su kuriuo sąveikaujate, turinį."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Įjungti „Naršyti paliečiant“"</string>
@@ -515,8 +524,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Leidžiama programai perduoti artimojo lauko ryšių technologijos (ALR) žymas, korteles ir skaitymo programas."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"išjungti ekrano užraktą"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Leidžiama programai neleisti klavišo užrakto ir visos susijusios slaptažodžio apsaugos. Pvz., telefonas neleidžia klavišo užrakto priimant gaunamąjį skambutį ir pakartotinai jį įgalina, kai skambutis baigiamas."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"pateikti ekrano užrakto sudėtingumo užklausą"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Leidžiama programai sužinoti ekrano užrakto sudėtingumo lygį (aukštas, vidutinis, žemas arba nėra), nurodantį galimą ekrano užrakto trukmės diapazoną ir tipą. Be to, programa gali pasiūlyti naudotojams atnaujinti ekrano užraktą į tam tikrą lygį, bet naudotojai gali laisvai nepaisyti ir išeiti. Atminkite, kad ekrano užraktas nesaugomas kaip grynasis tekstas, todėl programa nežino tikslaus slaptažodžio."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"naudoti biometrinę aparatinę įrangą"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Leidžiama programai naudoti biometrinę aparatinę įrangą tapatybei nustatyti"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"tvarkyti piršto antspaudo aparatinę įrangą"</string>
@@ -571,37 +582,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Programai leidžiama aktyv. metodus, norint pridėti ir ištrinti naudojamus veidų šablonus."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"naudoti veido autentifikavimo aparatinę įrangą"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Programai leidžiama naudoti veido autentifikavimo aparatinę įrangą tapatybei nustatyti"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nepavyko apdoroti veido. Bandykite dar kartą."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Veidas per šviesus. Band. sumažinti apšvietimą."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Veidas per tamsus. Atidenkite apšvietimo šaltinį."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Patraukite jutiklį toliau nuo veido."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Laikykite jutiklį arčiau veido."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Pakelkite jutiklį aukščiau."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Nuleiskite jutiklį žemiau."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Patraukite jutiklį dešinėn."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Patraukite jutiklį kairėn."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Žiūrėkite į jutiklį."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Neaptikta jokių veidų."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Įrenginys per daug judinamas."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Užregistruokite veidą iš naujo."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Aptiktas kitas veidas."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Per daug panašu, pakeiskite veido išraišką."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Žiūrėkite tiesiai į fotoaparatą."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Žiūrėkite tiesiai į fotoaparatą."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Laikykite galvą vertikaliai."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Atidenkite veidą."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Veido atpažinimo aparatinė įranga nepasiekiama."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Baigėsi veido atpaž. skirt. laik. Band. dar kartą."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Nepavyko išsaugoti veido duomenų."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Veido atpažinimo operacija atšaukta."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Veido autentifikavimą atšaukė naudotojas."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Per daug bandymų. Vėliau bandykite dar kartą."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Per daug bandymų. Veido autentifik. išjungtas."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Bandykite dar kartą."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Neužregistruota jokių veidų."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Šiame įrenginyje nėra veido autentifikavimo jutiklio."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> veidas"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1253,9 +1286,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Atidaryti „<xliff:g id="NEW_APP">%1$s</xliff:g>“"</string>
<string name="new_app_description" msgid="5894852887817332322">"„<xliff:g id="OLD_APP">%1$s</xliff:g>“ bus uždaryta neišsaugojus duomenų"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"„<xliff:g id="PROC">%1$s</xliff:g>“ viršijo atminties limitą"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Atminties išklotinės duomenys surinkti. Palieskite, jei norite bendrinti."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Bendrinti atminties išklotinę?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Procesas „<xliff:g id="PROC">%1$s</xliff:g>“ viršijo atminties limitą <xliff:g id="SIZE">%2$s</xliff:g>. Atminties išklotinė pasiekiama, kad galėtumėte bendrinti su jos kūrėju. Būkite atsargūs: šioje atminties išklotinėje gali būti jūsų asmeninės informacijos, kurią gali pasiekti programa."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Pasirinkite teksto veiksmą"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Skambučio garsumas"</string>
<string name="volume_music" msgid="5421651157138628171">"Medijos garsumas"</string>
@@ -1298,8 +1338,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Palieskite, jei norite matyti visus tinklus"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Prisijungti"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Visi tinklai"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Pasiekiamas „<xliff:g id="NAME">%s</xliff:g>“ siūlomas „Wi‑Fi“ tinklas"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Ar norite prisijungti prie „<xliff:g id="NAME">%s</xliff:g>“ siūlomų tinklų?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Taip"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"„Wi‑Fi“ bus įjungtas automatiškai"</string>
@@ -1311,9 +1353,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Prisijungti prie tinklo"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"„Wi‑Fi“ tinkle nėra interneto ryšio"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Palieskite, kad būtų rodomos parinktys."</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Prisijungta"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Viešosios interneto prieigos taško nustatymų pakeitimai"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Viešosios prieigos taško dažnio juosta pasikeitė."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Šiame įrenginyje nepalaikoma tik 5 GHz nuostata. Vietoj to šiame įrenginyje bus naudojama 5 GHz dažnio juosta, kai bus pasiekiama."</string>
@@ -1398,6 +1445,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB derinimas prijungtas"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Palieskite, kad išjungtumėte USB derinimą"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Pasirinkite, kas išjungtumėte USB derinimą."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB prievade yra skysčių ar smulkių dalelių"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB prievadas automatiškai išjungtas. Palieskite, kad sužinotumėte daugiau."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Saugu naudoti USB prievadą"</string>
@@ -1973,8 +2024,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Paliesk., kad atr. darbo prof."</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Prisijungta prie „<xliff:g id="PRODUCT_NAME">%1$s</xliff:g>“"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Palieskite, kad peržiūrėtumėte failus"</string>
- <string name="pin_target" msgid="3052256031352291362">"Prisegti"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Atsegti"</string>
<string name="app_info" msgid="6856026610594615344">"Programos informacija"</string>
<string name="negative_duration" msgid="5688706061127375131">"–<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Paleidžiama demonstracinė versija…"</string>
@@ -2067,6 +2116,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Veiksmų sekos režimo informacijos pranešimas"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akumuliatoriaus energija gali išsekti prieš įprastą įkrovimą"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Akumuliatoriaus tausojimo priemonė suaktyvinta, kad akumuliatorius veiktų ilgiau"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Aplankas"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"„Android“ programa"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Failas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 53ab075..93f86e6 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -142,8 +142,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi zvani"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Izslēgts"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Vēlams Wi-Fi tīkls"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Vēlams mobilo datu savienojums"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Tikai Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nav pāradresēts"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -230,7 +232,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Kļūdu ziņojums"</string>
<string name="global_action_logout" msgid="935179188218826050">"Beigt sesiju"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekrānuzņēmums"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Kļūdu ziņojuma sagatavošana"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Veicot šo darbību, tiks apkopota informācija par jūsu ierīces pašreizējo stāvokli un nosūtīta e-pasta ziņojuma veidā. Kļūdu ziņojuma pabeigšanai un nosūtīšanai var būt nepieciešams laiks. Lūdzu, esiet pacietīgs."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktīvs pārskats"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Izmantojiet lielākajā daļā gadījumu. Varat izsekot pārskata izveides norisi, ievadīt papildu informāciju par problēmu un izveidot ekrānuzņēmumus. Var tikt izlaistas dažas mazāk izmantotas sadaļas, kuru izveidei nepieciešams daudz laika."</string>
@@ -284,9 +287,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Atrašanās vieta"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"piekļūt ierīces atrašanās vietas informācijai"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt šīs ierīces atrašanās vietai?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Lietotne varēs piekļūt atrašanās vietai tikai tad, kad izmantosiet šo lietotni."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Vienmēr atļaut <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt atrašanās vietai?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Lietotne vienmēr varēs piekļūt atrašanās vietai, pat ja neizmantosiet šo lietotni."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendārs"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"piekļūt jūsu kalendāram"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt jūsu kalendāram?"</string>
@@ -319,7 +325,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt jūsu mūzikai?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotoattēli un videoklipi"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"Piekļūt jūsu fotoattēliem un videoklipiem"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vai atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt jūsu fotoattēliem, videoklipiem, tostarp atzīmētajām atrašanās vietām?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Izgūt loga saturu."</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Skatīt tā loga saturu, ar kuru mijiedarbojaties."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivizēt funkciju “Pārlūkot pieskaroties”."</string>
@@ -512,8 +521,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Ļauj lietotnei sazināties ar tuva darbības lauka sakaru (Near Field Communication — NFC) atzīmēm, kartēm un lasītājiem."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"atspējot ekrāna bloķēšanu"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ļauj lietotnei atspējot taustiņslēgu un visu saistīto paroļu drošību. Piemēram, tālrunis atspējo taustiņslēgu, saņemot ienākošu zvanu, un pēc zvana pabeigšanas atkārtoti iespējo taustiņslēgu."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"Ekrāna bloķēšanas sarežģītības pakāpes informācijas pieprasījums"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Atļauj lietotnei piekļūt informācijai par ekrāna bloķēšanas sarežģītības pakāpi (augsta, vidēja, zema, nav), kas apzīmē iespējamo paroles garumu un ekrāna bloķēšanas veidus. Lietotnē lietotājiem var tikt rādīts arī ieteikums ekrāna bloķēšanai iestatīt citu līmeni, taču šo ieteikumu var ignorēt un aizvērt. Ņemiet vērā, ka ekrāna bloķēšanas parole netiek glabāta vienkārša teksta formātā, tāpēc lietotnei nav piekļuves precīzai parolei."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"izmantot biometrisko datu aparatūru"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Atļauj lietotnei izmantot biometrisko datu aparatūru autentificēšanai"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"pārvaldīt pirkstu nospiedumu aparatūru"</string>
@@ -568,37 +579,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Atļauj lietotnei izsaukt metodes izmantojamo sejas veidņu pievienošanai un dzēšanai."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"izmantot sejas autentifikācijas aparatūru"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Atļauj lietotnei izmantot sejas autentifikācijas aparatūru autentificēšanai"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nevarēja apstrādāt sejas datus. Mēģiniet vēlreiz."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Seja ir pārāk izgaismota. Mēģiniet tumšākā vidē."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Pārāk tumšs sejas attēls. Mēģiniet gaišākā vidē."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Pavirziet sensoru tālāk no sejas."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Pavirziet sensoru tuvāk sejai."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Pavirziet sensoru augstāk."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Pavirziet sensoru zemāk."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Pavirziet sensoru pa labi."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Pavirziet sensoru pa kreisi."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Lūdzu, paskatieties uz sensoru."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nav atrasta neviena seja."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Pārāk daudz kustību."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Lūdzu, atkārtoti reģistrējiet savu seju."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Tika noteikta cita seja."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Pārāk līdzīgi. Lūdzu, mainiet pozu."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Lūdzu, tiešāk skatieties uz kameru."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Lūdzu, tiešāk skatieties uz kameru."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Lūdzu, vertikāli iztaisnojiet galvu."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Lūdzu, atsedziet seju."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Sejas autentifikācijas aparatūra nav pieejama."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Sejas datu nolasīšanas noildze. Mēģiniet vēlreiz."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Sejas datus nevar saglabāt."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Darbība ar sejas datiem atcelta."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Lietotājs atcēla sejas autentificēšanu."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Par daudz mēģinājumu. Sejas atpazīšana atspējota."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Mēģiniet vēlreiz."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nav reģistrēti sejas dati."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Šai ierīcei nav sejas autentifikācijas sensora."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Seja <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1233,9 +1266,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Atvērt <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"Lietotne <xliff:g id="OLD_APP">%1$s</xliff:g> tiks aizvērta, neko nesaglabājot"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Process <xliff:g id="PROC">%1$s</xliff:g> pārsniedza atmiņas ierobežojumu."</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Apkopots kaudzes izraksts. Pieskarieties, lai kopīgotu."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vai kopīgot kaudzes izrakstu?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Process <xliff:g id="PROC">%1$s</xliff:g> pārsniedza procesu atmiņas ierobežojumu (<xliff:g id="SIZE">%2$s</xliff:g>). Tika apkopots kaudzes izraksts, ko varat kopīgot ar procesa izstrādātāju. Ņemiet vērā: kaudzes izrakstā var būt ietverta jūsu personas informācija, kurai var piekļūt lietojumprogramma."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Izvēlieties darbību tekstam"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Zvanītāja skaļums"</string>
<string name="volume_music" msgid="5421651157138628171">"Multivides skaļums"</string>
@@ -1276,8 +1316,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Pieskarieties, lai skatītu visus tīklus"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Izveidot savienojumu"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Visi tīkli"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Ir pieejams Wi‑Fi tīkls, ko ieteica <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Vai vēlaties izveidot savienojumu ar tīkliem, ko ieteica <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Jā"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nē"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi tiks automātiski ieslēgts"</string>
@@ -1289,9 +1331,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Pierakstīšanās tīklā"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tīklā nav piekļuves internetam."</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Pieskarieties, lai skatītu iespējas."</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Izveidots savienojums"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Izmaiņas tīklāja iestatījumos"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ir mainīts tīklāja joslas platums."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Šajā ierīcē netiek atbalstīta jūsu preference par tikai 5 GHz joslu. 5 GHz josla ierīcē tiks izmantota, kad tā būs pieejama."</string>
@@ -1376,6 +1423,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB atkļūdošana ir pievienota."</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Pieskarieties, lai izslēgtu USB atkļūdošanu"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Atlasiet, lai atspējotu USB atkļūdošanu."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB pieslēgvietā ir šķidrums vai daļiņas"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB pieslēgvieta ir automātiski atspējota. Pieskarieties, lai uzzinātu vairāk."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB pieslēgvietas izmantošana ir droša"</string>
@@ -1939,8 +1990,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Pieskarieties, lai atbloķētu."</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Izveidots savienojums ar: <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Pieskarieties, lai skatītu failus."</string>
- <string name="pin_target" msgid="3052256031352291362">"Piespraust"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Atspraust"</string>
<string name="app_info" msgid="6856026610594615344">"Lietotnes informācija"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Notiek demonstrācijas palaišana..."</string>
@@ -2032,6 +2081,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Informatīvs paziņojums par akumulatoru"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akumulators var izlādēties pirms parastā uzlādes laika"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Aktivizēts akumulatora jaudas taupīšanas režīms, lai palielinātu akumulatora darbības ilgumu"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Mape"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android lietojumprogramma"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fails"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 4e0b47a..20d42ad 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Повикување преку Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"Глас преку Wi-Fi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Исклучено"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Се претпочита Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Претпочитам мобилен интернет"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Само Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не е препратено"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Извештај за грешка"</string>
<string name="global_action_logout" msgid="935179188218826050">"Завршете ја сесијата"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Слика од екранот"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Направи извештај за грешки"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Ова ќе собира информации за моменталната состојба на вашиот уред, за да ги испрати како порака по е-пошта. Тоа ќе одземе малку време почнувајќи од извештајот за грешки додека не се подготви за праќање; бидете трпеливи."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактивен извештај"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Користете го ова во повеќето ситуации. Ви дозволува да го следите напредокот на извештајот, да внесете повеќе детали во врска со проблемот и да сликате слики од екранот. Може да испушти некои помалку користени делови за коишто е потребно долго време за да се пријават."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Локација"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"пристапува до локацијата на овој уред"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да пристапува до локацијата на уредот?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Апликацијата ќе има пристап до локацијата само додека ја користите."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Дозволете <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> секогаш да пристапува до локацијата?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Апликацијата секогаш ќе има пристап до локацијата, дури и кога не ја користите."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"пристапува до календарот"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да пристапува до календарот?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да пристапува до музиката?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Фотографии и видеа"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"пристапува до фотографиите и видеата"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Дали да се дозволи <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да пристапува до фотографиите и видеата, вклучувајќи означени локации?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Преземе содржина на прозорец"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ја следи содржината на прозорецот со кој се комуницира."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Вклучи „Истражувај со допир“"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Дозволува апликацијата да комуницира со ознаки, картички и читачи за Комуникација при непосредна близина (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"оневозможи заклучување на екран"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Овозможува апликацијата да го оневозможи заклучувањето и каква било безбедност поврзана со лозинка. На пример, телефонот го оневозможува заклучувањето при прием на телефонски повик, а потоа повторно го овозможува заклучувањето кога повикот ќе заврши."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"побарува сложеност за заклучувањето на екранот"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Дозволува апликацијата да го научи нивото на сложеност за заклучувањето на екранот (високо, средно, ниско или нема), коешто ги означува можниот опсег на должината и типот на заклучувањето на екранот. Апликацијата може и да им предлага на корисниците да го ажурираат заклучувањето на екранот на одредено ниво, но корисниците може слободно да го игнорираат тоа и да продолжат понатаму. Имајте предвид дека заклучувањето на екранот не се складира како обичен текст, па така апликацијата не ја знае точната лозинка."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"користи биометриски хардвер"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Дозволува апликацијата да користи биометриски хардвер за проверка"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"управувај хардвер за отпечатоци"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Дозволува апликац. да повика начини за додавање и бришење шаблони на лице за користење."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"користи хардвер за проверка на лице"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Дозволува апликацијата да користи хардвер за лице за проверка"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Лицето не можеше да се обработи. Обидете се пак."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Лицето е пресветло. Пробајте на послаба светлина."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Лицето е претемно. Пробајте со поголема светлина."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Оддалечете го сензорот од лицето."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Доближете го сензорот до лицето."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Подигнете го сензорот."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Спуштете го сензорот."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Поместете го сензорот надесно."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Поместете го сензорот налево."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Погледнете во сензорот."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Не е откриено лице."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Премногу движење."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторно регистрирајте го лицето."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Откриено е друго лице."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Премногу слично, сменете ја позата."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Гледајте подиректно во камерата."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Гледајте подиректно во камерата."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Исправете ја главата вертикално."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Откријте го вашето лице."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Хардверот за лице не е достапен."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Истече времето за проверка на лице. Повторен обид."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Лицето не може да се чува."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Операцијата со лице се откажа."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Проверката на лицето е откажана од корисникот."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Премногу обиди. Обидете се повторно подоцна."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Премногу обиди. Проверката на лице е оневозможена."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Обидете се повторно."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Нема регистрирано лице."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Уредов нема сензор за проверка на лице."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Отвори ја <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ќе се затвори без да се зачува"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> го надмина ограничувањето на меморијата"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Сликата од меморијата е собрана. Допрете за споделување."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Сподели слика од меморија?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Процесот <xliff:g id="PROC">%1$s</xliff:g> го надмина ограничувањето на меморијата на својот процес од <xliff:g id="SIZE">%2$s</xliff:g>. Достапна ви е слика од меморијата да ја споделите со неговиот програмер. Бидете внимателни: сликата од меморијата може да содржи кои било од вашите лични информации до кои апликацијата има пристап."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Избери дејство за текст"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Јачина на звук на ѕвонче"</string>
<string name="volume_music" msgid="5421651157138628171">"Јачина на аудио/видео звук"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Допрете за да ги видите сите мрежи"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Поврзете се"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Сите мрежи"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Wi‑Fi мрежата предложена од <xliff:g id="NAME">%s</xliff:g> е достапна"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Дали сакате да се поврзувате на мрежите што ги предлага <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Да"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Не"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ќе се вклучи автоматски"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Најавете се на мрежа"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi нема пристап до интернет"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Допрете за опции"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Поврзано"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Промени на поставките за точка на пристап"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Појасот за точка на пристап е променет."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Уредов не ги поддржува вашите поставки за само 5 GHz. Наместо тоа, ќе го користи појасот од 5 GHz кога е достапен."</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Поврзано е отстранување грешки преку USB"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Допрете за да го исклучите отстранувањето грешки преку USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Изберете за да се оневозможи отстранување грешки на USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Течност или нечистотија во USB-портата"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-портата е автоматски оневозможена. Допрете за да дознаете повеќе."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Безбедно е да се користи USB-портата"</string>
@@ -1908,8 +1959,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Допрете за да го отклучите"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Поврзан на <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Допрете за да ги погледнете датотеките"</string>
- <string name="pin_target" msgid="3052256031352291362">"Прикачете"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Откачете"</string>
<string name="app_info" msgid="6856026610594615344">"Информации за апликација"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Се вклучува демонстрацијата…"</string>
@@ -2000,6 +2049,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Известување за информации за режимот за рутини"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батеријата може да се потроши пред вообичаеното време за полнење"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Активиран е „Штедачот на батерија“ за да се продолжи траењето на батеријата"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Апликација за Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Датотека"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 13ca198..ca82238 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"വൈഫൈ കോളിംഗ്"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"Voവൈഫൈ"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ഓഫ്"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"വൈഫൈ തിരഞ്ഞെടുത്തിരിക്കുന്നു"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കാൻ താൽപ്പര്യപ്പെടുന്നു"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"വൈഫൈ മാത്രം"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: കൈമാറിയില്ല"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ബഗ് റിപ്പോർട്ട്"</string>
<string name="global_action_logout" msgid="935179188218826050">"സെഷൻ അവസാനിപ്പിക്കുക"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"സ്ക്രീൻഷോട്ട്"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"ബഗ് റിപ്പോർട്ട് എടുക്കുക"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"ഒരു ഇമെയിൽ സന്ദേശമായി അയയ്ക്കുന്നതിന്, ഇത് നിങ്ങളുടെ നിലവിലെ ഉപകരണ നിലയെക്കുറിച്ചുള്ള വിവരങ്ങൾ ശേഖരിക്കും. ബഗ് റിപ്പോർട്ട് ആരംഭിക്കുന്നതിൽ നിന്ന് ഇത് അയയ്ക്കാനായി തയ്യാറാകുന്നതുവരെ അൽപ്പസമയമെടുക്കും; ക്ഷമയോടെ കാത്തിരിക്കുക."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ഇന്റരാക്റ്റീവ് റിപ്പോർട്ട്"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"മിക്ക സാഹചര്യങ്ങളിലും ഇത് ഉപയോഗിക്കുക. റിപ്പോർട്ടിന്റെ പുരോഗതി കാണാനും പ്രശ്നത്തെ കുറിച്ചുള്ള കൂടുതൽ വിശദാംശങ്ങൾ നൽകാനും സ്ക്രീൻഷോട്ടുകൾ എടുക്കാനും ഇത് അനുവദിക്കുന്നു. റിപ്പോർട്ടുചെയ്യാൻ നീണ്ട സമയം എടുക്കുന്നതും നിങ്ങൾ കുറച്ച് ഉപയോഗിക്കുന്നതുമായ ചില വിഭാഗങ്ങളെ ഇത് വിട്ടുകളഞ്ഞേക്കാം."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ലൊക്കേഷൻ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"നിങ്ങൾ ഉപയോഗിക്കുമ്പോൾ മാത്രം ആപ്പ് ലൊക്കേഷൻ ആക്സസ് ചെയ്യും."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> എപ്പോഴും ആപ്പിനെ അനുവദിക്കണോ?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ പോലും, ഏതുസമയത്തും ആപ്പ് ലൊക്കേഷൻ ആക്സസ് ചെയ്യും."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"കലണ്ടർ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"നിങ്ങളുടെ കലണ്ടർ ആക്സസ്സ് ചെയ്യുക"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"നിങ്ങളുടെ കലണ്ടർ ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കണോ?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> എന്നതിനെ നിങ്ങളുടെ സംഗീതം ആക്സസ് ചെയ്യാൻ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ഫോട്ടോകളും വീഡിയോകളും"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"നിങ്ങളുടെ ഫോട്ടോകളും & വീഡിയോകളും"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"ടാഗ് ചെയ്ത ലൊക്കേഷനുകൾ ഉൾപ്പെടെ നിങ്ങളുടെ ഫോട്ടോകളും വീഡിയോകളും ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-നെ അനുവദിക്കണോ?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"വിൻഡോ ഉള്ളടക്കം വീണ്ടെടുക്കുക"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"നിങ്ങൾ സംവദിക്കുന്ന ഒരു വിൻഡോയുടെ ഉള്ളടക്കം പരിശോധിക്കുക."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"സ്പർശനം വഴി പര്യവേക്ഷണം ചെയ്യുക, ഓണാക്കുക"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"നിയർ ഫീൽഡ് കമ്മ്യൂണിക്കേഷൻ (NFC) ടാഗുകളുമായും കാർഡുകളുമായും റീഡറുകളുമായുള്ള ആശയവിനിമയത്തിന് അപ്ലിക്കേഷനുകളെ അനുവദിക്കുന്നു."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"നിങ്ങളുടെ സ്ക്രീൻ ലോക്ക് പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"കീലോക്കും ഏതെങ്കിലും അനുബന്ധ പാസ്വേഡ് സുരക്ഷയും പ്രവർത്തനരഹിതമാക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉദാഹരണത്തിന്, ഒരു ഇൻകമിംഗ് കോൾ സ്വീകരിക്കുമ്പോൾ ഫോൺ കീലോക്ക് പ്രവർത്തനരഹിതമാക്കുന്നു, കോൾ അവസാനിക്കുമ്പോൾ കീലോക്ക് വീണ്ടും പ്രവർത്തനക്ഷമമാകുന്നു."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"സ്ക്രീൻ ലോക്ക് സങ്കീർണ്ണത അഭ്യർത്ഥിക്കുക"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"സ്ക്രീൻ ലോക്കിന്റെ സാധ്യമായ നീളവും തരവും സൂചിപ്പിക്കുന്ന, അതിന്റെ സങ്കീർണ്ണത നില (ഉയർന്നത്, ഇടത്തരം, കുറഞ്ഞത് അല്ലെങ്കിൽ ഒന്നുമില്ല) മനസിലാക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു. സ്ക്രീൻ ലോക്ക് ഒരു പ്രത്യേക തലത്തിലേക്ക് അപ്ഡേറ്റ് ചെയ്യുന്ന ഉപയോക്താക്കൾക്ക് നിർദ്ദേശിക്കാനും ആപ്പിനാവും, മാത്രമല്ല ഉപയോക്താക്കൾക്ക് എളുപ്പത്തിൽ അവഗണിക്കാനും മറ്റൊന്നിലേക്ക് നാവിഗേറ്റ് ചെയ്യാനുമാവും. പ്ലെയിൻടെക്സ്റ്റിൽ സ്ക്രീൻ ലോക്ക് സംഭരിക്കപ്പെട്ടിട്ടില്ലെന്ന കാര്യം ശ്രദ്ധിക്കുക, അതിനാൽ ആപ്പിന് കൃത്യമായ പാസ്വേഡ് അറിയില്ല."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ബയോമെട്രിക് ഹാർഡ്വെയർ ഉപയോഗിക്കുക"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"പരിശോധിച്ചുറപ്പിക്കുന്നതിനായി, ബയോമെട്രിക് ഹാർഡ്വെയർ ഉപയോഗിക്കാൻ ആപ്പിനെ അനുവദിക്കുക"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ഫിംഗർപ്രിന്റ് ഹാർഡ്വെയർ നിയന്ത്രിക്കുക"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ഉപയോഗിക്കാനായി, മുഖത്തിന്റെ ടെംപ്ലേറ്റുകൾ ചേർക്കാനും ഇല്ലാതാക്കാനുമുള്ള രീതികൾ അഭ്യർത്ഥിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"മുഖം തിരിച്ചറിയൽ ഹാർഡ്വെയർ ഉപയോഗിക്കുക"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"പരിശോധിച്ചുറപ്പിക്കലിനായി മുഖം തിരിച്ചറിയൽ ഹാർഡ്വെയർ ഉപയോഗിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"മുഖം പ്രോസസ്സ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"മുഖം വളരെ തെളിച്ചമുള്ളതാണ്. കുറഞ്ഞ വെളിച്ചത്തിൽ ശ്രമിക്കുക."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"മുഖം വളരെ ഇരുണ്ടതാണ്. പ്രകാശ ലഭ്യത ഉറപ്പാക്കി ശ്രമിക്കുക."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"മുഖത്തിനടുത്തുനിന്ന് സെൻസർ അകലേയ്ക്ക് നീക്കുക."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"സെൻസർ മുഖത്തിനടുത്തേയ്ക്ക് കൊണ്ടുവരിക."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"സെൻസർ മുകളിലേക്ക് നീക്കുക."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"സെൻസർ താഴേയ്ക്ക് നീക്കുക."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"സെൻസർ വലത്തേയ്ക്ക് നീക്കുക."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"സെൻസർ ഇടത്തേയ്ക്ക് നീക്കുക."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"സെൻസറിലേക്ക് നോക്കുക."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"മുഖം കണ്ടെത്താനായില്ല."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"ഉപകരണം വളരെയധികം ഇളകുന്നു."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യുക."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"മറ്റൊരു മുഖം തിരിച്ചറിഞ്ഞു."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"വളരെയധികം സമാനത, നിങ്ങളുടെ പോസ് മാറ്റുക."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"അൽപ്പം കൂടി ക്യാമറയ്ക്ക് നേരെ നോക്കൂ."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"അൽപ്പം കൂടി ക്യാമറയ്ക്ക് നേരെ നോക്കൂ."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"നിങ്ങളുടെ തല ലംബമായി നേരെയാക്കുക"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"നിങ്ങളുടെ മുഖം വ്യക്തമാക്കുക."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"മുഖത്തിന്റെ ഹാർഡ്വെയർ ലഭ്യമല്ല."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"മുഖം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"മുഖം സൂക്ഷിക്കാനാവില്ല."</string>
<string name="face_error_canceled" msgid="283945501061931023">"മുഖത്തിന്റെ പ്രവർത്തനം റദ്ദാക്കി."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"മുഖം പരിശോധിച്ചുറപ്പിക്കൽ ഉപയോക്താവ് റദ്ദാക്കി."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"നിരവധി തവണ ശ്രമിച്ചു. മുഖം തിരിച്ചറിയൽ പ്രവർത്തനരഹിതമാക്കി."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"വീണ്ടും ശ്രമിക്കുക."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"ഒരു മുഖവും എൻറോൾ ചെയ്തിട്ടില്ല."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"ഈ ഉപകരണത്തിൽ മുഖം പരിശോധിച്ചുറപ്പിക്കാനുള്ള സെൻസറില്ല."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"മുഖം <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> തുറക്കുക"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> സംരക്ഷിക്കാതെ അവസാനിപ്പിക്കും"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> മെമ്മറി പരിധി കവിഞ്ഞു"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"ഹീപ്പ് ഡംപ് ശേഖരിച്ചു. പങ്കിടാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ഹീപ്പ് ഡംപ് പങ്കിടണോ?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> പ്രോസസ്സ് അതിന്റെ മെമ്മറി പരിധിയായ <xliff:g id="SIZE">%2$s</xliff:g> കവിഞ്ഞു. അതിന്റെ ഡവലപ്പറുമായി പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് നിങ്ങൾക്ക് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: ഈ ഹീപ്പ് ഡംപിൽ അപ്ലിക്കേഷന് ആക്സസ്സുള്ള ഏതെങ്കിലും സ്വകാര്യ വിവരങ്ങൾ അടങ്ങിയിരിക്കാം."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"വാചകസന്ദേശത്തിനായി ഒരു പ്രവർത്തനം തിരഞ്ഞെടുക്കുക"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"റിംഗർ വോളിയം"</string>
<string name="volume_music" msgid="5421651157138628171">"മീഡിയ വോളിയം"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"എല്ലാ നെറ്റ്വർക്കുകളും കാണാൻ ടാപ്പുചെയ്യുക"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"കണക്റ്റുചെയ്യുക"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"എല്ലാ നെറ്റ്വർക്കുകളും"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> നിർദ്ദേശിച്ച വൈഫൈ നെറ്റ്വർക്ക് ലഭ്യമാണ്"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"<xliff:g id="NAME">%s</xliff:g> നിർദ്ദേശിച്ച നെറ്റ്വർക്കുകളിലേക്ക് കണക്റ്റ് ചെയ്യണോ?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ഉവ്വ്"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ഇല്ല"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"വൈഫൈ സ്വമേധയാ ഓണാകും"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"നെറ്റ്വർക്കിലേക്ക് സൈൻ ഇൻ ചെയ്യുക"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"വൈഫൈയ്ക്ക് ഇന്റർനെറ്റ് ആക്സസ് ഇല്ല"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ഓപ്ഷനുകൾക്ക് ടാപ്പുചെയ്യുക"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"കണക്റ്റ് ചെയ്തു"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"നിങ്ങളുടെ ഹോട്ട്സ്പോട്ട് ക്രമീകരണത്തിൽ വരുത്തിയ മാറ്റങ്ങൾ"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"നിങ്ങളുടെ ഹോട്ട്സ്പോട്ട് ബാൻഡ് മാറി."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"നിങ്ങളുടെ മുൻഗണനയനുസരിച്ചുള്ള, 5GHz മാത്രം എന്നത് ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല. പകരം, 5GHz ബാൻഡ് ലഭ്യമാകുമ്പോൾ അത് ഉപയോഗിക്കും."</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ഡീബഗ്ഗിംഗ് കണക്റ്റ് ചെയ്തു"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB ഡീബഗ്ഗിംഗ് ഓഫാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ഡീബഗ്ഗുചെയ്യൽ പ്രവർത്തനരഹിതമാക്കാൻ തിരഞ്ഞെടുക്കുക."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB പോർട്ടിൽ ദ്രാവകമോ പൊടിയോ കണ്ടെത്തി"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB പോർട്ടർ സ്വയമേവ പ്രവർത്തനരഹിതമായി. കൂടുതലറിയാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB പോർട്ട് ഇപ്പോൾ സുരക്ഷിതമായി ഉപയോഗിക്കാം"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"ഔദ്യോഗിക പ്രൊഫൈൽ അൺലോക്കുചെയ്യാൻ ടാപ്പുചെയ്യുക"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തു"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ഫയലുകൾ കാണുന്നതിന് ടാപ്പുചെയ്യുക"</string>
- <string name="pin_target" msgid="3052256031352291362">"പിൻ ചെയ്യുക"</string>
- <string name="unpin_target" msgid="3556545602439143442">"അൺപിൻ ചെയ്യുക"</string>
<string name="app_info" msgid="6856026610594615344">"ആപ്പ് വിവരം"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ഡെമോ ആരംഭിക്കുന്നു…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ദിനചര്യ മോഡ് വിവരത്തെ കുറിച്ചുള്ള അറിയിപ്പ്"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"സാധാരണയുള്ളതിലും നേരത്തെ ബാറ്ററിയുടെ ചാർജ് തീർന്നേക്കാം"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ബാറ്ററി ലൈഫ് വര്ദ്ധിപ്പിക്കാൻ, ബാറ്ററി ലാഭിക്കൽ സജീവമാക്കി"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ഫോള്ഡര്"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android ആപ്പ്"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ഫയൽ"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 101ef35..6a6974d 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi дуудлага"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Идэвхгүй"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi давуу эрхтэй"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Мобайл давуу эрхтэй"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Зөвхөн Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: дамжуулагдаагүй"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Алдаа мэдээлэх"</string>
<string name="global_action_logout" msgid="935179188218826050">"Гаргах харилцан үйлдэл"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Дэлгэцийн зураг дарах"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Алдааны тайлан авах"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Энэ таны төхөөрөмжийн одоогийн статусын талаарх мэдээллийг цуглуулах ба имэйл мессеж болгон илгээнэ. Алдааны мэдэгдлээс эхэлж илгээхэд бэлэн болоход хэсэг хугацаа зарцуулагдана тэвчээртэй байна уу."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактив тайлан"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Үүнийг ихэнх тохиолдолд ашиглана уу. Энэ нь танд тайлангийн явцыг хянах, асуудлын талаар дэлгэрэнгүй мэдээлэл оруулах болон дэлгэцийн агшин авахыг зөвшөөрнө. Мөн тайлагнахад урт хугацаа шаарддаг таны бага ашигладаг зарим хэсгийг алгасах болно."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Байршил"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"энэ төхөөрөмжийн байршилд хандалт хийх"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-д энэ төхөөрөмжийн байршилд хандахыг зөвшөөрөх үү?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Та аппыг зөвхөн хэрэглэж байгаа үед апп нь байршилд хандах болно."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-д энэ төхөөрөмжийн байршилд хандахыг байнга зөвшөөрөх үү?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Та энэ аппыг хэрэглээгүй байсан ч апп нь байршилд үргэлж хандах болно."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Хуанли"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"Хуанли руу хандах"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-д таны календарьт хандахыг зөвшөөрөх үү?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-д таны хөгжимд хандахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Зураг & видео"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"зураг & видеондоо хандах"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-д таны зураг, видео болон шошголсон байршилд хандахыг зөвшөөрөх үү?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Цонхны агуулгыг авах"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Таны харилцан үйлчлэх цонхны контентоос шалгах."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Хүрч танихыг асаах"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Апп нь Ойролцоо Талбарын Холболт(NFC) таг, карт, болон уншигчтай холбогдох боломжтой."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"дэлгэцний түгжээг идэвхгүй болгох"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Апп нь түгжээ болон бусад холбоотой нууц үгийн аюулгүй байдлыг идэвхгүй болгох боломжтой. Жишээ нь бол утас нь дуудлага ирэх үед түгжээг идэвхгүй болгох ба дуудлага дуусахад буцаан идэвхтэй болгодог."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"дэлгэцийн түгжээний төвөгтэй байдлын хүсэлт тавих"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Аппад дэлгэцийн түгжээний боломжтой уртын хэмжээ болон төрлийг заадаг дэлгэцийн түгжээний төвөгтэй байдлын түвшнийг (өндөр, дундаж, бага эсвэл байхгүй) мэдэж авахыг зөвшөөрдөг. Түүнчлэн, апп хэрэглэгчдэд дэлгэцийн түгжээг тодорхой түвшинд шинэчлэхийг санал болгодог хэдий ч хэрэглэгч үүнийг чөлөөтэй үл хэрэгсэж, орхих боломжтой. Дэлгэцийн түгжээг ил бичвэрээр хадгалдаггүй тул апп тодорхой нууц үгийг мэддэггүй болохыг анхаарна уу."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"биометрийн техник хангамжийг ашиглах"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Aппад биометрийн техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"хурууны хээний програм хангамжийг удирдах"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Аппад царайны загварыг ашиглахын тулд нэмэх эсвэл устгах аргыг идэвхжүүлэхийг зөвшөөрдөг."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"царай танилтын техник хангамжийг ашиглах"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Аппад царай танилтын техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Царайг таньж чадсангүй. Дахин оролдоно уу."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Царай хэт цайвар байна. Гэрэл багатай газар оролдож үзнэ үү."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Царай хэт бараан байна. Гэрэлтэй газар туршиж үзнэ үү."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Мэдрэгчийг царайнаас холдуулна уу."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Mэдрэгчийг царайтай ойртуулна уу."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Мэдрэгчийг дээшлүүлнэ үү."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Mэдрэгчийг доошлуулна уу."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Мэдрэгчийг баруун тийш болгоно уу."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Мэдрэгчийг зүүн тийш болгоно уу."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Мэдрэгч рүү харна уу."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Царай олдсонгүй."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Хэт их хөдөлгөөнтэй байна."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Нүүрээ дахин бүртгүүлнэ үү."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Өөр нүүр илрүүллээ."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Хэт адилхан байгаа тул байрлалаа өөрчилнө үү."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Камер луу аль болох эгц харна уу."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Камер луу аль болох эгц харна уу."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Толгойгоо босоо чиглэлд тэгшилнэ үү."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Нүүрээ ил гаргана уу."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Царайны техник хангамж боломжгүй байна."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Царай таниулах хугацаа дууслаа. Дахин оролдоно уу."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Царайг хадгалах боломжгүй байна."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Царайны үйл ажиллагааг цуцаллаа."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Хэрэглэгч царайгаар баталгаажуулахыг цуцалсан байна."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Хэт олон удаа оролдлоо. Дараа дахин оролдоно уу."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Хэт олон удаа оролдлоо. Царай танилтыг идэвхгүй болголоо."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Дахин оролдоно уу."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Бүртгүүлсэн царай алга."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Энэ төхөөрөмжид нүүр баталгаажуулах мэдрэгч алга."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Царай <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g>-г нээх"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g>-г хадгалахгүйгээр хаана"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> санах ойн хязгаараас давсан"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Багтаамж хэтэрсэн байна. Хуваалцахын тулд товшино уу."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Хэт их хуримтлагдсан мэдээллийг хуваалцах уу?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Энэ үйл явц <xliff:g id="PROC">%1$s</xliff:g> нь үйл ажиллагааны санах ойн хязгаар болох <xliff:g id="SIZE">%2$s</xliff:g> хэмжээг давсан байна. Та хэт их хуримтлагдсан мэдээллийг тэдгээрийн өөрсдийнх нь хөгжүүлэгчтэй хуваалцах боломжтой. Болгоомжтой байгаарай: энэхүү хэт их хуримтлагдсан мэдээлэлд аппликейшнаас нэвтрэх боломжтой таны хувийн мэдээлэл агуулагдсан байж болно."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Текст илгээх үйлдлийг сонгох"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Хонхны аяны хэмжээ"</string>
<string name="volume_music" msgid="5421651157138628171">"Медиа дууны түвшин"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бүх сүлжээг харахын тулд товшино уу"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Холбогдох"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Бүх сүлжээ"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g>-н санал болгож буй Wi-Fi сүлжээ боломжтой байна"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Та <xliff:g id="NAME">%s</xliff:g>-н санал болгож буй сүлжээнд холбогдох уу?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Тийм"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Үгүй"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматаар асна"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Сүлжээнд нэвтэрнэ үү"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi-д интернет хандалт алга"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Сонголт хийхийн тулд товшино уу"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Холбогдсон"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Таны сүлжээний цэгийн тохиргооны өөрчлөлт"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Таны сүлжээний цэгийн зурвасыг өөрчилсөн."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Энэ төхөөрөмж таны \"зөвхөн 5Гц\" гэсэн давуу сонголтыг дэмждэггүй. Үүний оронд энэ төхөөрөмж 5Гц зурвасыг боломжтой үед нь ашиглах болно."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB дебаг холбогдсон"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB дебаг хийхийг унтраахын тулд товшино уу"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB дебаг хийхийг идэвхгүй болгох бол сонгоно уу."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB порт дээрх шингэн зүйл эсвэл бохирдол"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB портыг автоматаар идэвхгүй болгосон байна. Дэлгэрэнгүй мэдээлэл авахын тулд товшино уу."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB портыг ашиглахад аюулгүй байна"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Ажлын профайлын түгжээг тайлахын тулд дарна уу"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g>-д холбогдсон"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Файлыг үзэхийн тулд дарна уу"</string>
- <string name="pin_target" msgid="3052256031352291362">"PIN"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Unpin"</string>
<string name="app_info" msgid="6856026610594615344">"Апп-н мэдээлэл"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Жишээг эхлүүлж байна…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Хэвшлийн горимын мэдээллийн мэдэгдэл"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарей ихэвчлэн цэнэглэдэг хугацаанаас өмнө дуусаж болзошгүй"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Батарейны ажиллах хугацааг уртасгахын тулд Батарей хэмнэгчийг идэвхжүүллээ"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Фолдер"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Андройд апп"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 98b64e9..61739ef7 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Panggilan Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Mati"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi diutamakan"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mudah alih diutamakan"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi sahaja"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Tidak dimajukan"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Laporan pepijat"</string>
<string name="global_action_logout" msgid="935179188218826050">"Tamatkan sesi"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Tangkapan skrin"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Ambil laporan pepijat"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Ini akan mengumpul maklumat tentang keadaan peranti semasa anda untuk dihantarkan sebagai mesej e-mel. Harap bersabar, mungkin perlu sedikit masa untuk memulakan laporan sehingga siap untuk dihantar."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Laporan interaktif"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Gunakan laporan ini dalam kebanyakan keadaan. Anda boleh menjejak kemajuan laporan, memasukkan butiran lanjut tentang masalah tersebut dan mengambil tangkapan skrin. Laporan ini mungkin meninggalkan beberapa bahagian yang kurang digunakan, yang mengambil masa lama untuk dilaporkan."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokasi"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"mengakses lokasi peranti ini"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses lokasi peranti ini?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Apl ini hanya dapat mengakses lokasi semasa anda menggunakan apl tersebut."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Sentiasa benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses lokasi peranti ini?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Apl ini akan dapat mengakses lokasi pada sepanjang masa, meskipun apabila anda tidak menggunakan apl tersebut."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"mengakses kalendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses kalendar anda?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses muzik anda?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Foto & video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"akses foto & video anda"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses foto dan video anda, termasuk lokasi yang ditandai?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dapatkan kembali kandungan tetingkap"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Periksa kandungan tetingkap yang berinteraksi dengan anda."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Hidupkan Jelajah melalui Sentuhan"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Membenarkan apl berkomunikasi dengan teg, kad dan pembaca Komunikasi Medan Dekat (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"lumpuhkan kunci skrin anda"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Membenarkan apl melumpuhkan kunci kekunci dan sebarang keselamatan kata laluan yang berkaitan. Sebagai contoh, telefon melumpuhkan kunci kekunci apabila menerima panggilan telefon masuk kemudian mendayakan semula kunci kekunci apabila panggilan selesai."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"minta kerumitan kunci skrin"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Membenarkan apl mengetahui tahap kerumitan kunci skrin (tinggi, sederhana, rendah atau tiada) yang menunjukkan julat panjang dan jenis kunci skrin yang berkemungkinan. Apl juga boleh mencadangkan kepada pengguna supaya mengemas kini kunci skrin pada tahap tertentu namun pengguna boleh mengabaikan dan menavigasi keluar dengan bebas. Sila ambil perhatian bahawa kunci skrin tidak disimpan dalam teks biasa, maka apl tidak mengetahui kata laluan yang tepat."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"gunakan perkakasan biometrik"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Membenarkan apl menggunakan perkakasan biometrik untuk pengesahan"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"urus perkakasan cap jari"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Membenarkan apl menggunakan kaedah untuk menambahkan dan memadamkan templat wajah untuk digunakan."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gunakan perkakasan pengesahan wajah"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Membenarkan apl menggunakan perkakasan pengesahan wajah untuk pengesahan"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Tidak dapat memproses wajah. Sila cuba lagi."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Wajah terlalu cerah. Cuba dlm cahaya lebih rendah."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Wajah terlalu gelap. Sila buka sumber cahaya."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Sila alihkan penderia lebih jauh dari wajah."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Sila dekatkan penderia ke wajah."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Sila alihkan penderia ke kedudukan lebih tinggi."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Sila alihkan penderia ke kedudukan lebih rendah."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Sila alihkan penderia ke kanan."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Sila alihkan penderia ke kiri."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Sila lihat penderia."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Tiada wajah dikesan."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Terlalu banyak gerakan."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Sila daftarkan semula wajah anda."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Wajah yang berbeza dikesan."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Terlalu serupa, sila ubah lagak gaya anda."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Sila lihat terus pada kamera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Sila lihat terus pada kamera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Sila tegakkan kepala anda."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Sila dedahkan wajah anda."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Perkakasan wajah tidak tersedia."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Tamat masa wajah dicapai. Cuba lagi."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Wajah tidak dapat disimpan."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Pengendalian wajah dibatalkan."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Pengesahan wajah dibatalkan oleh pengguna."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percubaan. Cuba sebentar lagi."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Terlalu banyak percubaan. Pengesahan wajah dilumpuhkan."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Cuba lagi."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Tiada wajah didaftarkan."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Peranti ini tiada penderia pengesahan wajah."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Wajah <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Buka <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> akan ditutup tanpa menyimpan"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> melebihi had memori"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Longgokan timbunan dikumpulkan. Ketik untuk berkongsi."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Kongsikan longgokan timbunan?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Proses <xliff:g id="PROC">%1$s</xliff:g> telah melebihi had memori proses sebanyak <xliff:g id="SIZE">%2$s</xliff:g>. Longgokan timbunan tersedia untuk anda kongsikan dengan pembangun aplikasi. Sila berhati-hati: longgokan timbunan ini boleh mengandungi sebarang maklumat peribadi anda yang boleh diakses oleh aplikasi itu."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Pilih tindakan untuk teks"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Kelantangan pendering"</string>
<string name="volume_music" msgid="5421651157138628171">"Kelantangan media"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ketik untuk melihat semua rangkaian"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Sambung"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Semua rangkaian"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Rangkaian Wi‑Fi yang dicadangkan oleh <xliff:g id="NAME">%s</xliff:g> tersedia"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Adakah anda mahu menyambung ke rangkaian yang dicadangkan oleh <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ya"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Tidak"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi akan dihidupkan secara automatik"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Log masuk ke rangkaian"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tiada akses Internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ketik untuk mendapatkan pilihan"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Disambungkan"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Perubahan kepada tetapan tempat liputan anda"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Jalur tempat liputan anda telah berubah."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Peranti ini tidak menyokong pilihan anda untuk 5GHz sahaja. Sebaliknya, peranti ini akan menggunakan jalur 5GHz apabila tersedia."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Penyahpepijatan USB disambungkan"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Ketik untuk mematikan penyahpepijatan USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Pilih untuk melumpuhkan penyahpepijatan USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Cecair atau serpihan dalam port USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Port USB dilumpuhkan secara automatik. Ketik untuk mengetahui lebih lanjut."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Selamat untuk menggunakan port USB"</string>
@@ -1396,8 +1447,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Sediakan"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Tanggalkan"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Teroka"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Tukar output"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> tiada"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Masukkan peranti sekali lagi"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Mengalihkan <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1906,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Ketik utk membuka profil kerja"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Disambungkan ke <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Ketik untuk melihat fail"</string>
- <string name="pin_target" msgid="3052256031352291362">"Semat"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Nyahsemat"</string>
<string name="app_info" msgid="6856026610594615344">"Maklumat apl"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Memulakan tunjuk cara…"</string>
@@ -1998,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Pemberitahuan maklumat Mod Rutin"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateri mungkin habis sebelum pengecasan biasa"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Penjimat Bateri diaktifkan untuk memanjangkan hayat bateri"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplikasi Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fail"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 09e963f..c45cf05 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"WiFi ခေါ်ဆိုမှု"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ပိတ်ထားရသည်"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ဝိုင်ဖိုင်အား ပိုနှစ်သက်သော"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"မိုဘိုင်းကို အသုံးပြုလိုပါသည်"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"ကြိုးမဲ့အင်တာနက် သာလျှင်"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ထပ်ဆင့်မပို့နိုင်ပါ"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်း"</string>
<string name="global_action_logout" msgid="935179188218826050">"သတ်မှတ်ပေးထားသည့်အချိန် ပြီးဆုံးပြီ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"ချွတ်ယွင်းမှုမှတ်တမ်း ယူခြင်း"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"သင့်ရဲ့ လက်ရှိ စက်အခြေအနေ အချက်အလက်များကို အီးမေးလ် အနေဖြင့် ပေးပို့ရန် စုဆောင်းပါမည်။ အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းမှ ပေးပို့ရန် အသင့်ဖြစ်သည်အထိ အချိန် အနည်းငယ်ကြာမြင့်မှာ ဖြစ်သဖြင့် သည်းခံပြီး စောင့်ပါရန်"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"လက်ငင်းတုံ့ပြန်နိုင်သည့် အစီရင်ခံချက်"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"အခြေအနေတော်တော်များများတွင် ၎င်းကိုအသုံးပြုပါ။ ၎င်းသည် အစီရင်ခံစာကို မှတ်သားခြင်း၊ ပြဿနာအကြောင်း နောက်ထပ်အသေးစိတ်များကို ထည့်သွင်းခြင်းနှင့် မျက်နှာပြင်ပုံဖမ်းယူခြင်းတို့ကို ပြုလုပ်ခွင့်ပေးပါသည်။ ပေးပို့ရန် အလွန်ကြာပြီး အသုံးပြုခြင်းနည်းပါးသည့်အပိုင်းကို ၎င်းက ချန်ခဲ့နိုင်ပါသည်။"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"တည်နေရာ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ဤစက်ပစ္စည်း၏ တည်နေရာကို ရယူရန်"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား ဤစက်ပစ္စည်း၏တည်နေရာကို သုံးခွင့်ပေးလိုပါသလား။"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"အက်ပ်ကိုအသုံးပြုသည့် အချိန်တွင်သာ ၎င်းကတည်နေရာကို အသုံးပြုခွင့်ရပါမည်။"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား ဤစက်ပစ္စည်း၏တည်နေရာကို အမြဲ အသုံးပြုခွင့်ပေးလိုပါသလား။"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"သင် အက်ပ်ကိုအသုံးပြုမနေသော်လည်း ၎င်းကတည်နေရာကို အမြဲ အသုံးပြုခွင့်ရနေပါမည်။"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ပြက္ခဒိန်"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"သင့်ပြက္ခဒိန်အား ဝင်ရောက်သုံးရန်"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင်၏ပြက္ခဒိန်ကို သုံးခွင့်ပေးလိုပါသလား။"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင့်တေးဂီတကို ဝင်ခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ဓာတ်ပုံများနှင့် ဗီဒီယိုများ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"သင့်ဓာတ်ပုံနှင့် ဗီဒီယိုများသို့ ဝင်သည်"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"တဂ်လုပ်ထားသည့် တည်နေရာများအပါအဝင် သင့်ဓာတ်ပုံနှင့် ဗီဒီယိုများကို <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား ဝင်ကြည့်ခွင့်ပေးလိုပါသလား။"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ဝင်းဒိုးတွင် ပါရှိသည်များကို ပြန်လည်ရယူရန်"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"သင်အသုံးပြုနေသော ဝင်းဒိုးတွင် ပါရှိသည်များကို ကြည့်ရှုစစ်ဆေးသည်။"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"တို့ထိခြင်းဖြင့် ရှာဖွေမှုကို ဖွင့်ရန်"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"အက်ပ်အား တာတို စက်ကွင်း ဆက်သွယ်ရေး (NFC) တဲဂ်များ၊ ကဒ်များ နှင့် ဖတ်ကြသူတို့နှင့် ဆက်သွယ်ပြောဆိုခွင့် ပြုသည်။"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ဖန်သားပြင် သော့ချခြင်းအား မလုပ်နိုင်အောင် ပိတ်ရန်"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"အပလီကေးရှင်းအား သော့ချခြင်းနှင့် သက်ဆိုင်ရာ စကားဝှက်သတ်မှတ်ခြင်းများအား မသုံးနိုင်အောင် ပိတ်ခြင်းကို ခွင့်ပြုရန်။ ဥပမာ ဖုန်းလာလျှင် သော့ပိတ်ခြင်း ပယ်ဖျက်ခြင်း၊ ဖုန်းပြောပြီးလျှင် သော့ကို အလိုအလျောက် ပြန်ပိတ်ခြင်း"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ဖုန်းမျက်နှာပြင် လော့ခ်ချရန် ရှုပ်ထွေးမှုအဆင့် တောင်းခံခြင်း"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"ဖုန်းမျက်နှာပြင်လော့ခ်၏ ရှုပ်ထွေးမှုအဆင့် (မြင့်၊ အလယ်အလတ်၊ နိမ့် သို့မဟုတ် မရှိ) အား လေ့လာရန် အက်ပ်ကို ခွင့်ပြုသည်။ ၎င်းက သတ်မှတ်ထားနိုင်သော ဖုန်းမျက်နှာပြင်လော့ခ်၏ စာလုံးရေနှင့် အမျိုးအစားကို ညွှန်ပြပေးသည်။ အသုံးပြုသူများအနေနှင့် ဖုန်းမျက်နှာပြင်လော့ခ်ကို အတိုင်းအတာတစ်ခုအထိ အဆင့်မြှင့်ရန် အက်ပ်က အကြံပြုနိုင်သည်။ သို့သော်လည်း အသုံးပြုသူများက ၎င်းကို ဂရုပြုမနေဘဲ လွတ်လပ်စွာ ကြည့်ရှုနိုင်ပါသည်။ ဖုန်းမျက်နှာပြင်လော့ခ်ကို စာသားအတိုင်း သိမ်းမထားသဖြင့် အက်ပ်သည် စကားဝှက်အစစ်ကို မသိနိုင်ကြောင်း သတိပြုပါ။"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ဇီဝဗေဒဆိုင်ရာ အချက်အလက်သုံး ကွန်ပျူတာဆိုင်ရာ စက်ပစ္စည်းကို အသုံးပြုရန်"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"အထောက်အထားစိစစ်ခြင်းအတွက် ဇီဝဗေဒဆိုင်ရာ သတင်းအချက်အလက်များသုံးသည့် ကွန်ပျူတာဆိုင်ရာ စက်ပစ္စည်းကို အသုံးပြုရန် အက်ပ်ကို ခွင့်ပြုသည်"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"လက်ဗွေရာပစ္စည်းကို စီမံမည်"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"အသုံးပြုရန်အတွက် မျက်နှာပုံစံထည့်ရန် (သို့) ဖျက်ရန်နည်းလမ်းကို အက်ပ်အား သုံးခွင့်ပြုသည်။"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို သုံးပါ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"မျက်နှာကို မမှတ်မိပါ။ ထပ်လုပ်ကြည့်ပါ။"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"မျက်နှာအလွန်လင်းနေသည်။ အလင်းလျှော့ပြီး စမ်းကြည့်ပါ။"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"မျက်နှာအလွန်မှောင်နေသည်။ ပြတင်းပေါက်ဖွင့်လိုက်ပါ။"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"အာရုံခံကိရိယာကို မျက်နှာနှင့် ခွာလိုက်ပါ။"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"အာရုံခံကိရိယာကို မျက်နှာအနီး ရွှေ့လိုက်ပါ။"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"အာရုံခံကိရိယာကို ပိုမြင့်အောင်ထားပါ။"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"အာရုံခံကိရိယာကို ပိုနိမ့်အောင်ထားပါ။"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"အာရုံခံကိရိယာကို ညာဘက်သို့ ရွှေ့ပါ။"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"အာရုံခံကိရိယာကို ဘယ်ဘက်သို့ ရွှေ့ပါ။"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"အာရုံခံကိရိယာကို ကြည့်ပါ။"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"မျက်နှာတစ်ခုမျှ မတွေ့ပါ။"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"လှုပ်ရှားမှု အလွန်များနေသည်။"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"သင့်မျက်နှာကို ပြန်စာရင်းသွင်းပါ။"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"မတူသည့် မျက်နှာ တွေ့ရှိထားသည်။"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"ဆင်တူနေသည်၊ အမူအရာ ပြောင်းပါ။"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"ကင်မရာကို တည့်တည့်ကြည့်ပါ။"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"ကင်မရာကို တည့်တည့်ကြည့်ပါ။"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"ခေါင်းမတ်မတ်ထားပါ။"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"မျက်နှာ ဖော်ထားပါ။"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"မျက်နှာ စက်ပစ္စည်း မရနိုင်ပါ။"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"မျက်နှာ သက်တမ်းကုန်သွားပါပြီ။ ထပ်စမ်းကြည့်ပါ။"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"မျက်နှာကို သိမ်း၍မရပါ။"</string>
<string name="face_error_canceled" msgid="283945501061931023">"မျက်နှာ ဆောင်ရွက်ခြင်းကို ပယ်ဖျက်လိုက်ပါပြီ။"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"အသုံးပြုသူက မျက်နှာအထောက်အထားစိစစ်မှု မလုပ်တော့ပါ။"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ နောက်မှထပ်စမ်းပါ။"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ ပိတ်လိုက်ပါပြီ။"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"ထပ်စမ်းကြည့်ပါ။"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"စာရင်းသွင်းထားသည့် မျက်နှာတစ်ခုမျှ မရှိပါ။"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"ဤစက်တွင် မျက်နှာအထောက်အထားစိစစ်ခြင်း အာရုံခံကိရိယာမရှိပါ။"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"မျက်နှာ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> ကို ဖွင့်ရန်"</string>
<string name="new_app_description" msgid="5894852887817332322">"မသိမ်းဘဲ <xliff:g id="OLD_APP">%1$s</xliff:g> ကို ပိတ်လိုက်ပါမည်"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> သိမ်းထားနိုင်မှု အကန့်အသတ် ကျော်လွန်နေ"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"သိမ်းဆည်းနိုင်မှု ပမာဏကျော်လွန်သွားပါပြီ။ မျှဝေရန် တို့ပါ။"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"အရေးပေါ် သိမ်းထားပေးမှု ကို မျှဝေမလား။"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> လုပ်ဆောင်နိုင်မှုသည် <xliff:g id="SIZE">%2$s</xliff:g>ရှိသည့် သိမ်းထားနိုင်မှု ပမာဏထက်ကျော်လွန်သွားသည်။ စက်လုပ်ဆောင်ရည်မြင့်တင်ပေးသူနှင့် မျှဝေမှုလုပ်ရန် အရေးပေါ်သိမ်းထားပေးမှု ရမည်။"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"စာတိုအတွက် လုပ်ဆောင်ချက် ရေးပါ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ဖုန်းမြည်သံအတိုးအကျယ်"</string>
<string name="volume_music" msgid="5421651157138628171">"မီဒီယာအသံအတိုးအကျယ်"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ကွန်ရက်အားလုံးကို ကြည့်ရန် တို့ပါ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ချိတ်ဆက်ရန်"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ကွန်ရက်အားလုံး"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> အကြံပြုထားသော Wi‑Fi ကွန်ရက်ကို ရရှိနိုင်ပါသည်"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"<xliff:g id="NAME">%s</xliff:g> အဆိုပြုထားသော ကွန်ရက်များသို့ ချိတ်ဆက်လိုပါသလား။"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ကို အလိုအလျောက် ပြန်ဖွင့်ပေးလိမ့်ပါမည်"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ကွန်ယက်သို့ လက်မှတ်ထိုးဝင်ရန်"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi တွင် အင်တာနက်ချိတ်ဆက်မှု မရှိပါ"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"အခြားရွေးချယ်စရာများကိုကြည့်ရန် တို့ပါ"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"ချိတ်ဆက်ထားသည်"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"သင်၏ဟော့စပေါ့ ဆက်တင်များ ပြောင်းလဲမှု"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"သင်၏ ဟော့စပေါ့လိုင်း ပြောင်းသွားပါပြီ။"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ဤစက်ပစ္စည်းသည် သင်၏ 5GHz သီးသန့်ရွေးချယ်မှုအတွက် ပံ့ပိုးမထားပါ။ ၎င်းအစား ဤစက်ပစ္စည်းသည် ရနိုင်သည့်အခါ 5GHz လိုင်းကို သုံးသွားပါမည်။"</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB အမှားရှာပြင်စနစ် ချိတ်ဆက်ထားသည်"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB အမှားရှာပြင်ခြင်းကို ပိတ်ရန် တို့ပါ"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ဖြင့် အမှားရှာပြင်ခြင်းကို ပိတ်ရန် ရွေးပါ။"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB ပို့တ်တွင် အရည် သို့မဟုတ် အမှိုက်စ ရှိနေသည်"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB ပို့တ်ကို အလိုအလျောက် ပိတ်ထားသည်။ ပိုမိုလေ့လာရန် တို့ပါ။"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB ပို့တ်ကို စိတ်ချစွာ သုံးနိုင်ပါပြီ"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"သင့်အလုပ်ပရိုဖိုင်ကို သော့ဖွင့်ရန် တို့ပါ"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> ချိတ်ဆက်ထားသည်"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ဖိုင်များကိုကြည့်ရန် တို့ပါ"</string>
- <string name="pin_target" msgid="3052256031352291362">"တွဲပါ"</string>
- <string name="unpin_target" msgid="3556545602439143442">"ဖြုတ်ပါ"</string>
<string name="app_info" msgid="6856026610594615344">"အက်ပ်အချက်အလက်"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"သရုပ်ပြချက်ကို စတင်နေသည်…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ပုံမှန်မုဒ်အတွက် အချက်အလက်ပြသည့် အကြောင်းကြားချက်"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ပုံမှန်အားသွင်းမှုမပြုလုပ်မီ ဘက်ထရီကုန်သွားနိုင်သည်"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ဘက်ထရီသက်တမ်းကို တိုးမြှင့်ရန် \'ဘက်ထရီအားထိန်း\' စတင်ပြီးပါပြီ"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ဖိုင်တွဲ"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android အပလီကေးရှင်း"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ဖိုင်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 1aced28..02efec6 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi-anrop"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Av"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi er foretrukket"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Først-på-mobil"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Bare Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderekoblet"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Feilrapport"</string>
<string name="global_action_logout" msgid="935179188218826050">"Avslutt økten"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skjermdump"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Utfør feilrapport"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Informasjon om tilstanden til enheten din samles inn og sendes som en e-post. Det tar litt tid fra du starter feilrapporten til e-posten er klar, så vær tålmodig."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv rapport"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Bruk dette alternativet i de fleste tilfeller. Da kan du spore fremgangen for rapporten, skrive inn flere detaljer om problemet samt ta skjermdumper. Noen deler som tar lang tid å behandle, blir kanskje utelatt."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Posisjon"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"få tilgang til enhetens plassering"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vil du gi <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilgang til denne enhetens posisjon?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Appen får bare tilgang til posisjonen når du bruker appen."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Vil du alltid gi <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilgang til denne enhetens posisjon?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Appen får alltid tilgang til posisjonen, selv når du ikke bruker appen."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"åpne kalenderen din"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vil du gi <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilgang til kalenderen din?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vil du gi <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilgang til musikken din?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Bilder og videoer"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"få tilgang til bildene og videoene dine"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vil du gi <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilgang til bildene og videoene dine, inkludert merkede steder?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"hente innhold i vinduer"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Appen analyserer innholdet i vinduer du samhandler med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"slå på berøringsutforsking"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Lar appen kommunisere med etiketter, kort og lesere som benytter NFC-teknologi."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"deaktivere skjermlåsen"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Lar appen deaktivere tastelåsen og eventuell tilknyttet passordsikkerhet. Et eksempel er at telefonen deaktiverer tastelåsen når du mottar et innkommende anrop, og deretter aktiverer tastelåsen igjen når samtalen er ferdig."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"be om skjermlåsens kompleksitet"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Lar appen lære skjermlåsens kompleksitetsnivå (høy, middels, lav eller ingen), som indikerer det mulige området for lengde og type skjermlås. Appen kan foreslå at brukeren oppdaterer skjermlåsen til et bestemt nivå, men brukere kan velge å ignorere dette og navigere bort. Vær oppmerksom på at skjermlåsen ikke er lagret i klartekst, så appen kan ikke se det nøyaktige passordet."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"bruke biometrisk maskinvare"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Lar appen bruke biometrisk maskinvare til godkjenning"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"administrere fingeravtrykkmaskinvare"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Lar appen bruke metoder for å legge til og slette ansiktmaler for bruk."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"bruke maskinvare for ansiktsautentisering"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Lar appen bruke maskinvare for ansiktsautentisering til autentisering"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Kunne ikke behandle ansiktet. Prøv igjen."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Ansiktet er for lyst. Prøv med svakere lys."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Ansiktet er for mørkt. Bruk en lyskilde."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Flytt sensoren lengre vekk fra ansiktet."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Hold sensoren nærmere ansiktet."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Flytt sensoren opp."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Flytt sensoren ned."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Flytt sensoren til høyre."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Flytt sensoren til venstre."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Se på sensoren."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Ingen ansikter er oppdaget."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"For mye bevegelse."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrer ansiktet ditt på nytt."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Et annet ansikt er gjenkjent."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"For likt – endre posituren din."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Se mer direkte mot kameraet."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Se mer direkte mot kameraet."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Rett hodet ditt vertikalt."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Ikke skjul ansiktet ditt."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Maskinvare for ansikt er ikke tilgjengelig."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Tidsavbrudd for ansikt er nådd. Prøv igjen."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Ansiktet kan ikke lagres."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Ansikt-operasjonen ble avbrutt."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Ansiktsautentiseringen ble avbrutt av brukeren."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"For mange forsøk. Prøv igjen senere."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"For mange forsøk. Ansiktsautentisering er slått av."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Prøv igjen."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Ingen ansikt er registrert."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Denne enheten har ikke sensor for ansiktsautentisering."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Ansikt <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Åpne <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> lukkes uten å lagre"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> er over minnegrensen"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Minnedumpen er samlet inn. Trykk for å dele."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vil du dele minnedumpen («heap dump»)?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g>-prosessen er <xliff:g id="SIZE">%2$s</xliff:g> over grensen for prosessminne. En minnedump («heap dump») er tilgjengelig for deling med utvikleren. Vær forsiktig – denne minnedumpen kan inneholde noen av de personlige opplysningene dine som appen har tilgang til."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Velg handling for tekst"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringetonevolum"</string>
<string name="volume_music" msgid="5421651157138628171">"Medievolum"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trykk for å se alle nettverkene"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Koble til"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle nettverk"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Et Wi‑Fi-nettverkt som ble foreslått av <xliff:g id="NAME">%s</xliff:g>, er tilgjengelig"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Vil du koble til nettverkene som foreslås av <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nei"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi slås på automatisk"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Logg på nettverk"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi har ikke Internett-tilgang"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Trykk for å få alternativer"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Tilkoblet"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Endres til innstillingene dine for Wi-Fi-soner"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Båndet ditt for Wi-Fi-sone er endret."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Denne enheten støtter ikke innstillingen din for bare 5 GHz. I stedet bruker enheten 5 GHz-båndet når det er tilgjengelig."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-feilsøking tilkoblet"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Trykk for å slå av USB-feilsøking"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Velg for å deaktivere USB-debugging."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Væske eller rusk i USB-porten"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-porten deaktiveres automatisk. Trykk for å finne ut mer."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Trygt å bruke USB-porten"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Trykk for å låse opp jobbprofilen"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Koblet til <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Trykk for å se filer"</string>
- <string name="pin_target" msgid="3052256031352291362">"Fest"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Løsne"</string>
<string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Starter demo …"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Varsel med informasjon om rutinemodus"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batteriet kan gå tomt før den vanlige ladingen"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterisparing er aktivert for å forlenge batterilevetiden"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Mappe"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android-app"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fil"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 806e520..b51f4b541 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"WiFi कलिङ"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"निष्क्रिय"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi मनपराइयो"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"रूचाइएको मोबाइल"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi मात्र"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अगाडि पठाइएको छैन"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"बग रिपोर्ट"</string>
<string name="global_action_logout" msgid="935179188218826050">"सत्रको अन्त्य गर्नुहोस्"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रिनसट"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"बग रिपोर्ट लिनुहोस्"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"एउटा इमेल सन्देशको रूपमा पठाउनलाई यसले तपाईँको हालैको उपकरणको अवस्थाको बारेमा सूचना जम्मा गर्ने छ। बग रिपोर्ट सुरु गरेदेखि पठाउन तयार नभएसम्म यसले केही समय लिन्छ; कृपया धैर्य गर्नुहोस्।"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"अन्तरक्रियामूलक रिपोर्ट"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"बढी भन्दा बढी परिस्थितिहरूमा यसको प्रयोग गर्नुहोस्। यसले तपाईँलाई रिपोर्टको प्रगति ट्र्याक गर्न, समस्याका बारे थप विवरणहरू प्रविष्ट गर्न र स्क्रिनसटहरू लिन अनुमति दिन्छ। यसले रिपोर्ट गर्न लामो समय लिने केही कम प्रयोग हुने खण्डहरूलाई समावेश नगर्न सक्छ।"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"यस यन्त्रको स्थानमाथि पहुँच"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई यो यन्त्रको स्थानमाथि पहुँच राख्न दिने हो?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"तपाईं उक्त अनुप्रयोग प्रयोग गरिरहेका बेलामा त्यससँग स्थानमाथिको पहुँच रहने छ।"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई यो यन्त्रको स्थानमाथि पहुँच राख्न दिने हो?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"तपाईं उक्त अनुप्रयोग प्रयोग नगरिरहेका बेलामा पनि त्यससँग स्थानमाथिको पहुँच रहने छ।"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"पात्रो"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"तपाईंको पात्रोमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई आफ्नो पात्रोमाथि पहुँच राख्न दिने हो?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई तपाईंको सङ्गीतमाथि पहुँच राख्न दिने हो?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"तस्बिर तथा भिडियोहरू"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"आफ्नो तस्बिर & भिडियोहरूमाथि पहुँच राख्नुहोस्"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई ट्याग गरिएका स्थानहरूलगायत तपाईंका तस्बिर तथा भिडियोहरूमाथि पहुँच गर्न दिने हो?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोएर गरिने खोजलाई सुचारु गर्नुहोस्"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"अनुप्रयोगलाई नयाँ क्षेत्र संचार (NFC) ट्यागहरू, कार्डहरू र पाठकहरूसँग अन्तर्क्रिया गर्न अनुमति दिन्छ।"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"स्क्रिन लक असक्षम पार्नुहोस्"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"कुनै सम्बन्धित पासवर्ड सुरक्षा र किलकलाई असक्षम पार्न अनुप्रयोगलाई अनुमति दिन्छ। उदाहरणको लागि, अन्तर्गमन फोन कल प्राप्त गर्दा फोनले किलकलाई असक्षम पार्छ, त्यसपछि कल सकिएको बेला किलक पुनःसक्षम पार्छ।"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"स्क्रिन लकको जटिलतासम्बन्धी जानकारी प्राप्त गर्ने अनुरोध गर्नुहोस्"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"यसले अनुप्रयोगलाई स्क्रिन लकको जटिलताको स्तर (उच्च, मध्यम, न्यून वा कुनै पनि होइन) थाहा पाउने अनुमति दिन्छ जसले स्क्रिन लकको लम्बाइको सम्भावित दायरा र त्यसको प्रकारलाई जनाउँछ। यसै गरी, यो अनुप्रयोगले प्रयोगकर्ताहरूलाई स्क्रिन लक अद्यावधिक गर्ने सुझाव पनि दिन सक्छ तर प्रयोगकर्ताहरू उक्त सुझावको बेवास्ता गरी बाहिर निस्कन सक्छन्। स्क्रिन लकलाई सादा पाठको ढाँचामा भण्डारण नगरिने हुँदा यो अनुप्रयोगले वास्तविक पासवर्ड थाहा पाउँदैन भन्ने कुरा याद राख्नुहोस्।"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"बायोमेट्रिक हार्डवेयर प्रयोग गर्नुहोस्"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"अनुप्रयोगलाई प्रमाणीकरणका लागि बायोमेट्रिक हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"औठाछाप हार्डवेयर व्यवस्थापन गर्नुहोस्"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"अनुप्रयोगलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"अनुहार प्रमाणिकरण हार्डवेयर प्रयोग गर्नुहोस्"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"अनुप्रयोगलाई प्रमाणीकरणका लागि अनुहार प्रमाणीकरण हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"अनुहार प्रशोधन गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"अनुहारमा धेरै उज्यालो छ। कृपया कम प्रकाशमा प्रयास गर्नुहोस्।"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"अनुहार धेरै गाढा छ। कृपया प्रकाशको स्रोतको थप्नुहोस्।"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"कृपया अनुहारबाट सेन्सरलाई अलिक टाढा सार्नुहोस्।"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"कृपया अनुहारलाई सेन्सरको नजिक ल्याउनुहोस्।"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"कृपया सेन्सरलाई माथि सार्नुहोस्।"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"कृपया सेन्सरलाई तल सार्नुहोस्।"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"कृपया सेन्सरलाई दायाँतिर सार्नुहोस्।"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"कृपया सेन्सरलाई बायाँतिर सार्नुहोस्।"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"कृपया सेन्सरमा हेर्नुहोस्।"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"अनुहार पत्ता लागेन।"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"अत्यधिक हल्लियो।"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्।"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"अर्कै अनुहार पत्ता लाग्यो।"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"अनुहार उस्तै भयो, कृपया आफ्नो पोज बदल्नुहोस्।"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"कृपया आफ्नो अनुहार अझ सीधा पारेर क्यामेरामा हेर्नु"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"कृपया आफ्नो अनुहार अझ सीधा पारेर क्यामेरामा हेर्नु"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"कृपया आफ्नो अनुहार ठाडो रूपमा सीधा पार्नुहोस्।"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"कृपया आफ्नो अनुहार नढाक्नुहोस्।"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"अनुहार पहिचान गर्ने हार्डवेयर उपलब्ध छैन।"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"अनुहारको समय सकिएको छ। फेरि प्रयास गर्नुहोस्।"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"अनुहार भण्डारण गर्न सकिँदैन।"</string>
<string name="face_error_canceled" msgid="283945501061931023">"अनुहार पहिचान रद्द गरियो।"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"प्रयोगकर्ताले अनुहार प्रमाणीकरण रद्द गर्नु भयो।"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"धेरैपटक प्रयासहरू भए। पछि फेरि प्रयास गर्नुहोस्।"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"अत्यधिक धेरैपटक गलत प्रयासहरू भए। अनुहार प्रमाणिकरणलाई असक्षम पारियो।"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"फेरि प्रयास गर्नुहोस्।"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"कुनै पनि अनुहार दर्ता गरिएन।"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"यो यन्त्रमा अनुहार प्रमाणीकरण गर्ने कुनै पनि सेन्सर छैन।"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"अनुहार <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1219,9 +1252,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> खोल्नुहोस्"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> सुरक्षित नगरिकनै बन्द हुने छ"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ले मेमोरी सीमा नाघ्यो"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"हिप डम्प सङ्कलन गरियो, ट्याप गरेर आदान प्रदान गर्नुहोस्।"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"हिप डम्प साझेदारी गर्नुहुन्छ?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"प्रक्रिया <xliff:g id="PROC">%1$s</xliff:g>ले यसको प्रक्रिया मेमोरी सीमा <xliff:g id="SIZE">%2$s</xliff:g> नाघेको छ। तपाईँको लागि विकासकर्तासँग साझेदारी गर्न एउटा हिप डम्प उपलब्ध छ। होसियार हुनुहोस्: यो हिप डम्पमा अनुप्रयोगको पहुँच भएको तपाईँको कुनै पनि व्यक्तिगत जानकारी हुन सक्छ।"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"पाठको लागि एउटा प्रकार्य छान्नुहोस्"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"बजाउने मात्रा"</string>
<string name="volume_music" msgid="5421651157138628171">"मिडियाको आवाजको मात्रा"</string>
@@ -1260,8 +1300,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सबै नेटवर्कहरू हेर्न ट्याप गर्नुहोस्"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"जडान गर्नुहोस्"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सबै नेटवर्कहरू"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> ले प्रस्ताव गरेको Wi‑Fi नेटवर्क उपलब्ध छ"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले प्रस्ताव गरेका नेटवर्कहरूमा जोडिन चाहनुहुन्छ?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"हो"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"होइन"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi स्वतः सक्रिय हुनेछ"</string>
@@ -1273,9 +1315,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"सञ्जालमा साइन इन गर्नुहोस्"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi मार्फत इन्टरनेटमाथि पहुँच राख्न सकिँदैन"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"विकल्पहरूका लागि ट्याप गर्नुहोस्"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"जोडियो"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"तपाईंको हटस्पट सेटिङहरूमा परिवर्तन हुन्छ"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"तपाईंको हटस्पट ब्यान्ड परिवर्तन भएको छ।"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"यो यन्त्रले तपाईंको 5GHz मात्रको प्राथमिकतालाई समर्थन गर्दैन। बरु, उपलब्ध भएको खण्डमा यो यन्त्रले 5GHz ब्यान्ड प्रयोग गर्छ।"</string>
@@ -1360,6 +1407,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गर्ने सुविधा सुचारू छ"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB डिबग प्रक्रिया निष्क्रिय पार्न ट्याप गर्नुहोस्"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB डिबगिङलाई असक्षम पार्न ट्याप गर्नुहोस्।"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB पोर्टमा तरल पदार्थ वा धुलो भएको कुरा पत्ता लाग्यो"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB पोर्ट स्वतः असक्षम पारियो। थप जान्न ट्याप गर्नुहोस्।"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB पोर्ट प्रयोग गर्न सुरक्षित छ"</string>
@@ -1911,8 +1962,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"कार्य प्रोफाइल अनलक गर्न ट्याप गर्नुहोस्"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> मा जडान गरिएको छ"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"फाइलहरू हेर्न ट्याप गर्नुहोस्"</string>
- <string name="pin_target" msgid="3052256031352291362">"पिन गर्नुहोस्"</string>
- <string name="unpin_target" msgid="3556545602439143442">"अनपिन गर्नुहोस्"</string>
<string name="app_info" msgid="6856026610594615344">"अनुप्रयोगका बारे जानकारी"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"डेमो सुरु गर्दै…"</string>
@@ -2003,6 +2052,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"दिनचर्या मोडको जानकारीमूलक सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"प्रायः चार्ज गर्ने समय हुनुभन्दा पहिले नै ब्याट्री सकिन सक्छ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ब्याट्रीको आयु बढाउन ब्याट्री सेभर सक्रिय गरियो"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"फोल्डर"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android अनुप्रयोग"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"फाइल"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index f7482bc..bc55c45 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Bellen via wifi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Uit"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Voorkeur voor wifi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Voorkeur voor mobiel"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Alleen wifi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: niet doorgeschakeld"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Bugrapport"</string>
<string name="global_action_logout" msgid="935179188218826050">"Sessie beëindigen"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Bugrapport genereren"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Hiermee worden gegevens over de huidige status van je apparaat verzameld en als e-mail verzonden. Wanneer u een bugrapport start, duurt het even voordat het kan worden verzonden. Even geduld alstublieft."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactief rapport"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Gebruik deze optie in de meeste situaties. Hiermee kun je de voortgang van het rapport bijhouden, meer gegevens over het probleem opgeven en screenshots maken. Mogelijk worden bepaalde minder vaak gebruikte gedeelten weggelaten (waarvoor het lang zou duren om een rapport te genereren)."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Locatie"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"de locatie van dit apparaat openen"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang geven tot de locatie van dit apparaat?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"De app heeft alleen toegang tot de locatie wanneer je de app gebruikt."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> altijd toegang geven tot de locatie van dit apparaat?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"De app heeft altijd toegang tot de locatie, ook wanneer je de app niet gebruikt."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"toegang krijgen tot je agenda"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang geven tot je agenda?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang geven tot je muziek?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Foto\'s en video\'s"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"toegang tot je foto\'s en video\'s"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang geven tot je foto\'s en video\'s, waaronder getagde locaties?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Content van vensters ophalen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"De content inspecteren van een venster waarmee je interactie hebt."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\'Verkennen via aanraking\' inschakelen"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Hiermee kan de app communiceren met NFC-tags (Near Field Communication), kaarten en lezers."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"je schermvergrendeling uitschakelen"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Hiermee kan de app de toetsenblokkering en bijbehorende wachtwoordbeveiliging uitschakelen. Zo kan de telefoon de toetsenblokkering uitschakelen wanneer je wordt gebeld en de toetsenblokkering weer inschakelen als het gesprek is beëindigd."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"complexiteit van schermvergrendeling opvragen"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Hiermee krijgt de app toestemming om het complexiteitsniveau van de schermvergrendeling te achterhalen (hoog, midden, laag of geen). Dat geeft een indicatie van het mogelijke lengtebereik en type van de schermvergrendeling. De app kan gebruikers ook voorstellen de schermvergrendeling naar een bepaald niveau te updaten, maar gebruikers kunnen dit altijd negeren en de app verlaten. De schermvergrendeling wordt niet opgeslagen in platte tekst, zodat de app het precieze wachtwoord niet weet."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"biometrische hardware gebruiken"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Hiermee kan de app biometrische hardware gebruiken voor verificatie"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"Vingerafdrukhardware beheren"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Hiermee kan de app methoden aanroepen om gezichtstemplates toe te voegen en te verwijderen voor gebruik."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"hardware voor gezichtsherkenning gebruiken"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Hiermee kan de app hardware voor gezichtsherkenning gebruiken voor verificatie"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Kan gezicht niet verwerken. Probeer het opnieuw."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Gezicht is te helder. Probeer bij minder licht."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Gezicht is te donker. Laat meer licht toe."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Houd de sensor verder weg van je gezicht."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Houd de sensor dichter bij je gezicht."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Beweeg de sensor omhoog."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Beweeg de sensor omlaag."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Beweeg de sensor naar rechts."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Beweeg de sensor naar links."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Kijk naar de sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Geen gezicht gedetecteerd."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Te veel beweging."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registreer je gezicht opnieuw."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Ander gezicht gedetecteerd."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Lijkt te veel op elkaar. Verander je pose."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Kijk rechter in de camera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Kijk rechter in de camera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Houd je hoofd verticaal recht."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Laat je gezicht zien."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware voor gezichtsherkenning niet beschikbaar."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Time-out voor gezicht bereikt. Probeer opnieuw."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Gezicht kan niet worden opgeslagen."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Bewerking voor gezichtsherkenning geannuleerd."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Gezichtsverificatie geannuleerd door gebruiker."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogingen. Probeer het later opnieuw."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Te veel pogingen. Gezichtsherkenning inactief."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Probeer het opnieuw."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Geen gezicht geregistreerd."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Dit apparaat heeft geen sensor voor gezichtsherkenning."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Gezicht <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> openen"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> wordt gesloten zonder op te slaan"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> heeft geheugenlimiet overschreden"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump verzameld. Tik om te delen."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Heap dump delen?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Het proces <xliff:g id="PROC">%1$s</xliff:g> heeft de procesgeheugenlimiet overschreden met <xliff:g id="SIZE">%2$s</xliff:g>. Een heap dump is voor u beschikbaar om te delen met de betreffende ontwikkelaar. Let op: Deze heap dump kan persoonsgegevens bevatten waartoe de app toegang heeft."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Een actie voor tekst selecteren"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Belvolume"</string>
<string name="volume_music" msgid="5421651157138628171">"Mediavolume"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerken te bekijken"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Verbinding maken"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netwerken"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Er is een wifi-netwerk beschikbaar dat is voorgesteld door <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Wil je verbinding maken met netwerken die worden voorgesteld door <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nee"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wifi wordt automatisch ingeschakeld"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Inloggen bij netwerk"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wifi-netwerk heeft geen internettoegang"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tik voor opties"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Verbonden"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Wijzigingen in je hotspot-instellingen"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Je hotspot-band is gewijzigd."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Dit apparaat biedt geen ondersteuning voor je voorkeur voor alleen 5 GHz. In plaats daarvan gebruikt dit apparaat de 5-GHz-band wanneer deze beschikbaar is."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-foutopsporing verbonden"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tik om USB-foutopsporing uit te schakelen"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecteer deze optie om USB-foutopsporing uit te schakelen."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Vloeistof of vuil in USB-poort"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-poort is automatisch uitgeschakeld. Tik voor meer informatie."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Veilig om USB-poort te gebruiken"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Ontgrendel werkprofiel met tik"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Verbonden met <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Tik om bestanden te bekijken"</string>
- <string name="pin_target" msgid="3052256031352291362">"Vastzetten"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Losmaken"</string>
<string name="app_info" msgid="6856026610594615344">"App-info"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Demo starten…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Informatiemelding voor routinemodus"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"De batterij raakt mogelijk leeg voordat deze normaal gesproken wordt opgeladen"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterijbesparing is geactiveerd om de batterijduur te verlengen"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Map"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android-app"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Bestand"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 1607b40..eb7e6ae 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"ୱାଇଫାଇ କଲିଂ"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ଅଫ୍"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ପସନ୍ଦ କରାଯାଇଥିବା ୱାଇ-ଫାଇ"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ପସନ୍ଦର ମୋବାଇଲ୍"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"କେବଳ ୱାଇ-ଫାଇ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ଫରୱାର୍ଡ କରାଯାଇନାହିଁ"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ବଗ୍ ରିପୋର୍ଟ"</string>
<string name="global_action_logout" msgid="935179188218826050">"ସେସନ୍ ଶେଷ କରନ୍ତୁ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ସ୍କ୍ରୀନଶଟ୍"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"ବଗ୍ ରିପୋର୍ଟ ନିଅନ୍ତୁ"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"ଇ-ମେଲ୍ ମେସେଜ୍ ଭାବରେ ପଠାଇବାକୁ, ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଡିଭାଇସ୍ ବିଷୟରେ ଏହା ସୂଚନା ସଂଗ୍ରହ କରିବ। ବଗ୍ ରିପୋର୍ଟ ଆରମ୍ଭ ହେବାପରଠାରୁ ଏହାକୁ ପଠାଇବା ପାଇଁ କିଛି ସମୟ ଲାଗିବ, ଦୟାକରି ଧୈର୍ଯ୍ୟ ରଖନ୍ତୁ।"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ଇଣ୍ଟରାକ୍ଟିଭ୍ ରିପୋର୍ଟ"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"ଅଧିକାଂଶ କ୍ଷେତ୍ରରେ ଏହା ବ୍ୟବହାର କରନ୍ତୁ। ଏହାଦ୍ୱାରା ଆପଣ ରିପୋର୍ଟର ପ୍ରଗତିକୁ ଟ୍ରାକ୍ କରିପାରିବେ, ସମସ୍ୟା ଉପରେ ଅଧିକ ବିବରଣୀ ଲେଖିପାରିବେ ଏବଂ ସ୍କ୍ରୀନଶଟ୍ ନେଇପାରିବେ। ଏହା କିଛି କମ୍-ବ୍ୟବହାର କରାଯାଇଥିବା ବିଭାଗକୁ ଛାଡ଼ିଦେଇପାରେ, ଯାହା ରିପୋର୍ଟ କରିବାକୁ ଅଧିକ ସମୟ ନିଏ।"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ଲୋକେଶନ୍"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ଏହି ଡିଭାଇସ୍ର ଲୋକେଶନ୍ ଆକ୍ସେସ୍ କରେ"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଏହି ଡିଭାଇସ୍ର ଲୋକେଶନ୍ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ଆପଣ ଆପ୍ ବ୍ୟବହାର କରୁଥିବା ବେଳେ କେବଳ ଲୋକେସନ୍କୁ ଆପ୍ର ଆକ୍ସେସ୍ ରହିବ।"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ସଦାବେଳେ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଏହି ଡିଭାଇସ୍ର ଲୋକେସନ୍ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ଆପଣ ଆପ୍ ବ୍ୟବହାର କରୁନଥିଲେ ମଧ୍ୟ, ଲୋକେସନ୍କୁ ସଦାବେଳେ ଆପ୍ର ଆକ୍ସେସ୍ ରହିବ।"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"କ୍ୟାଲେଣ୍ଡର୍"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର୍ ଆକ୍ସେସ୍ କରେ"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର୍କୁ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ଆପଣଙ୍କ ସଙ୍ଗୀତକୁ ଆକ୍ସେସ୍ କରିବାକୁ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>କୁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ଫଟୋ ଓ ଭିଡିଓ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ଆପଣଙ୍କ ଫଟୋ ଏବଂ ଭିଡିଓ ଆକ୍ସେସ୍ କରନ୍ତୁ"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"ଟ୍ୟାଗ୍ କରାଯାଇଥିବା ଲୋକେସନ୍ ସହିତ ଆପଣଙ୍କ ଫଟୋ ଏବଂ ଭିଡିଓ ଆକ୍ସେସ୍ କରିବାକୁ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> କୁ ଅନୁମତି ଦେବେ କି?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ୱିଣ୍ଡୋ କଣ୍ଟେଣ୍ଟ ହାସଲ କରନ୍ତୁ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ଆପଣ କାମ କରୁଥିବା ୱିଣ୍ଡୋର କଣ୍ଟେଣ୍ଟକୁ ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ସ୍ପର୍ଶ ଦ୍ୱାରା ଏକ୍ସପ୍ଲୋର୍ ଅନ୍ କରନ୍ତୁ"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ନିଅର୍ ଫିଲ୍ଡ କମ୍ୟୁନିକେସନ୍ନ (NFC) ଟାଗ୍, କାର୍ଡ ଓ ରିଡରଗୁଡ଼ିକ ସହ ଯୋଗାଯୋଗ କରିବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ ଲକ୍ ଅକ୍ଷମ କରନ୍ତୁ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ଆପ୍କୁ କୀ\'ଲକ୍ କିମ୍ବା ସେଥିରେ ଥିବା କୌଣସି ପାସ୍ୱର୍ଡ ସୁରକ୍ଷାକୁ ଅକ୍ଷମ କରିବା ପାଇଁ ଅନୁମତି ଦିଏ, ଉଦାହରଣସ୍ୱରୂପ, ଇନ୍କମିଙ୍ଗ ଫୋନ୍ କଲ୍ ପ୍ରାପ୍ତ କରିବା ସମୟରେ ଫୋନ୍ଟି କୀ\'ଲକ୍କୁ ଅକ୍ଷମ କରିଦିଏ, ତା’ପରେ କଲ୍ ସମାପ୍ତ ହେବାପରେ ପୁଣି କୀ\'ଲକ୍କୁ ସକ୍ଷମ କରିଥାଏ।"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ସ୍କ୍ରିନ୍ ଲକ୍ ଜଟିଳତା ପ୍ରାପ୍ତ କରନ୍ତୁ"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"ସ୍କ୍ରିନ୍ ଲକ୍ର ଜଟିଳତା ସ୍ତର (ଉଚ୍ଚ, ମଧ୍ୟମ, ନିମ୍ନ କିମ୍ବା କିଛିନୁହେଁ), ଜାଣିବାକୁ ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ, ଯାହା ସ୍କ୍ରିନ୍ ଲକ୍ର ସମ୍ଭାବ୍ୟ ପରିସୀମାର ଲମ୍ବ ଏବଂ ପ୍ରକାର ସୂଚୀତ କରେ। ଆପ୍ ଏହା ମଧ୍ୟ ଉପଯୋଗକର୍ତ୍ତାମାନଙ୍କୁ ପରାମର୍ଶ ଦେଇପାରେ ଯେ ସେମାନେ ସ୍କ୍ରିନ୍ ଲକ୍କୁ ଏକ ନିର୍ଦ୍ଧିଷ୍ଟ ସ୍ତର ପର୍ଯ୍ୟନ୍ତ ଅପ୍ଡେଟ୍ କରିପାରନ୍ତି, କିନ୍ତୁ ଉପଯୋଗକର୍ତ୍ତାମାନେ ନିଜ ଇଚ୍ଛାରେ ଏହାକୁ ଉପେକ୍ଷା ଏବଂ ନାଭିଗେଟ୍ କରିପାରିବେ। ଏହା ଧ୍ୟାନ ଦିଅନ୍ତୁ ଯେ ସ୍କ୍ରିନ୍ ଲକ୍ ସରଳ ଟେକ୍ସଟ୍ରେ ଷ୍ଟୋର୍ କରାଯାଇନଥାଏ ଯେପରି ଆପ୍ ସଠିକ୍ ପାସ୍ୱର୍ଡ ଜାଣିପାରିନଥାଏ।"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ବାୟୋମେଟ୍ରିକ୍ ହାର୍ଡୱେର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"ସ୍ୱୀକୃତି ପାଇଁ ବାୟୋମେଟ୍ରିକ୍ ହାର୍ଡୱେର୍ ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦିଏ"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ହାର୍ଡୱେର୍ ପରିଚାଳନା କରନ୍ତୁ"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ବ୍ୟବହାର ପାଇଁ ଆପ୍କୁ ଫେସିଆଲ୍ ଟେମ୍ପଲେଟ୍ ଯୋଡିବା ଓ ଡିଲିଟ୍ ର ପଦ୍ଧତି ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ଫେସ୍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ଫେସ୍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍ର ପ୍ରମାଣ ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"ଫେସ୍ ଚିହ୍ନଟ ହେଲାନାହିଁ ।ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"ଫେସ୍ଟି ବହୁତ ଉଜ୍ଵଳ ଦେଖାଯାଉଛି। ଦୟାକରି, କମ ଆଲୋକରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"ଫେସ୍ଟି ବହୁତ କଳା ଦେଖାଯାଉଛି। ଦୟାକରି ଆଲୋକକୁ ଅନାବୃତ କରନ୍ତୁ।"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"ଦୟାକରି ସେନ୍ସର୍କୁ ଫେସ୍ ପାଖରୁ ଦୂରେଇ ରଖନ୍ତୁ"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"ଦୟାକରି ସେନ୍ସର୍କୁ ଫେସ୍ର ଅତି ନିକଟକୁ ଆଣନ୍ତୁ।"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"ଦୟାକରି ସେନ୍ସର୍କୁ ଆହୁରି ଉପରକୁ ଘୁଞ୍ଚାନ୍ତୁ।"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"ଦୟାକରି ସେନ୍ସର୍କୁ ତଳକୁ ଘୁଞ୍ଚାନ୍ତୁ।"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"ଦୟାକରି ସେନ୍ସର୍କୁ ଦକ୍ଷିଣକୁ ଘୁଞ୍ଚାନ୍ତୁ।"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"ଦୟାକରି ସେନ୍ସର୍କୁ ବାମକୁ ଘୁଞ୍ଚାନ୍ତୁ।"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"ଦୟାକରି ସେନ୍ସର୍କୁ ଦେଖନ୍ତୁ"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"କୌଣସି ଫେସ୍ ଚିହ୍ନଟ ହେଲା ନାହିଁ"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"ଅତ୍ୟଧିକ ଅସ୍ଥିର।"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ।"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"ଭିନ୍ନ ମୁହଁ ଚିହ୍ନଟ କରାଗଲା।"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"ଅତ୍ୟନ୍ତ ସମପରି, ଦୟାକରି ଆପଣଙ୍କର ପୋଜ୍ ବଦଳାନ୍ତୁ।"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"ଦୟାକରି କ୍ୟାମେରାକୁ ସିଧା ଦେଖନ୍ତୁ।"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"ଦୟାକରି କ୍ୟାମେରାକୁ ସିଧା ଦେଖନ୍ତୁ।"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"ଦୟାକରି ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ସିଧା ରଖନ୍ତୁ।"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"ଦୟାକରି ଆପଣଙ୍କର ମୁହଁକୁ ଘୋଡାନ୍ତୁ ନାହିଁ।"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"ଫେସ୍ର ହାର୍ଡୱେୟାର୍ ଉପଲବ୍ଧ ନାହିଁ।"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"ଫେସ୍ର ସମୟସୀମା ସରିଗଲା। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"ଫେସ୍ ମେମୋରୀରେ ଷ୍ଟୋର୍ କରାଯାଇପାରିବ ନାହିଁ।"</string>
<string name="face_error_canceled" msgid="283945501061931023">"ଫେସ୍ର ଅପରେଶନ୍ କ୍ୟାନ୍ସଲ୍ ହୋଇଗଲା"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"ଉପଯୋଗକର୍ତ୍ତା ମୁହଁ ଚିହ୍ନଟକରଣ ବାତିଲ୍ କରିଛନ୍ତି।"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"ବାରମ୍ବାର ଚେଷ୍ଟା। ପରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"ବାରମ୍ବାର ଚେଷ୍ଟା। ଫେସ୍ ପ୍ରମାଣୀକରଣ ଅକ୍ଷମ କରାଗଲା।"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"କୌଣସି ଫେସ୍ ପଞ୍ଜୀକୃତ ହୋଇନଥିଲା।"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"ଡିଭାଇସ୍ରେ ମୁହଁ ପ୍ରାମାଣିକିକରଣ ସେନ୍ସର୍ ନାହିଁ"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g>ଙ୍କ ଫେସ୍"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g>କୁ ଖୋଲନ୍ତୁ"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ସେଭ୍ ନହୋଇ ବନ୍ଦ ହୋଇଯିବ"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ଧାର୍ଯ୍ୟ ମେମୋରୀରୁ ବାହାରକୁ ଗଲା"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"’ହୀପ୍ ଡମ୍ପ’ ସଂଗ୍ରହ କରାଯାଇସାରିଛି। ଶେୟାର୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ହିପ୍ ଡମ୍ପ ଶେୟାର୍ କରିବେ?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> ପ୍ରୋସେସ୍ ଏହାର ଧାର୍ଯ୍ୟ <xliff:g id="SIZE">%2$s</xliff:g> ମେମୋରୀ ସୀମାରୁ ବାହରକୁ ଗଲା। ଏହାର ଡେଭଲପରଙ୍କ ସହ ଶେୟାର୍ କରିବାକୁ ଏକ ହିପ୍ ଡମ୍ପ ଉପଲବ୍ଧ ଅଛି। ସାବଧାନ ରୁହନ୍ତୁ: ଆପ୍ଲିକେଶନର ଆକ୍ସେସ୍ ରହିଥିବା ଆପଣଙ୍କର ଯେକୌଣସି ବ୍ୟକ୍ତିଗତ ସୂଚନା ଏହି ହିପ୍ ଡମ୍ପରେ ରହିପାରେ।"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"ଟେକ୍ସଟ୍ ପାଇଁ ଏକ କାର୍ଯ୍ୟ ବାଛନ୍ତୁ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ରିଙ୍ଗର୍ ଭଲ୍ୟୁମ୍"</string>
<string name="volume_music" msgid="5421651157138628171">"ମିଡିଆ ଭଲ୍ୟୁମ୍"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ସମସ୍ତ ନେଟ୍ୱର୍କ ଦେଖିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"କନେକ୍ଟ କରନ୍ତୁ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ସମସ୍ତ ନେଟ୍ୱର୍କ"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g>ଙ୍କ ଦ୍ୱାରା ପ୍ରସ୍ତାବିତ ଏକ ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ଉପଲବ୍ଧ ଅଛି"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"<xliff:g id="NAME">%s</xliff:g>ଙ୍କ ଦ୍ବାରା ପ୍ରସ୍ତାବିତ ନେଟ୍ୱର୍କ ସହ ସଂଯୋଗ କରିବାକୁ ଚାହାନ୍ତି କି?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ହଁ"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ନାହିଁ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ୱାଇ-ଫାଇ ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍ ହେବ"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ନେଟ୍ୱର୍କରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"ୱାଇ-ଫାଇର କୌଣସି ଇଣ୍ଟରନେଟ୍ ଆକ୍ସେସ୍ ନାହିଁ"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ବିକଳ୍ପ ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"ସଂଯୁକ୍ତ ହୋଇଛି"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"ଆପଣଙ୍କର ହଟ୍ସ୍ପଟ୍ ସେଟିଙ୍ଗକୁ ବଦଳିଯାଇଛି"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ଆପଣଙ୍କର ହଟ୍ସ୍ପଟ୍ ପରିବର୍ତ୍ତନ କରାଯାଇଛି"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"କେବଳ 5GHz ପାଇଁ, ଏହି ଡିଭାଇସ୍ ଆପଣଙ୍କର ପସନ୍ଦକୁ ସପୋର୍ଟ କରେନାହିଁ। ଏହା ପରିବର୍ତ୍ତେ, ଏହି ଡିଭାଇସ୍ 5GHz ବ୍ୟାଣ୍ଡ ବ୍ୟବହାର କରିବ।"</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ଡିବଗିଙ୍ଗ ସଂଯୁକ୍ତ ହୋଇଛି"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USBର ଡିବଗିଙ୍ଗ ସୁବିଧାକୁ ବନ୍ଦ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ଡିବଗିଙ୍ଗକୁ ଅକ୍ଷମ କରିବା ପାଇଁ ଚୟନ କରନ୍ତୁ।"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB ପୋର୍ଟରେ ତରଳ ପଦାର୍ଥ ବା ଧୂଳି"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB ପୋର୍ଟ ସ୍ୱଚାଳିତ ଭାବେ ଅକ୍ଷମ ହୋଇଛି। ଅଧିକ ଜାଣିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB ପୋର୍ଟ ବ୍ୟବହାର କରିବା ପାଇଁ ସୁରକ୍ଷିତ ଅଟେ"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"ୱର୍କ ପ୍ରୋଫାଇଲ୍ ଅନଲକ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> ସହ କନେକ୍ଟ କରାଗଲା"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ଫାଇଲ୍ ଦେଖିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
- <string name="pin_target" msgid="3052256031352291362">"ପିନ୍"</string>
- <string name="unpin_target" msgid="3556545602439143442">"ଅନପିନ୍ କରନ୍ତୁ"</string>
<string name="app_info" msgid="6856026610594615344">"ଆପ୍ ସୂଚନା"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ଡେମୋ ଆରମ୍ଭ କରାଯାଉଛି…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ନିୟମିତ ମୋଡ୍ ସୂଚନା ବିଜ୍ଞପ୍ତି"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ସାଧାରଣ ଭାବରେ ଚାର୍ଜ୍ କରିବା ପୂର୍ବରୁ ବ୍ୟାଟେରୀ ସରିଯାଇପାରେ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ବ୍ୟାଟେରୀର ସମୟକୁ ବଢ଼ାଇବା ପାଇଁ ବ୍ୟଟେରୀ ସେଭର୍କୁ କାର୍ଯ୍ୟକାରୀ କରାଯାଇଛି"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ଫୋଲ୍ଡର୍"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android ଆପ୍ଲିକେସନ୍"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ଫାଇଲ୍"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 421d52f..b46f321 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ਬੰਦ"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ਤਰਜੀਹੀ ਵਾਈ-ਫਾਈ"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ਮੋਬਾਈਲ ਨੂੰ ਤਰਜੀਹ ਹੈ"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"ਸਿਰਫ਼ ਵਾਈ-ਫਾਈ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ਅੱਗੇ ਨਹੀਂ ਭੇਜਿਆ ਗਿਆ"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ਬਗ ਰਿਪੋਰਟ"</string>
<string name="global_action_logout" msgid="935179188218826050">"ਸੈਸ਼ਨ ਸਮਾਪਤ ਕਰੋ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"ਬੱਗ ਰਿਪੋਰਟ ਲਓ"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"ਇਹ ਇੱਕ ਈਮੇਲ ਸੁਨੇਹਾ ਭੇਜਣ ਲਈ, ਤੁਹਾਡੇ ਵਰਤਮਾਨ ਡੀਵਾਈਸ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਠੀ ਕਰੇਗਾ। ਬੱਗ ਰਿਪੋਰਟ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਥੋੜ੍ਹਾ ਸਮਾਂ ਲੱਗੇਗਾ ਜਦੋਂ ਤੱਕ ਇਹ ਭੇਜੇ ਜਾਣ ਲਈ ਤਿਆਰ ਨਾ ਹੋਵੇ, ਕਿਰਪਾ ਕਰਕੇ ਧੀਰਜ ਰੱਖੋ।"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ਅੰਤਰਕਿਰਿਆਤਮਕ ਰਿਪੋਰਟ"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"ਜ਼ਿਆਦਾਤਰ ਹਾਲਾਤਾਂ ਵਿੱਚ ਇਸ ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ ਤੁਹਾਨੂੰ ਰਿਪੋਰਟ ਦੀ ਪ੍ਰਗਤੀ ਨੂੰ ਟਰੈਕ ਕਰਨ, ਸਮੱਸਿਆ ਬਾਰੇ ਹੋਰ ਵੇਰਵੇ ਦਾਖਲ ਕਰਨ, ਅਤੇ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦਿੰਦਾ ਹੈ। ਇਹ ਉਹਨਾਂ ਘੱਟ-ਵਰਤੇ ਗਏ ਕੁਝ ਭਾਗਾਂ ਨੂੰ ਨਜ਼ਰ-ਅੰਦਾਜ਼ ਕਰ ਸਕਦਾ ਹੈ ਜਿਨ੍ਹਾਂ ਦੀ ਰਿਪੋਰਟ ਕਰਨ ਵਿੱਚ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ।"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ਟਿਕਾਣਾ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਧਾਰਤ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚੋ"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਇਸ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਹੀ ਐਪ ਕੋਲ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ।"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਹਮੇਸ਼ਾਂ ਇਸ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ਐਪ ਕੋਲ ਹਮੇਸ਼ਾਂ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ, ਭਾਵੇਂ ਤੁਸੀਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਵੋ।"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ਕੈਲੰਡਰ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨੀ ਦੇਣੀ ਹੈ?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਸੰਗੀਤ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ਤੁਹਾਡੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਤੱਕ ਪਹੁੰਚ"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"ਕੀ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਟੈਗ ਕੀਤੇ ਟਿਕਾਣਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ਵਿੰਡੋ ਸਮੱਗਰੀ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨਾ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ਉਸ ਵਿੰਡੋ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰੋ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਅੰਤਰਕਿਰਿਆ ਕਰ ਰਹੇ ਹੋ"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\'ਸਪੱਰਸ਼ ਰਾਹੀਂ ਪੜਚੋਲ ਕਰੋ\' ਚਾਲੂ ਕਰਨਾ"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ਐਪ ਨੂੰ ਨਜ਼ਦੀਕੀ ਖੇਤਰ ਸੰਚਾਰ (NFC) ਟੈਗਾਂ, ਕਾਰਡਾਂ ਅਤੇ ਰੀਡਰਾਂ ਨਾਲ ਸੰਚਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ਆਪਣਾ ਸਕ੍ਰੀਨ ਲਾਕ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ਐਪ ਨੂੰ ਕੀਲਾਕ ਅਤੇ ਕਿਸੇ ਵੀ ਸੰਬੰਧਿਤ ਪਾਸਵਰਡ ਸੁਰੱਖਿਆ ਨੂੰ ਬੰਦ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਫ਼ੋਨ ਇੱਕ ਇਨਕਮਿੰਗ ਫ਼ੋਨ ਕਾਲ ਪ੍ਰਾਪਤ ਕਰਨ ਵੇਲੇ ਬੰਦ ਕਰਦਾ ਹੈ, ਫਿਰ ਜਦੋਂ ਕਾਲ ਖਤਮ ਹੁੰਦੀ ਹੈ ਤਾਂ ਕੀਲਾਕ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰਦਾ ਹੈ।"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਜਟਿਲਤਾ ਲਈ ਬੇਨਤੀ ਕਰੋ"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"ਐਪ ਨੂੰ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਜਟਿਲਤਾ ਦੇ ਪੱਧਰ ਬਾਰੇ ਜਾਣਨ ਦਿਓ (ਉੱਚ, ਮੱਧਮ, ਘੱਟ ਜਾਂ ਕੋਈ ਨਹੀਂ), ਜੋ ਲੰਬਾਈ ਦੀ ਸੰਭਵ ਰੇਂਜ ਅਤੇ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਕਿਸਮ ਦਾ ਸੰਕੇਤ ਦਿੰਦਾ ਹੈ। ਐਪ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਇੱਕ ਖਾਸ ਪੱਧਰ ਤੱਕ ਸਕ੍ਰੀਨ ਲਾਕ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੁਝਾਅ ਵੀ ਦੇ ਸਕਦੀ ਹੈ ਪਰ ਵਰਤੋਂਕਾਰ ਇਸਨੂੰ ਅਣਡਿੱਠ ਕਰ ਸਕਦੇ ਹਨ। ਨੋਟ ਕਰੋ ਕਿ ਸਕ੍ਰੀਨ ਲਾਕ ਸਧਾਰਨ ਲਿਖਤ ਵਿੱਚ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਇਸ ਲਈ ਐਪ ਸਹੀ ਪਾਸਵਰਡ ਬਾਰੇ ਨਹੀਂ ਜਾਣਦੀ ਹੈ।"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ਬਾਇਓਮੈਟ੍ਰਿਕ ਹਾਰਡਵੇਅਰ ਵਰਤੋ"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਬਾਇਓਮੈਟ੍ਰਿਕ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦਾ ਹੈ"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਾਰਡਵੇਅਰ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ਐਪ ਨੂੰ ਵਰਤਣ ਲਈ ਚਿਹਰਾ ਟੈਮਪਲੇਟ ਸ਼ਾਮਲ ਕਰਨ ਜਾਂ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦਿੰਦੀ ਹੈ।"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤੋ"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਨਹੀਂ ਹੋਈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"ਚਿਹਰਾ ਬਹੁਤ ਚਮਕਦਾਰ ਹੈ। ਘੱਟ ਰੋਸ਼ਨੀ ਵਿੱਚ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"ਚਿਹਰਾ ਹਨੇਰੇ ਵਿੱਚ ਹੈ। ਚਾਨਣ ਕਰੋ।"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"ਚਿਹਰੇ ਨੂੰ ਸੈਂਸਰ ਤੋਂ ਦੂਰ ਲਿਜਾਓ।"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"ਚਿਹਰੇ ਨੂੰ ਸੈਂਸਰ ਦੇ ਨੇੜੇ ਲਿਆਓ।"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"ਸੈਂਸਰ ਨੂੰ ਉੱਪਰ ਕਰੋ।"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"ਸੈਂਸਰ ਨੂੰ ਥੱਲੇ ਕਰੋ।"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"ਸੈਂਸਰ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਲਿਜਾਓ।"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"ਸੈਂਸਰ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਲਿਜਾਓ।"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"ਕਿਰਪਾ ਕਰਕੇ ਸੈਂਸਰ ਵੱਲ ਦੇਖੋ।"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"ਕੋਈ ਚਿਹਰਾ ਨਹੀਂ ਦਿਸਿਆ।"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਹਿਲਜੁਲ।"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਚਿਹਰਾ ਦੁਬਾਰਾ ਦਰਜ ਕਰੋ।"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"ਵੱਖਰੇ ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਕੀਤੀ ਗਈ।"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"ਬਹੁਤ ਮਿਲਦਾ-ਜੁਲਦਾ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਅੰਦਾਜ਼ ਬਦਲੋ।"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"ਕਿਰਪਾ ਕਰਕੇ ਸਿੱਧਾ ਕੈਮਰੇ ਵੱਲ ਦੇਖੋ।"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"ਕਿਰਪਾ ਕਰਕੇ ਸਿੱਧਾ ਕੈਮਰੇ ਵੱਲ ਦੇਖੋ।"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਸਿਰ ਨੂੰ ਸਿੱਧਾ ਖੜ੍ਹਵਾਂ ਰੱਖੋ।"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਚਿਹਰਾ ਦਿਖਾਓ।"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"ਚਿਹਰਾ ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"ਚਿਹਰਾ ਪਛਾਣਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"ਚਿਹਰੇ ਦੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string>
<string name="face_error_canceled" msgid="283945501061931023">"ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ।"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਚਿਹਰਾ ਪੁਸ਼ਟੀਕਰਨ ਨੂੰ ਰੱਦ ਕੀਤਾ ਗਿਆ।"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਬੰਦ ਹੈ।"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"ਕੋਈ ਚਿਹਰਾ ਜਾਣਕਾਰੀ ਦਰਜ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਕੋਈ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਸੈਂਸਰ ਨਹੀਂ ਹੈ।"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"ਚਿਹਰਾ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> ਖੋਲ੍ਹੋ"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ਰੱਖਿਅਤ ਕੀਤੇ ਬਿਨਾਂ ਬੰਦ ਹੋ ਜਾਵੇਗੀ"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਮੈਮਰੀ ਸੀਮਾ ਵਧ ਗਈ ਹੈ"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"ਹੀਪ ਡੰਪ ਨੂੰ ਇਕੱਤਰ ਕੀਤਾ ਗਿਆ। ਸਾਂਝਾ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ਕੀ ਹੀਪ ਡੰਪ ਸ਼ੇਅਰ ਕਰਨਾ ਹੈ?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਆਪਣੀ ਪ੍ਰਕਿਰਿਆ ਮੈਮਰੀ ਸੀਮਾ <xliff:g id="SIZE">%2$s</xliff:g> ਵਧ ਗਈ ਹੈ। ਇਸਦੇ ਵਿਕਾਸਕਾਰ ਨਾਲ ਸਾਂਝਾ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਹੀਪ ਡੰਪ ਉਪਲਬਧ ਹੈ। ਸਾਵਧਾਨ ਰਹੋ: ਇਸ ਹੀਪ ਡੰਪ ਵਿੱਚ ਤੁਹਾਡੀ ਕੋਈ ਵੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਹੋ ਸਕਦੀ ਹੈ, ਜਿਸ \'ਤੇ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਪਹੁੰਚ ਹੈ।"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"ਲਿਖਤ ਲਈ ਕੋਈ ਕਾਰਵਾਈ ਚੁਣੋ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ਰਿੰਗਰ ਵੌਲਿਊਮ"</string>
<string name="volume_music" msgid="5421651157138628171">"ਮੀਡੀਆ ਵੌਲਿਊਮ"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ਸਾਰੇ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ਕਨੈਕਟ ਕਰੋ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ਸਾਰੇ ਨੈੱਟਵਰਕ"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> ਵੱਲੋਂ ਸੁਝਾਇਆ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਹੈ"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"ਕੀ ਤੁਸੀਂ <xliff:g id="NAME">%s</xliff:g> ਵੱਲੋਂ ਸੁਝਾਏ ਨੈੱਟਵਰਕਾਂ ਨਾਲ ਕਨੈਕਟ ਹੋਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ਹਾਂ"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ਨਹੀਂ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ਵਾਈ‑ਫਾਈ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਚੱਲ ਪਵੇਗਾ"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ਨੈੱਟਵਰਕ \'ਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"ਵਾਈ-ਫਾਈ ਦੀ ਕੋਈ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"ਕਨੈਕਟ ਹੋਏ"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"ਤੁਹਾਡੀਆਂ ਹੌਟਸਪੌਟ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲਾਅ"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ਤੁਹਾਡਾ ਹੌਟਸਪੌਟ ਬੈਂਡ ਬਦਲ ਗਿਆ ਹੈ।"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ਇਹ ਡੀਵਾਈਸ ਸਿਰਫ਼ 5GHz ਦੀ ਤੁਹਾਡੀ ਤਰਜੀਹ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਇਸਦੀ ਬਜਾਏ, ਇਹ ਡੀਵਾਈਸ ਉਪਲਬਧ ਹੋਣ \'ਤੇ 5GHz ਬੈਂਡ ਵਰਤੇਗਾ।"</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB ਡੀਬੱਗਿੰਗ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ਡੀਬੱਗਿੰਗ ਅਯੋਗ ਬਣਾਉਣ ਲਈ ਚੁਣੋ।"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB ਪੋਰਟ ਵਿੱਚ ਪਾਣੀ ਜਾਂ ਧੂੜ-ਮਿੱਟੀ"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB ਪੋਰਟ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਬੰਦ ਕੀਤਾ ਗਿਆ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB ਪੋਰਟ ਵਰਤਣਾ ਸੁਰੱਖਿਅਤ ਹੈ"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋਈ"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ਫ਼ਾਈਲਾਂ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
- <string name="pin_target" msgid="3052256031352291362">"ਪਿੰਨ ਕਰੋ"</string>
- <string name="unpin_target" msgid="3556545602439143442">"ਅਨਪਿੰਨ ਕਰੋ"</string>
<string name="app_info" msgid="6856026610594615344">"ਐਪ ਜਾਣਕਾਰੀ"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ਡੈਮੋ ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ਨਿਯਮਬੱਧ ਮੋਡ ਦੀ ਜਾਣਕਾਰੀ ਵਾਲੀ ਸੂਚਨਾ"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ਬੈਟਰੀ ਚਾਰਜ ਕਰਨ ਦੇ ਮਿੱਥੇ ਸਮੇਂ ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਇਦ ਬੈਟਰੀ ਖਤਮ ਹੋ ਜਾਵੇ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ਫੋਲਡਰ"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android ਐਪਲੀਕੇਸ਼ਨ"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ਫ਼ਾਈਲ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 674ccb0..07e8932 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -143,8 +143,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Połączenia przez Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Wył."</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferuj Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferowane komórkowe"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Tylko Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nieprzekierowane"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -232,7 +234,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Zgłoszenie błędu"</string>
<string name="global_action_logout" msgid="935179188218826050">"Zakończ sesję"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Zrzut ekranu"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Zgłoś błąd"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Informacje o bieżącym stanie urządzenia zostaną zebrane i wysłane e-mailem. Przygotowanie zgłoszenia błędu do wysłania chwilę potrwa, więc zachowaj cierpliwość."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Raport interaktywny"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Używaj tej opcji w większości przypadków. Umożliwia śledzenie postępów raportu, podanie dodatkowych szczegółów problemu i wykonanie zrzutów ekranu. Raport może pomijać niektóre rzadko używane sekcje, których utworzenie zajmuje dużo czasu."</string>
@@ -287,9 +290,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokalizacja"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"dostęp do informacji o lokalizacji tego urządzenia"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na dostęp do lokalizacji urządzenia?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacja będzie mieć dostęp do lokalizacji tylko wtedy, gdy jest używana."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Zawsze zezwalać aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do lokalizacji urządzenia?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacja będzie zawsze mieć dostęp do lokalizacji, nawet wtedy, gdy nie jest używana."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendarz"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"dostęp do kalendarza"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na dostęp do kalendarza?"</string>
@@ -322,7 +328,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Zezwolić aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na dostęp do muzyki?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Zdjęcia i filmy"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"dostęp do zdjęć i filmów"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Zezwolić aplikacji „<xliff:g id="APP_NAME">%1$s</xliff:g>” na dostęp do Twoich zdjęć i filmów, w tym do otagowanych lokalizacji?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pobieranie zawartości okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Sprawdzanie zawartości okna, z którego korzystasz."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Włączenie czytania dotykiem"</string>
@@ -515,8 +524,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Pozwala aplikacji na komunikowanie się z tagami, kartami i czytnikami NFC (Near Field Communication)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"wyłączanie blokady ekranu"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Pozwala aplikacji na wyłączenie blokady klawiatury i wszystkich związanych z tym haseł zabezpieczających. Na przykład telefon wyłącza blokadę klawiatury, gdy odbiera połączenie przychodzące, a następnie włącza ją ponownie po zakończeniu połączenia."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"zażądaj informacji o stopniu złożoności blokady ekranu"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Zezwala aplikacji na poznanie stopnia złożoności blokady ekranu (wysoki, średni, niski lub brak), który wskazuje na możliwy zakres długości oraz typ blokady ekranu. Aplikacja może też zasugerować zaktualizowanie blokady ekranu pod kątem określonego stopnia złożoności, ale użytkownik może to zignorować i zamknąć komunikat. Pamiętaj, że blokada ekranu nie jest zapisywana jako tekst jawny, więc aplikacja nie pozna dokładnego hasła."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"używanie sprzętu biometrycznego"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Zezwala aplikacji na używanie sprzętu biometrycznego na potrzeby autoryzacji"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"zarządzanie czytnikiem linii papilarnych"</string>
@@ -571,37 +582,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Zezwala na aktywowanie przez aplikację metody dodawania i usuwania szablonów twarzy."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"używanie sprzętu do uwierzytelniania za pomocą twarzy"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Zezwala na używanie przez aplikację sprzętu do analizy twarzy na potrzeby uwierzytelniania"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nie można przeanalizować twarzy. Spróbuj ponownie."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Zbyt jasna twarz. Spróbuj w ciemniejszym miejscu."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Zbyt ciemna twarz. Spróbuj w jaśniejszym miejscu."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Oddal czujnik od twarzy."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Przybliż czujnik do twarzy."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Przesuń czujnik wyżej."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Przesuń czujnik niżej."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Przesuń czujnik w prawo."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Przesuń czujnik w lewo."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Spójrz na czujnik."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nie wykryto twarzy."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Urządzenie za bardzo się porusza."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Zarejestruj swoją twarz ponownie."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Wykryto inną twarz."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Za mała różnica. Zmień pozycję."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Patrz prosto w obiektyw."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Patrz prosto w obiektyw."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Wyprostuj głowę w pionie."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Odsłoń twarz."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Czujnik twarzy nie jest dostępny."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Upłynął limit czasu analizy twarzy. Spróbuj ponownie."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Nie można zapisać informacji o twarzy."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Analiza twarzy została anulowana."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Użytkownik anulował uwierzytelnianie twarzą."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Zbyt wiele prób. Spróbuj ponownie później."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Zbyt wiele prób. Wyłączono uwierzytelnianie za pomocą twarzy."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Spróbuj ponownie."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nie zarejestrowano twarzy."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"To urządzenie nie jest wyposażone w czujnik twarzy."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Twarz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1253,9 +1286,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Otwórz aplikację <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"Aplikacja <xliff:g id="OLD_APP">%1$s</xliff:g> zostanie zamknięta bez zapisywania"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> przekroczył limit pamięci"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Pobrano zrzut sterty – kliknij, by go udostępnić"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Udostępnić zrzut stosu?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> przekroczył swój limit pamięci, który wynosi <xliff:g id="SIZE">%2$s</xliff:g>. Możesz udostępnić zrzut stosu programiście procesu. Uwaga: ten zrzut może zawierać wszelkie dane osobowe, do których aplikacja ma dostęp."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Wybierz czynność, jaka ma zostać wykonana na tekście"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Głośność dzwonka"</string>
<string name="volume_music" msgid="5421651157138628171">"Głośność multimediów"</string>
@@ -1298,8 +1338,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Kliknij, by zobaczyć wszystkie sieci"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Połącz"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Wszystkie sieci"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Sieć Wi‑Fi sugerowana przez użytkownika <xliff:g id="NAME">%s</xliff:g> jest dostępna"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Czy chcesz połączyć się z sieciami sugerowanymi przez użytkownika <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Tak"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nie"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi włączy się automatycznie"</string>
@@ -1311,9 +1353,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Zaloguj się do sieci"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Sieć Wi-Fi nie ma dostępu do internetu"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Kliknij, by wyświetlić opcje"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Połączono"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Zmieniono ustawienia hotspotu"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Zmieniono pasmo hotspotu."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"To urządzenie nie może korzystać tylko z częstotliwości 5 GHz. Będzie korzystać z tego pasma, jeśli będzie ono dostępne."</string>
@@ -1398,6 +1445,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Podłączono moduł debugowania USB"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Kliknij, by wyłączyć debugowanie USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Wybierz, aby wyłączyć debugowanie USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Wilgoć lub brud w porcie USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Port USB został automatycznie wyłączony. Kliknij, by dowiedzieć się więcej."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Możesz bezpiecznie korzystać z portu USB"</string>
@@ -1973,8 +2024,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Kliknij, by odblokować profil"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Połączono z: <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Dotknij, by wyświetlić pliki"</string>
- <string name="pin_target" msgid="3052256031352291362">"Przypnij"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Odepnij"</string>
<string name="app_info" msgid="6856026610594615344">"O aplikacji"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Uruchamiam tryb demo…"</string>
@@ -2067,6 +2116,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Powiadomienie z informacją o trybie rutynowym"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateria może się wyczerpać przed zwykłą porą ładowania"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Włączono Oszczędzanie baterii, by wydłużyć czas pracy na baterii"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplikacja na Androida"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Plik"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 9a078f8..ae01cfb 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Chamada no Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desativado"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferido"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferência pela rede móvel"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Somente Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não encaminhado"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de bugs"</string>
<string name="global_action_logout" msgid="935179188218826050">"Finalizar sessão"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Obter relatório de bugs"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Relatório interativo"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Local"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acesse o local do dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse a localização deste dispositivo?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"O app só terá acesso ao local enquanto estiver sendo usado."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Sempre permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse o local deste disp.?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"O app sempre terá acesso ao local, mesmo quando não estiver sendo usado."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acesse sua agenda"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse sua agenda?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Permitir que o app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse suas músicas?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos e vídeos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acessar suas fotos e seus vídeos"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Permitir que o app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse seus vídeos e fotos, incluindo os locais marcados?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Acessar conteúdo de uma janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspeciona o conteúdo de uma janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Permite que o app se comunique com leitores, cartões e etiqueta NFC (comunicação a curta distância)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"desativar o bloqueio de tela"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permite que o app desative o bloqueio de teclas e qualquer segurança por senha associada. Por exemplo, o telefone desativa o bloqueio de telas ao receber uma chamada e o reativa quando a chamada é finalizada."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"solicitar complexidade do bloqueio de tela"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Permite que o app saiba o nível de complexidade do bloqueio de tela (alto, médio, baixo ou nenhum), que indica o intervalo possível de comprimento e o tipo de bloqueio de tela. O app também pode sugerir a atualização do bloqueio de tela até um certo nível, mas os usuários podem ignorar a sugestão. O bloqueio de tela não é armazenado em texto simples, então o app não tem acesso à senha exata."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"Usar hardware de biometria"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Permite que o app use hardware de biometria para autenticação"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"gerenciar hardware de impressão digital"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticação facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que o app use o hardware de autenticação facial para autenticação"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Falha ao processar o rosto. Tente novamente."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Rosto muito iluminado. Tente com menos iluminação."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Rosto muito escuro. Acrescente uma fonte de luz."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Afaste o sensor do rosto."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Aproxime o sensor do rosto."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Mova o sensor para cima."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Mova o sensor para baixo."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Mova o sensor para a direita."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Mova o sensor para a esquerda."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Olhe para o sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nenhum rosto detectado."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Muito movimento."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registre seu rosto novamente."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Rosto diferente detectado."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Muito parecido, mude de posição."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Olhe mais diretamente para a câmera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Olhe mais diretamente para a câmera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Alinhe sua cabeça na vertical."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Descubra seu rosto."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware de rosto não disponível."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Tempo máx. p/ captura facial atingido. Tente novamente."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar um rosto."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Autenticação facial cancelada pelo usuário."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Excesso de tentativas. Autenticação facial desat."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nenhum rosto registrado."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Este dispositivo não tem um sensor de autenticação facial."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Abrir <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"O app <xliff:g id="OLD_APP">%1$s</xliff:g> será fechado sem salvar"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite de memória"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"O despejo de heap foi coletado. Toque para compartilhar."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Compartilhar despejo de heap?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"O processo <xliff:g id="PROC">%1$s</xliff:g> excedeu seu limite de memória de <xliff:g id="SIZE">%2$s</xliff:g>. Um despejo de heap está disponível para compartilhamento com o desenvolvedor. Tenha cuidado: esse despejo de heap pode conter informações pessoais às quais o aplicativo tem acesso."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Escolha uma ação para o texto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume da campainha"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume da mídia"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Uma rede Wi‑Fi sugerida por <xliff:g id="NAME">%s</xliff:g> está disponível"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Você quer se conectar às redes sugeridas por <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sim"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Não"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Fazer login na rede"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"O Wi‑Fi não tem acesso à Internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para ver opções"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Conectado"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Mudanças nas suas configurações de ponto de acesso"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Sua banda de ponto de acesso foi alterada."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo não é compatível com sua preferência apenas por 5 GHz. Em vez disso, o dispositivo usará a banda de 5 GHz quando ela estiver disponível."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecione para desativar a depuração USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Líquido ou detrito na porta USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"A porta USB é desativada automaticamente. Toque para saber mais."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"É seguro usar a porta USB"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Toque p/ desbl. perfil de trab."</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Conectado a <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Toque para ver os arquivos"</string>
- <string name="pin_target" msgid="3052256031352291362">"Fixar guia"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Liberar guia"</string>
<string name="app_info" msgid="6856026610594615344">"Informações do app"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Iniciando demonstração…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificação de informação do modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"A bateria pode acabar antes da recarga normal"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"A \"Economia de bateria\" foi ativada para aumentar a duração da carga"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Pasta"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplicativo Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Arquivo"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 9a078f8..ae01cfb 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Chamada no Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desativado"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferido"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferência pela rede móvel"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Somente Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não encaminhado"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de bugs"</string>
<string name="global_action_logout" msgid="935179188218826050">"Finalizar sessão"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Obter relatório de bugs"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Relatório interativo"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Local"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acesse o local do dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse a localização deste dispositivo?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"O app só terá acesso ao local enquanto estiver sendo usado."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Sempre permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse o local deste disp.?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"O app sempre terá acesso ao local, mesmo quando não estiver sendo usado."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acesse sua agenda"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse sua agenda?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Permitir que o app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse suas músicas?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos e vídeos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acessar suas fotos e seus vídeos"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Permitir que o app <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acesse seus vídeos e fotos, incluindo os locais marcados?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Acessar conteúdo de uma janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspeciona o conteúdo de uma janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Permite que o app se comunique com leitores, cartões e etiqueta NFC (comunicação a curta distância)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"desativar o bloqueio de tela"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permite que o app desative o bloqueio de teclas e qualquer segurança por senha associada. Por exemplo, o telefone desativa o bloqueio de telas ao receber uma chamada e o reativa quando a chamada é finalizada."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"solicitar complexidade do bloqueio de tela"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Permite que o app saiba o nível de complexidade do bloqueio de tela (alto, médio, baixo ou nenhum), que indica o intervalo possível de comprimento e o tipo de bloqueio de tela. O app também pode sugerir a atualização do bloqueio de tela até um certo nível, mas os usuários podem ignorar a sugestão. O bloqueio de tela não é armazenado em texto simples, então o app não tem acesso à senha exata."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"Usar hardware de biometria"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Permite que o app use hardware de biometria para autenticação"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"gerenciar hardware de impressão digital"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticação facial"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que o app use o hardware de autenticação facial para autenticação"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Falha ao processar o rosto. Tente novamente."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Rosto muito iluminado. Tente com menos iluminação."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Rosto muito escuro. Acrescente uma fonte de luz."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Afaste o sensor do rosto."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Aproxime o sensor do rosto."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Mova o sensor para cima."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Mova o sensor para baixo."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Mova o sensor para a direita."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Mova o sensor para a esquerda."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Olhe para o sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nenhum rosto detectado."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Muito movimento."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registre seu rosto novamente."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Rosto diferente detectado."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Muito parecido, mude de posição."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Olhe mais diretamente para a câmera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Olhe mais diretamente para a câmera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Alinhe sua cabeça na vertical."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Descubra seu rosto."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware de rosto não disponível."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Tempo máx. p/ captura facial atingido. Tente novamente."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar um rosto."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Autenticação facial cancelada pelo usuário."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Excesso de tentativas. Autenticação facial desat."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nenhum rosto registrado."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Este dispositivo não tem um sensor de autenticação facial."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Abrir <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"O app <xliff:g id="OLD_APP">%1$s</xliff:g> será fechado sem salvar"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite de memória"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"O despejo de heap foi coletado. Toque para compartilhar."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Compartilhar despejo de heap?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"O processo <xliff:g id="PROC">%1$s</xliff:g> excedeu seu limite de memória de <xliff:g id="SIZE">%2$s</xliff:g>. Um despejo de heap está disponível para compartilhamento com o desenvolvedor. Tenha cuidado: esse despejo de heap pode conter informações pessoais às quais o aplicativo tem acesso."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Escolha uma ação para o texto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume da campainha"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume da mídia"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Uma rede Wi‑Fi sugerida por <xliff:g id="NAME">%s</xliff:g> está disponível"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Você quer se conectar às redes sugeridas por <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sim"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Não"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Fazer login na rede"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"O Wi‑Fi não tem acesso à Internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para ver opções"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Conectado"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Mudanças nas suas configurações de ponto de acesso"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Sua banda de ponto de acesso foi alterada."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo não é compatível com sua preferência apenas por 5 GHz. Em vez disso, o dispositivo usará a banda de 5 GHz quando ela estiver disponível."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecione para desativar a depuração USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Líquido ou detrito na porta USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"A porta USB é desativada automaticamente. Toque para saber mais."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"É seguro usar a porta USB"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Toque p/ desbl. perfil de trab."</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Conectado a <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Toque para ver os arquivos"</string>
- <string name="pin_target" msgid="3052256031352291362">"Fixar guia"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Liberar guia"</string>
<string name="app_info" msgid="6856026610594615344">"Informações do app"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Iniciando demonstração…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificação de informação do modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"A bateria pode acabar antes da recarga normal"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"A \"Economia de bateria\" foi ativada para aumentar a duração da carga"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Pasta"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplicativo Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Arquivo"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 63b3411..ad08ca4 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -142,8 +142,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Apelare prin Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Dezactivată"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Se preferă conexiunea Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Se preferă datele mobile"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Numai Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: neredirecționată"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -230,7 +232,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Raport despre erori"</string>
<string name="global_action_logout" msgid="935179188218826050">"Încheiați sesiunea"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captură de ecran"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Executați un raport despre erori"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Raport interactiv"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Folosiți această opțiune în majoritatea situațiilor. Astfel, puteți să urmăriți progresul raportului, să introduceți mai multe detalii în privința problemei și să creați capturi de ecran. Pot fi omise unele secțiuni mai puțin folosite pentru care raportarea durează prea mult."</string>
@@ -284,9 +287,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Locație"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceseze locația acestui dispozitiv"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Permiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să acceseze locația acestui dispozitiv?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplicația va avea acces la locație doar atunci când o folosiți."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Permiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să acceseze locația dispozitivului?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplicația va avea în permanență acces la locație, chiar și atunci când nu o folosiți."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceseze calendarul"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Permiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să vă acceseze calendarul?"</string>
@@ -319,7 +325,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Permiteți <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să vă acceseze muzica?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografii și videoclipuri"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"accesați fotografiile și videoclipurile"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Permiteți aplicației <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> să acceseze fotografiile și videoclipurile, inclusiv locațiile etichetate?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Analizează conținutul ferestrei"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspectează conținutul unei ferestre cu care interacționați."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activează funcția Explorați prin atingere"</string>
@@ -512,8 +521,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Permite aplicației să comunice cu etichetele, cardurile și cititoarele NFC (Near Field Communication)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"dezactivează blocarea ecranului"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permite aplicației să dezactiveze blocarea tastelor și orice modalitate asociată de securizare prin parolă. De exemplu, telefonul dezactivează blocarea tastelor când se primește un apel telefonic și reactivează blocarea tastelor la terminarea apelului."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"solicitați complexitatea blocării ecranului"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Permite aplicației să învețe nivelul de complexitate al blocării ecranului (ridicat, mediu, scăzut sau fără) ce indică intervalul posibil de lungime a parolei și tipul de blocare a ecranului. Aplicația le poate sugera utilizatorilor să își actualizeze blocarea ecranului la un anumit nivel, dar utilizatorii pot ignora sugestia și pot naviga în continuare. Rețineți că blocarea ecranului nu este stocată ca text simplu, astfel încât aplicația să nu cunoască parola exactă."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"utilizați hardware biometric"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Permite aplicației să folosească hardware biometric pentru autentificare"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"gestionează hardware-ul pentru amprentă"</string>
@@ -568,37 +579,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Permite aplicației să invoce metode pentru a adăuga și a șterge șabloane faciale pentru utilizare."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"să folosească hardware de autentificare facială"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite aplicației să folosească hardware de autentificare facială pentru autentificare"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Chipul nu a putut fi procesat. Încercați din nou."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Chip prea luminat. Încercați cu mai puțină lumină."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Chip prea întunecat. Măriți sursa de lumină."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Deplasați senzorul mai departe de chip."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Aduceți senzorul mai aproape de chip."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Deplasați senzorul mai sus."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Deplasați senzorul mai jos."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Deplasați senzorul spre dreapta."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Deplasați senzorul spre stânga."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Priviți spre senzor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nu s-a detectat niciun chip."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Prea multă mișcare."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Reînregistrați-vă chipul."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"A fost detectat un chip diferit."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Prea asemănător, schimbați poziția."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Priviți mai direct spre cameră."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Priviți mai direct spre cameră."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Îndreptați capul pe verticală."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Descoperiți-vă chipul."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware-ul pentru chip nu este disponibil."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Timpul pentru reunoaștere facială a expirat. Încercați din nou."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Chipul nu poate fi stocat."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Operațiunea privind chipul a fost anulată."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Autentificarea chipului anulată de utilizator."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Prea multe încercări. Reîncercați mai târziu."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Prea multe încercări. Autentificarea facială este dezactivată."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Încercați din nou."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nu au fost înregistrate chipuri."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Dispozitivul nu are un senzor de autentificare a chipului."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Chip <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1233,9 +1266,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Deschideți <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> se va închide fără să salveze"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a depășit limita de memorie"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Datele privind memoria au fost culese. Atingeți pentru a trimite."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Trimiteți datele privind memoria?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Procesul <xliff:g id="PROC">%1$s</xliff:g> și-a depășit limita de memorie de <xliff:g id="SIZE">%2$s</xliff:g>. Sunt disponibile datele privind memoria, pe care le puteți trimite dezvoltatorului. Atenție: aceste date privind memoria pot conține informațiile personale la care aplicația are acces."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Alegeți o acțiune pentru text"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volum sonerie"</string>
<string name="volume_music" msgid="5421651157138628171">"Volum media"</string>
@@ -1276,8 +1316,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Atingeți pentru a vedea toate rețelele"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectați-vă"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Toate rețelele"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Este disponibilă o rețea propusă de <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Doriți să vă conectați la rețelele propuse de <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nu"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi se va activa automat"</string>
@@ -1289,9 +1331,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Conectați-vă la rețea"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Rețeaua Wi-Fi nu are acces la internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Atingeți pentru opțiuni"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Conectat"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Modificări aduse setărilor pentru hotspot"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"S-a schimbat banda de frecvență a hotspotului."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Dispozitivul nu acceptă doar preferința pentru 5 GHz. Dispozitivul va folosi banda de 5 GHz când este disponibilă."</string>
@@ -1376,6 +1423,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Remedierea erorilor prin USB este conectată"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Atingeți pentru a dezactiva remedierea erorilor prin USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selectați pentru a dezactiva remedierea erorilor prin USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Lichide sau reziduuri în portul USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Portul USB este dezactivat automat. Atingeți ca să aflați mai multe."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Portul USB poate fi folosit în siguranță"</string>
@@ -1939,8 +1990,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Atingeți ca să deblocați"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Conectat la <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Atingeți pentru a vedea fișierele"</string>
- <string name="pin_target" msgid="3052256031352291362">"Fixați"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Anulați fixarea"</string>
<string name="app_info" msgid="6856026610594615344">"Informații despre aplicație"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Se pornește demonstrația…"</string>
@@ -2032,6 +2081,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificare pentru informații despre modul Rutină"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateria se poate descărca înainte de încărcarea obișnuită"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Economisirea bateriei este activată pentru a prelungi durata de funcționare a bateriei"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Dosar"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplicație Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fișier"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 0aed6bc..ae9d483 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -143,8 +143,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Звонки по Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Отключено"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Приоритет Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Приоритет мобильного Интернета"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Только Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не переадресовано"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -232,7 +234,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Отчет об ошибке"</string>
<string name="global_action_logout" msgid="935179188218826050">"Закончить сеанс"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Отчет об ошибке"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Информация о текущем состоянии вашего устройства будет собрана и отправлена по электронной почте. Подготовка отчета займет некоторое время."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактивный отчет"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Рекомендуем этот вариант в большинстве случаев, чтобы отслеживать статус отчета, указывать дополнительные данные о проблеме и делать скриншоты. Некоторые разделы могут быть исключены, чтобы сократить время подготовки отчета."</string>
@@ -287,9 +290,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Местоположение"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"доступ к данным о местоположении устройства"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Разрешить приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к данным о местоположении устройства?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Доступ будет открыт, только когда вы пользуетесь приложением."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Всегда разрешать приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к геоданным устройства?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Доступ будет открыт, даже когда вы не пользуетесь приложением."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календарь"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"доступ к календарю"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Разрешить приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к календарю?"</string>
@@ -322,7 +328,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Разрешить приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к музыке?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Фото и видео"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"доступ к фото и видео"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Открыть приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к вашим фото и видео, а также к данным о местах съемки?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Получать содержимое окна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Анализировать содержимое активного окна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включать Изучение касанием"</string>
@@ -515,8 +524,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Приложение сможет обмениваться данными с NFC-метками, картами и устройствами считывания, используя NFC."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"Отключение функции блокировки экрана"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Приложение сможет отключать блокировку экрана и другие функции защиты. Например, блокировка экрана будет отключаться при получении входящего вызова и включаться после завершения разговора."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"Запрос данных об уровне сложности блокировки экрана"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Приложение получит доступ к сведениям об уровне сложности блокировки экрана (высокий, средний, низкий или не задан), в том числе о типе блокировки и длине пароля. Кроме того, оно сможет предлагать пользователям повысить уровень сложности блокировки. Эти рекомендации необязательны. Обратите внимание, что пароль не хранится в виде открытого текста и недоступен приложению."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"Использование биометрического оборудования"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Приложение сможет использовать биометрическое оборудование для аутентификации"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"управление сканером отпечатков"</string>
@@ -571,37 +582,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Приложение сможет добавлять и удалять шаблоны лиц."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"Использовать оборудование для распознавания лиц"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Приложение сможет использовать распознающее оборудование для аутентификации."</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Не удалось распознать лицо. Повторите попытку."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Лицо слишком яркое. Притушите свет."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Лицо слишком темное. Сделайте свет ярче."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Уберите устройство дальше от лица"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Поднесите устройство ближе к лицу"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Поднимите устройство выше"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Опустите устройство ниже"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Сдвиньте устройство правее"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Сдвиньте устройство левее"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Посмотрите в камеру устройства"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Лица не обнаружены"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Не перемещайте устройство."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторите попытку."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Обнаружено другое лицо."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Слишком похожее выражение лица. Измените позу."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Смотрите прямо в камеру."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Смотрите прямо в камеру."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Выровняйте голову по вертикали."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Откройте лицо."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Оборудование для распознавания лица недоступно"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Превышено время ожидания. Повторите попытку."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Невозможно сохранить распознанное лицо"</string>
<string name="face_error_canceled" msgid="283945501061931023">"Распознавание отменено"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Распознавание лица отменено пользователем."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Слишком много попыток. Повторите позже."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Слишком много попыток. Сканер отключен."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Попробуйте ещё раз"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Нет зарегистрированных лиц"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"На этом устройстве нет сканера для распознавания лица."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Лицо <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1253,9 +1286,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Открыть приложение \"<xliff:g id="NEW_APP">%1$s</xliff:g>\""</string>
<string name="new_app_description" msgid="5894852887817332322">"Приложение \"<xliff:g id="OLD_APP">%1$s</xliff:g>\" будет закрыто без сохранения."</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Объем памяти процесса \"<xliff:g id="PROC">%1$s</xliff:g>\" превышен"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Создан дамп кучи. Нажмите, чтобы отправить его."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Отправить дамп кучи?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Процесс \"<xliff:g id="PROC">%1$s</xliff:g>\" превысил объем памяти (<xliff:g id="SIZE">%2$s</xliff:g>). При необходимости отправьте созданный дамп кучи разработчику. Обратите внимание, что файл может содержать личные данные, доступные приложению."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Выберите действие для текста"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Громкость звонка"</string>
<string name="volume_music" msgid="5421651157138628171">"Громкость мультимедиа"</string>
@@ -1298,8 +1338,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Нажмите, чтобы увидеть список сетей"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Подключиться"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Все сети"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Доступна сеть Wi-Fi, найденная приложением \"<xliff:g id="NAME">%s</xliff:g>\""</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Подключиться к сетям, найденным приложением \"<xliff:g id="NAME">%s</xliff:g>\"?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Да"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Нет"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi включится автоматически"</string>
@@ -1311,9 +1353,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Регистрация в сети"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Сеть Wi-Fi не подключена к Интернету"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Нажмите, чтобы показать варианты."</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Подключено"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Изменения в настройках точки доступа"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Частота точки доступа изменена."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Устройство не может работать только на частоте 5 ГГц. Эта частота будет использоваться, когда это возможно."</string>
@@ -1398,6 +1445,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Нажмите, чтобы отключить отладку по USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Нажмите, чтобы отключить отладку по USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"В USB-порт попала вода или грязь"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-порт был автоматически отключен. Нажмите, чтобы узнать подробности."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Можно использовать USB-порт"</string>
@@ -1440,8 +1491,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Настроить"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Извлечь"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Обзор"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Сменить устройство вывода"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> не найден"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Подключите накопитель снова."</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Перенос приложения <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1974,8 +2024,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Нажмите, чтобы разблокировать раб. профиль"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Подключено к <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Нажмите, чтобы просмотреть файлы"</string>
- <string name="pin_target" msgid="3052256031352291362">"Закрепить"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Открепить"</string>
<string name="app_info" msgid="6856026610594615344">"О приложении"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Запуск деморежима…"</string>
@@ -2068,6 +2116,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Уведомление о батарее"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарея может разрядиться"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Чтобы увеличить время работы от батареи, был включен режим энергосбережения."</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Приложение Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index cc6087a..2eeaad6 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi ඇමතීම"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ක්රියාවිරහිතයි"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi වඩා කැමතියි"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ජංගම කැමතියි"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi පමණයි"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ඉදිරියට නොයවන ලදි"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"දෝෂ වර්තාව"</string>
<string name="global_action_logout" msgid="935179188218826050">"සැසිය අවසන් කරන්න"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"තිර රුව"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"දෝෂ වාර්තාවක් ගන්න"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"ඊ-තැපැල් පණිවිඩයක් ලෙස යැවීමට මෙය ඔබගේ වත්මන් උපාංග තත්වය ගැන තොරතුරු එකතු කරනු ඇත. දෝෂ වාර්තාව ආරම්භ කර එය යැවීමට සූදානම් කරන තෙක් එයට කිසියම් කාලයක් ගතවනු ඇත; කරුණාකර ඉවසන්න."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"අන්තර්ක්රියා වාර්."</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"බොහොමයක් වාතාවරණ යටතේ මෙය භාවිත කරන්න. එය ඔබට වාර්තාවේ ප්රගතිය හඹා යාමට, ගැටලුව පිළිබඳ වැඩි විස්තර ඇතුළත් කිරීමට, සහ තිර රූ ගැනීමට ඉඩ දෙයි. එය වාර්තා කිරීමට දිගු වේලාවක් ගන්නා සමහර අඩුවෙන්-භාවිත වන කොටස් මග හැරීමට හැකිය."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ස්ථානය"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"මෙම උපාංගයේ ස්ථානයට ප්රවේශ කරන්න"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g><b> වෙත මෙම උපාංගයේ ස්ථානය ලබා ගැනීමට ඉඩ දෙන්නද?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ඔබ යෙදුම භාවිතා විට පමණක් යෙදුමට ස්ථානයට ප්රවේශය ඇත."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g><b> වෙත මෙම උපාංගයේ ස්ථානය ලබා ගැනීමට සැම විට ඉඩ දෙන්නද?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ඔබ යෙදුම භාවිතා නොකරන විට පවා යෙදුමට සැම විටම ස්ථානයට ප්රවේශය ඇත."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"දින දර්ශනය"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ඔබේ දින දර්ශනයට පිවිසෙන්න"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g><b> වෙත ඔබගේ දින දර්ශනය ප්රවේශ කිරීමට ඉඩ දෙන්නද?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g><b> හට ඔබගේ දින දර්ශනය වෙත පිවිසීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ඡායාරූප සහ වීඩියෝ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ඔබගේ ඡායාරූප සහ වීඩියෝ වෙත පිවිසෙන්න"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> හට ටැග් කළ ස්ථාන ඇතුළුව, ඔබේ ඡායාරූප සහ වීඩියෝවලට ප්රවේශයට ඉඩ දෙන්න ද?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"කවුළු අන්න්තර්ගතය ලබාගන්න"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ඔබ අන්තර්ක්රියාකාරී වන කවුළුවේ අන්තර්ගතය පරීක්ෂා කරන්න."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ස්පර්ශයෙන් ගවේෂණය සක්රිය කරන්න"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ආසන්න ක්ෂේත්ර සන්නිවේදන (NFC) ටැග්, පත්, සහ කියවන්නන් සමඟ සන්නිවේදනය කිරීමට යෙදුමට අවසර දෙන්න."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ඔබගේ තිරයේ අගුල අබල කරන්න"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"යතුරු අගුල සහ ඕනෑම සම්බන්ධිත මුරපද ආරක්ෂාවක් අබල කිරීමට යෙදුමට අවසර දෙන්න. මෙහි උදාහරණයක් වන්නේ පැමිණෙන ඇමතුමක් ලැබෙද්දී, දුරකථනය අක්රිය වන අතර ඇමතුම අවසාන වන විට යතුරු අගුල නැවත සක්රිය වෙයි."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"තිර අගුළු සංකීර්ණතාව ඉල්ලන්න"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"යෙදුමට තිර අගුලෙහි තිබිය හැකි දිගෙහි පරාසය සහ වර්ගය පිළිබිඹු කරන, තිර අඟුළු සංකීර්ණතා මට්ටම (ඉහළ, මධ්යම, අඩු හෝ රහිත) දැන ගැනීමට ඉඩ දෙයි. යෙදුම පරිශීලකයින්ට තිර අගුල නිශ්චිත මට්ටමකට යාවත්කාලීන කිරීමට යෝජනා කළ හැකි නමුත් ඔවුන්ට නිදහසේ නොසලකා හැර ඉවතට සංචාලනය කළ හැකිය. තිර අගුල සරල පෙළින් ගබඩා කර නැති බැවින් යෙදුම නිවැරදි මුරපදය නොදන්නා බව සලකන්න."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ජීවමිතික දෘඪාංග භාවිත කරන්න"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"සත්යාපනය සඳහා ජීවමිතික දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"ඇඟිලි සලකුණු දෘඩාංග කළමනාකරණය කිරීම."</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"මුහුණු අච්චු එකතු කිරීමට සහ ඉවත් කිරීමට අදාළ ක්රම භාවිතය සඳහා මෙම යෙදුමට ඉඩ දෙයි."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"මුහුණු සත්යාපක දෘඪාංග භාවිතා කරන්න"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"සත්යාපනය සඳහා සත්යාපක දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"මුහුණ සැකසීමට නොහැකි විය. කරුණාකර නැවත උත්සාහ කර."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"මුහුණ දීප්තිමත් වැඩිය. කරුණාකර අඩු ආලෝකය උත්සාහ කරන්න."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"මුහුණ අඳුරු වැඩිය. කරුණාර ආලෝක ප්රභවය නිරාවරණය කරන්න."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"කරුණාකර සංවේදකය මුහුණෙන් වඩා ඈත් කරන්න."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"කරුණාකර සංවේදකය මුහුණ සමීපයට ගෙන එන්න."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"කරුණාකර සංවේදකය ඉහළට ගෙන යන්න."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"කරුණාකර සංවේදකය පහළට ගෙන යන්න."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"කරුණාකර සංවේදකය දකුණට ගෙන යන්න."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"කරුණාකර සංවේදකය වමට ගෙන යන්න."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"කරුණාකර සංවේදකය දෙස බලන්න."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"මුහුණ අනාවරණය කර නොගන්නා ලදී."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"චලනය ඉතා වැඩියි."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"වෙනත් මුහුණක් අනාවරණ විය."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"ඉතා සමානයි, ඔබේ හැඩ ගැසීම වෙනස් කරන්න."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"කැමරාව වෙත තවත් ඍජුව බලන්න."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"කැමරාව වෙත තවත් ඍජුව බලන්න."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"ඔබේ හිස සිරස් ආකාරයේ කෙළින් කරන්න."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"ඔබේ මුහුණ අරින්න."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"මුහුණු දෘඪාංගය ලද නොහැකිය."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"මුහුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"මුහුණ ගබඩා කළ නොහැක."</string>
<string name="face_error_canceled" msgid="283945501061931023">"මුහුණු මෙහෙයුම අවලංගු කරන ලදී."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"පරිශීලකයා විසින් මුහුණ සත්යාපනය අවලංගු කරන ලදී."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"උත්සාහයන් ඉතා වැඩි ගණනකි. පසුව නැවත උත්සාහ කරන්න."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"උත්සාහයන් ඉතා වැඩි ගණනකි. මුහුණු සත්යාපනය අබල කරන ලදී."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"නැවත උත්සාහ කරන්න."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"මුහුණක් ඇතුළත් කර නොමැත."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"මෙම උපාංගයේ මුහුණු සත්යාපන සංවේදකයක් නැත."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"මුහුණු <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1215,9 +1248,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> විවෘත කරන්න"</string>
<string name="new_app_description" msgid="5894852887817332322">"සුරැකීමෙන් තොරව <xliff:g id="OLD_APP">%1$s</xliff:g> වැසෙනු ඇත"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> මතකයේ සීමාව ඉක්මවා ඇත"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"ඉවත දැමීම් ගොඩ රැස් කරන ලදී. බෙදා ගැනීමට තට්ටු කරන්න"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"සංච නික්ෂේපය බෙදාගන්න ද?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> ක්රියාවලිය එහි ක්රියාවලියේ <xliff:g id="SIZE">%2$s</xliff:g> මතකය ඉක්මවා ඇත. ඔබට එහි වර්ධකයන් සමග බෙදාගැනීමට සංච නික්ෂේපයක් ඇත. ප්රවේසම් වන්න: මෙම යෙදුම පිවිසිය හැකි ඔබගේ පෞද්ගලික තොරතුරු මෙම සංච නික්ෂේපයෙහි අඩංගු වී තිබිය හැකිය."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"පෙළ සඳහා ක්රියාව තෝරන්න"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"හඬ නඟනයේ ශබ්දය"</string>
<string name="volume_music" msgid="5421651157138628171">"මාධ්ය ශබ්දය"</string>
@@ -1256,8 +1296,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"සියලු ජාල බැලීමට තට්ටු කරන්න"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"සම්බන්ධ කරන්න"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"සියලු ජාල"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> විසින් යෝජිත Wi-Fi ජාලයක් ලැබේ"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"ඔබට <xliff:g id="NAME">%s</xliff:g> විසින් යෝජනා කරනු ලබන ජාල වෙත සම්බන්ධ කිරීමට අවශ්යද?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ඔව්"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"නැත"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ස්වයංක්රියව ක්රියාත්මක වනු ඇත"</string>
@@ -1269,9 +1311,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ජාලයට පුරනය වන්න"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi සඳහා අන්තර්ජාල ප්රවේශය නැත"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"විකල්ප සඳහා තට්ටු කරන්න"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"සම්බන්ධයි"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"ඔබගේ හොට්ස්පොට් සැකසීම්වලට වෙනස් කිරීම්"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ඔබගේ හොට්ස්පොට් කලාපය වෙනස් වී ඇත."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"මෙම උපාංගය 5GHz සඳහා ඔබේ මනාපවලට සහාය නොදක්වයි. ඒ වෙනුවට, මෙම උපාංගය ලබා ගත හැකි විට 5GHz කලාපය භාවිතා කරනු ඇත."</string>
@@ -1356,6 +1403,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB නිදොස්කරණය සම්බන්ධිතයි"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB නිදොස් කිරීම ක්රියාවිරහිත කිරීමට තට්ටු කරන්න"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB නිදොස්කරණය අබල කිරීමට තෝරන්න."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB තොට තුළ ද්රව හෝ කුණු"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB තොට ස්වයංක්රීයව අබල කෙරේ. තවත් දැන ගැනීමට තට්ටු කරන්න."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB තොට භාවිත කිරීම ආරක්ෂිතයි"</string>
@@ -1907,8 +1958,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"කාර්යාල පැතිකඩ අගුලු හැරීමට තට්ටු කරන්න"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> වෙත සම්බන්ධ විය"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ගොනු බැලීමට තට්ටු කරන්න"</string>
- <string name="pin_target" msgid="3052256031352291362">"අමුණන්න"</string>
- <string name="unpin_target" msgid="3556545602439143442">"ගලවන්න"</string>
<string name="app_info" msgid="6856026610594615344">"යෙදුම් තොරතුරු"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ආදර්ශනය ආරම්භ කරමින්..."</string>
@@ -1999,6 +2048,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"දිනචරියා ප්රකාර තතු දැනුම්දීම"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"බැටරිය සුපුරුදු ආරෝපණයට පෙර ඉවර විය හැක"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"බැටරි සුරැකුම බැටරි ආයු කාලය දීර්ඝ කිරීමට සක්රිය කෙරිණි"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ෆෝල්ඩරය"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android යෙදුම"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ගොනුව"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 067165b..d776d0a 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -143,8 +143,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Klicanje prek Wi-Fi-ja"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"Govor prek Wi-Fi-ja"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Izklopljeno"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Prednostno Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Prednostno mobilno"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Samo Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ni posredovano"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -232,7 +234,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Poročilo o napakah"</string>
<string name="global_action_logout" msgid="935179188218826050">"Končaj sejo"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Posnetek zaslona"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Ustvari poročilo o napakah"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"S tem bodo zbrani podatki o trenutnem stanju naprave, ki bodo poslani v e-poštnem sporočilu. Izvedba poročila o napakah in priprava trajata nekaj časa, zato bodite potrpežljivi."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktivno poročilo"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"To možnost uporabite v večini primerov. Omogoča spremljanje poteka poročila, vnos več podrobnosti o težavi in snemanje posnetkov zaslona. Morda bodo izpuščeni nekateri redkeje uporabljani razdelki, za katere je poročanje dolgotrajno."</string>
@@ -287,9 +290,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"dostop do lokacije te naprave"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti dostop do lokacije te naprave?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacija bo imela dostop do lokacije samo, ko aplikacijo uporabljate."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> vedno dovoliti dostop do lokacije te naprave?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacija bo vedno imela dostop do lokacije, tudi ko aplikacije ne uporabljate."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Koledar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"dostop do koledarja"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti dostop do koledarja?"</string>
@@ -322,7 +328,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti dostop do glasbe?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografije in videoposnetki"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"dostop do fotografij in videoposnetkov"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Želite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočiti dostop do fotografij, videoposnetkov in v njih označenih lokacij?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pridobiti vsebino okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Preverjanje vsebine okna, ki ga uporabljate."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vklopiti raziskovanje z dotikom"</string>
@@ -515,8 +524,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Podpira komunikacijo med računalnikom in oznakami, karticami in bralniki komunikacije s tehnologijo bližnjega polja."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"onemogočanje zaklepanja zaslona"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Aplikaciji dovoljuje, da onemogoči zaklep tipkovnice in morebitno povezano varnostno geslo. Telefon na primer onemogoči zaklep tipkovnice pri dohodnem klicu ter vnovič omogoči zaklep, ko je klic končan."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"zahteva zapletenost zaklepanja zaslona"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Aplikaciji dovoljuje, da pridobi raven zapletenosti zaklepanja zaslona (visoka, srednja, nizka ali brez), ki označuje možen obseg dolžine in vrsto zaklepanja zaslona. Aplikacija lahko tudi predlaga uporabnikom, da posodobijo zaklepanje zaslona na določeno raven, vendar lahko uporabniki to opozorilo prezrejo in ga zaprejo tako, da se pomaknejo stran. Upoštevajte, da zaklepanje zaslona ni shranjeno v navadnem besedilu, tako da aplikacija ne pozna točnega gesla."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"uporaba strojne opreme za biometrične podatke"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Aplikaciji omogoča uporabo strojne opreme za biometrične podatke za preverjanje pristnosti"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"upravljanje strojne opreme za prstne odtise"</string>
@@ -571,37 +582,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Aplikaciji omogoča sprožanje načinov za dodajanje in brisanje predlog z obrazi za uporabo."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"uporaba strojne opreme za preverjanje pristnosti obraza"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aplikaciji omogoča uporabo strojne opreme za preverjanje pristnosti obraza"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Obraza ni bilo mogoče obdelati. Poskusite znova."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Obraz je presvetel. Poskusite pri manj svetlobe."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Obraz je pretemen. Odkrijte vir svetlobe."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Tipalo premaknite dlje od obraza."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Tipalo premaknite bliže obrazu."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Tipalo premaknite višje."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Tipalo premaknite nižje."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Tipalo premaknite v desno."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Tipalo premaknite v levo."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Poglejte v tipalo."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Ni zaznanih obrazov."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Preveč se premikate."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Znova prijavite svoj obraz."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Zaznan je drug obraz."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Preveč podobno, spremenite položaj."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Glejte bolj naravnost v fotoaparat."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Glejte bolj naravnost v fotoaparat."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Zravnajte glavo."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Odkrijte si obraz."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Strojna oprema za prepoznavo obraza ni na voljo."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Dosežena časovna omejitev za obraz. Poskusite znova."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Obraza ni mogoče shraniti."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Dejanje z obrazom je bilo preklicano."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Preverjanje pristnosti obraza preklical uporabnik"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Preveč poskusov. Poskusite znova pozneje."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Preveč poskusov. Preverjanje pristnosti obraza je onemogočeno."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Poskusite znova."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Ni prijavljenih obrazov."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Ta naprava nima tipala za preverjanje pristnosti obraza."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Obraz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1253,9 +1286,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Odpri <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"Aplikacija <xliff:g id="OLD_APP">%1$s</xliff:g> se bo zaprla brez shranjevanja"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> je presegel omejitev pomnilnika"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Izvoz kopice je zbran. Dotaknite se za deljenje z drugimi."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Deljenje izvoza kopice z drugimi?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> je presegel <xliff:g id="SIZE">%2$s</xliff:g> omejitve pomnilnika za proces. Izvoz kopice je na voljo, da ga delite z razvijalcem. Previdno: izvoz kopice lahko vsebuje vaše osebne podatke, do katerih ima aplikacija dostop."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Izberite dejanje za besedilo"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Glasnost zvonjenja"</string>
<string name="volume_music" msgid="5421651157138628171">"Glasnost predstavnosti"</string>
@@ -1298,8 +1338,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dotaknite se, če si želite ogledati vsa omrežja"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Vzpostavi povezavo"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Vsa omrežja"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Na voljo je omrežje Wi-Fi po predlogu aplikacije <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Želite vzpostaviti povezavo z omrežji, ki jih predlaga aplikacija <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Povezava Wi‑Fi se bo samodejno vklopila"</string>
@@ -1311,9 +1353,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Prijava v omrežje"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Omrežje Wi-Fi nima dostopa do interneta"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dotaknite se za možnosti"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Povezava je vzpostavljena"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Spremembe nastavitev dostopne točke"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pas dostopne točke je spremenjen."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ta naprava ne podpira prednostne nastavitve samo za 5-GHz pas. Namesto tega bo ta naprava uporabljala 5-GHz pas, ko bo na voljo."</string>
@@ -1398,6 +1445,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Iskanje napak prek USB je povezano"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Dotaknite se, če želite izklopiti odpravljanje napak prek USB-ja"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Izberite, če želite onemogočiti iskanje in odpravljanje napak prek vrat USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"V vratih USB je tekočina ali umazanija"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Vrata USB so samodejno onemogočena. Dotaknite se, če želite izvedeti več."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Vrata USB so varna za uporabo"</string>
@@ -1973,8 +2024,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Dotaknite se za odkl. del. pr."</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Vzpostavljena povezava z napravo <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Dotaknite se, če si želite ogledati datoteke"</string>
- <string name="pin_target" msgid="3052256031352291362">"Pripenjanje"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Odpenjanje"</string>
<string name="app_info" msgid="6856026610594615344">"Podatki o aplikaciji"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Začenjanje predstavitve …"</string>
@@ -2067,6 +2116,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rutinsko informativno obvestilo o načinu delovanja"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akumulator se bo morda izpraznil, preden ga običajno priključite na polnjenje"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Vklopilo se je varčevanje z energijo akumulatorja za podaljšanje časa delovanja akumulatorja"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Mapa"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplikacija za Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Datoteka"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 61703f3..ce9c564 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Telefonatë me WiFi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Çaktivizuar"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferohet Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferohet rrjeti celular"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Vetëm Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nuk u transferua"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Raporti i defekteve në kod"</string>
<string name="global_action_logout" msgid="935179188218826050">"Jepi fund sesionit"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Pamja e ekranit"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Merr raportin e defekteve në kod"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Ky funksion mundëson mbledhjen e informacioneve mbi gjendjen aktuale të pajisjes për ta dërguar si mesazh mail-i. Do të duhet pak kohë nga nisja e raportit të defekteve në kod. Faleminderit për durimin."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Raport interaktiv"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Përdore këtë në shumicën e rrethanave. Të lejon të gjurmosh progresin e raportit dhe të fusësh më shumë detaje rreth problemit dhe të regjistrosh pamje të ekranit. Mund të fshijë disa seksione që përdoren më pak të cilat kërkojnë shumë kohë për t\'u raportuar."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Vendndodhja"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"qaset te vendndodhja e kësaj pajisjeje"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te vendndodhja e kësaj pajisjeje?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacioni do të ketë qasje te vendndodhja vetëm kur po e përdor aplikacionin."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Të lejohet gjithmonë që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te vendndodhja?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacioni do të ketë gjithmonë qasje te vendndodhja, edhe kur nuk po e përdor aplikacionin."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendari"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"qasje te kalendari yt"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te kalendari yt?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të ketë qasje te muzika jote?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotografitë dhe videot"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"qasu te fotografitë dhe videot e tua"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Të lejohet që <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> të qaset te fotografitë dhe videot e tua, duke përfshirë vendndodhjet e etiketuara?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Nxjerrë përmbajtjen e dritares"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspekton përmbajtjen e dritares me të cilën po ndërvepron."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivizojë funksionin \"Eksploro me prekje\""</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Lejon aplikacionin të komunikojë me etiketimet e \"Komunikimit të fushës së afërt (NFC)\", kartat dhe lexuesit."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"çaktivizo kyçjen e ekranit"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Lejon aplikacionin të çaktivizojë kyçjen e tasteve dhe çdo mbrojtje të lidhur me fjalëkalimin. Për shembull, telefoni çaktivizon kyçjen e tasteve kur merr një telefonatë hyrëse, pastaj riaktivizon kyçjen e tasteve kur mbaron telefonata."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"kërko kompleksitetin e kyçjes së ekranit"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Lejo që aplikacioni të mësojë nivelin e kompleksitetit të kyçjes së ekranit (i lartë, i mesëm, i ulët ose asnjë), që tregon gamën e mundshme të gjatësisë dhe llojin e kyçjes së ekranit. Aplikacioni mund t\'u sugjerojë gjithashtu përdoruesve që të përditësojnë kyçjen e ekranit në një nivel të caktuar, por përdoruesit mund ta shpërfillin lirshëm dhe të navigojnë më tej. Ki parasysh se kyçja e ekranit nuk ruhet në tekst të thjeshtë, prandaj aplikacioni nuk e di fjalëkalimin e saktë."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"përdor harduerin biometrik"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"E lejon aplikacionin që të përdorë harduerin biometrik për vërtetimin"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"të menaxhojë harduerin e gjurmës së gishtit"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Lejon aplikacionin të aktivizojë mënyra për shtim e fshirje të shablloneve të përdorura."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"përdor harduerin për vërtetimin e fytyrës"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Lejon aplikacionin të përdorë harduer vërtetimi të fytyrës për procesin e vërtetimit"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Fytyra nuk mund të përpunohej. Provo sërish."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Fytyra ka shumë ndriçim. Provo me më pak ndriçim."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Fytyra shumë e errët. Zbulo burimin e dritës."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Lëvize sensorin pak më larg fytyrës."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Sille sensorin më pranë fytyrës."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Lëvize sensorin më lart."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Lëvize sensorin më poshtë."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Lëvize sensorin djathtas."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Lëvize sensorin majtas."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Shiko nga sensori"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nuk u diktua fytyrë"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Ka shumë lëvizje."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Regjistroje përsëri fytyrën tënde."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"U diktua fytyrë tjetër."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Tepër e ngjashme, ndrysho pozën"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Shikoje kamerën më drejt."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Shikoje kamerën më drejt."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Drejtoje kokën vertikalisht"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Zbuloje fytyrën"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Nuk ka harduer për fytyrën."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Mbaroi afati për fytyrën. Provo sërish."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Fytyra nuk mund të ruhet."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Veprimi me fytyrën u anulua."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Vërtetimi me fytyrë u anulua nga përdoruesi."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Shumë përpjekje. Provo sërish më vonë."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Shumë përpjekje. Vërtetimi për fytyrën joaktiv."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Provo sërish."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nuk ka fytyrë të regjistruar."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Kjo pajisje nuk ka sensor vërtetimi për fytyrën."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Fytyra <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Hap <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> do të mbyllet pa u ruajtur"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> e ka kaluar kufirin e memories"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Stiva e skedarëve fiktivë është mbledhur. Trokit për t\'i ndarë."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Të ndahet stiva e skedarëve fiktivë?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Procesi <xliff:g id="PROC">%1$s</xliff:g> ka kaluar kufirin e tij të memories së procesit me <xliff:g id="SIZE">%2$s</xliff:g>. Mundësohet stivimi e skedarëve fiktivë në mënyrë që t\'i ndani me zhvilluesit e tyre. Bëni kujdes pasi stiva e skedarëve fiktivë mund të përmbajë ndonjë informacion tëndin personal ku aplikacioni ka qasje."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Zgjidh një veprim për tekstin"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volumi i ziles"</string>
<string name="volume_music" msgid="5421651157138628171">"Volumi i medias"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trokit për të parë të gjitha rrjetet"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Lidhu"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Të gjitha rrjetet"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Ofrohet një rrjet Wi‑Fi i propozuar nga <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Dëshiron të lidhesh me rrjetet e propozuara nga <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Po"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Jo"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi do të aktivizohet automatikisht"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Identifikohu në rrjet"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nuk ka qasje në internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Trokit për opsionet"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Lidhur"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Ndryshimet në cilësimet e zonës së qasjes për internet"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Brezi yt i zonës së qasjes për internet ka ndryshuar."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Kjo pajisje nuk e mbështet preferencën për vetëm 5 GHz. Përkundrazi, pajisja do të përdorë brezin 5 GHz nëse ka."</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Korrigjuesi i USB-së i lidhur"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Trokit për të çaktivizuar korrigjimin e USB-së"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Përzgjidhe për të çaktivizuar korrigjimin e gabimeve të USB-së"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Lëngje ose papastërti në portën e USB-së"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Porta e USB-së është çaktivizuar automatikisht. Trokit për të mësuar më shumë."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Nuk ka rrezik të përdoret porta e USB-së"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Trokit për ta shkyçur profilin e punës"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"U lidh me <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Trokit për të parë skedarët"</string>
- <string name="pin_target" msgid="3052256031352291362">"Gozhdo"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Zhgozhdo"</string>
<string name="app_info" msgid="6856026610594615344">"Informacioni mbi aplikacionin"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Po nis demonstrimin..."</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Njoftimi i informacionit të \"Modalitetit rutinë\""</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateria mund të mbarojë përpara ngarkimit të zakonshëm"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"\"Kursyesi i baterisë\" u aktivizua për të zgjatur jetëgjatësinë e baterisë"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Dosje"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Aplikacion i Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Skedar"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 68c272c..1d7ae45 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -142,8 +142,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Позивање преко Wi-Fi-ја"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Искључено"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Предност има Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Желим мобилне податке"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Само Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Није прослеђено"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -230,7 +232,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Извештај о грешци"</string>
<string name="global_action_logout" msgid="935179188218826050">"Заврши сесију"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Снимак екрана"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Направи извештај о грешци"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Овим ће се прикупити информације о тренутном стању уређаја како би биле послате у поруци е-поште. Од започињања извештаја о грешци до тренутка за његово слање проћи ће неко време; будите стрпљиви."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактив. извештај"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Користите ово у већини случајева. То вам омогућава да пратите напредак извештаја, да уносите додатне детаље о проблему и да снимате снимке екрана. Вероватно ће изоставити неке мање коришћене одељке за које прављење извештаја дуго траје."</string>
@@ -284,9 +287,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Локација"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"приступи локацији овог уређаја"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа локацији овог уређаја?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Апликација ће имати приступ локацији само док користите апликацију."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа локацији овог уређаја?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Апликација ће увек имати приступ локацији, чак и када не користите апликацију."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"приступи календару"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа календару?"</string>
@@ -319,7 +325,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Желите ли да омогућите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа музици?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Слике и видео снимци"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"приступ сликама и видео снимцима"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Желите ли да дозволите да „<xliff:g id="APP_NAME">%1$s</xliff:g>“ приступа сликама и видео снимцима, укључујући означене локације?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"да преузима садржај прозора"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Проверава садржај прозора са којим остварујете интеракцију."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"да укључи Истраживања додиром"</string>
@@ -512,8 +521,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Дозвољава апликацији да комуницира са ознакама, картицама и читачима комуникације кратког домета (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"онемогућавање закључавања екрана"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Дозвољава апликацији да онемогући закључавање тастатуре и све повезане безбедносне мере са лозинкама. На пример, телефон онемогућава закључавање тастатуре при пријему долазног телефонског позива, а затим га поново омогућава по завршетку позива."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"тражење сложености закључавања екрана"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Дозвољава апликацији да сазна ниво сложености закључавања екрана (висока, средња, ниска или ниједна), што указује на могући опсег трајања и тип закључавања екрана. Апликација може и да предлаже корисницима да ажурирају закључавање екрана на одређени ниво, али корисници слободно могу да занемаре то и да иду на друге странице. Имајте на уму да се подаци за закључавање екрана не чувају као обичан текст, па апликација не зна тачну лозинку."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"користи биометријски хардвер"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Дозвољава апликацији да користи биометријски хардвер за потврду идентитета"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"управљај хардвером за отиске прстију"</string>
@@ -568,37 +579,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Дозвољава да апликација активира методе за додавање и брисање шаблона лица ради коришћења."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"коришћење хардв. за потврду идентитета помоћу лица"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Дозвољава да апликација користи хардвер за потврду идентитета помоћу лица"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Обрада лица није успела. Пробајте поново."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Лице је пресветло. Пробајте са слабијим осветљењем."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Лице је исувише тамно. Откријте извор светла."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Удаљите сензор од лица."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Приближите сензор лицу."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Померите сензор навише."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Померите сензор наниже."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Померите сензор удесно."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Померите сензор улево."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Гледајте у сензор."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Није откривено ниједно лице."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Много се померате."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Поново региструјте лице."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Откривено је друго лице."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Превише је слично, промените позу."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Гледајте право у камеру."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Гледајте право у камеру."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Исправите главу."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Откријте лице."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Харвдер за лице није доступан."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Истекло је време за проверу лица. Пробајте поново."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Није могуће сачувати лице."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Обрада лица је отказана."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Корисник је отказао потврду лица."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Превише покушаја. Пробајте поново касније."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Више покушаја. Потврда идентитета је онемогућена."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Пробајте поново."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Није регистровано ниједно лице."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Овај уређај нема сензор за потврду идентитета помоћу лица."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1233,9 +1266,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Отвори <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ће се затворити без чувања"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> премашује ограничење меморије"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Снимак динамичког дела меморије је направљен. Додирните за дељење."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Желите ли да делите снимак динамичког дела меморије?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Процес <xliff:g id="PROC">%1$s</xliff:g> је премашио ограничење меморије за процес од <xliff:g id="SIZE">%2$s</xliff:g>. Снимак динамичког дела меморије је доступан и можете да га делите са програмером. Будите опрезни: овај снимак динамичког дела меморије може да садржи неке личне податке којима апликација може да приступа."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Изаберите радњу за текст"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Јачина звука звона"</string>
<string name="volume_music" msgid="5421651157138628171">"Јачина звука медија"</string>
@@ -1276,8 +1316,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Додирните да бисте видели све мреже"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Повежи"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Све мреже"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Wi‑Fi мрежа коју предлаже <xliff:g id="NAME">%s</xliff:g> је доступна"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Желите ли да се повежете на мреже које предлаже <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Да"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Не"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ће се аутоматски укључити"</string>
@@ -1289,9 +1331,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Пријавите се на мрежу"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi нема приступ интернету"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Додирните за опције"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Повезано је"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Промене подешавања за хотспот"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Опсег хотспота је промењен."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Овај уређај не подржава подешавање само за 5 GHz. Уређај ће користити опсег од 5 GHz када буде доступан."</string>
@@ -1376,6 +1423,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отклањање грешака са USB-а је омогућено"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Додирните да бисте искључили отклањање грешака са USB-а"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Изаберите да бисте онемогућили отклањања грешака са USB-а."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Течност или нечистоћа у USB порту"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB порт је аутоматски искључен. Додирните да бисте сазнали више."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Коришћење USB порта је безбедно"</string>
@@ -1939,8 +1990,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Додиром откљ. профил за Work"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Повезано је са производом <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Додирните за преглед датотека"</string>
- <string name="pin_target" msgid="3052256031352291362">"Закачи"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Откачи"</string>
<string name="app_info" msgid="6856026610594615344">"Информације о апликацији"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Покрећемо демонстрацију..."</string>
@@ -2032,6 +2081,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Обавештење о информацијама Рутинског режима"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батерија ће се можда испразнити пре уобичајеног пуњења"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Уштеда батерије је активирана да би се продужило трајање батерије"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Директоријум"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android апликација"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Датотека"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index aaf33bb..02f47d9 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi-samtal"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Av"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi i första hand"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Använd mobildata"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Endast Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Vidarebefordras inte"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Felrapport"</string>
<string name="global_action_logout" msgid="935179188218826050">"Avsluta session"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skärmdump"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Skapa felrapport"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Nu hämtas information om aktuell status för enheten, som sedan skickas i ett e-postmeddelade. Det tar en liten stund innan felrapporten är färdig och kan skickas, så vi ber dig ha tålamod."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv rapport"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Bör användas i de flesta fall. Då kan du spåra rapportförloppet, ange mer information om problemet och ta skärmdumpar. En del mindre använda avsnitt, som det tar lång tid att rapportera om, kan uteslutas."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Plats"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"komma åt enhetens platsuppgifter"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomst till enhetens plats?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Appen har endast åtkomst till platsen när du använder den."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomst till enhetens plats?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Appen har alltid åtkomst till platsen, även om du inte använder den."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"få tillgång till din kalender"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomst till din kalender?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vill du ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till din musik?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Foton och videor"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"åtkomstbehörighet till dina foton & videor"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vill du tillåta att <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> får åtkomst till dina foton och videor, inklusive taggade platser?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Hämta fönsterinnehåll"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Granska innehållet i ett fönster som du interagerar med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivera Explore by touch"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Tillåter att appen kommunicerar med etiketter, kort och läsare för närfältskommunikation (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"inaktivera skärmlåset"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Tillåter att appen inaktiverar tangentlåset och tillhörande lösenordsskydd. Ett exempel kan vara att tangentlåset inaktiveras vid inkommande samtal och aktiveras igen när samtalet är avslutat."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"begär komplexitetsnivå för skärmlåset"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Tillåter att appen får reda på komplexitetsnivån för skärmlåset (hög, mellan, låg eller ingen). Detta ger en indikation på skärmlåsets möjliga längd och typ. Appen kan även föreslå att skärmlåset uppdateras till en viss nivå, men användare kan ignorera förslaget och fortsätta navigera. Observera att skärmlåset inte lagras i vanlig text så appen får inte reda på det exakta lösenordet."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"använd biometrisk maskinvara"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Tillåter att appen använder biometrisk maskinvara vid autentisering"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"hantera maskinvara för fingeravtryck"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Tillåter att appen anropar metoder för att lägga till och radera ansiktsmallar."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"använda maskinvara för ansiktsautentisering"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tillåter att appen använder maskinvara för ansiktsigenkänning vid autentisering"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Det gick inte att läsa av ansiktet. Försök igen."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Ansiktet är för ljust. Testa i svagare belysning."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Ansiktet är för mörkt. Testa i starkare belysning."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Flytta sensorn längre ifrån ansiktet."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Ha sensorn närmare ansiktet."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Flytta sensorn uppåt."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Flytta sensorn nedåt."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Flytta sensorn åt höger."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Flytta sensorn åt vänster."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Titta på sensorn."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Inget ansikte hittades."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"För mycket rörelse."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrera ansiktet på nytt."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Ett annat ansiktet har upptäckts."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"För likt. Ändra ansiktsposition."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Titta rakt in i kameran."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Titta rakt in i kameran."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Räta på huvudet vertikalt."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Skym inte ansiktet."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Maskinvara för ansiktsigenkänning saknas."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Tidsgränsen för ansikte har nåtts. Försök igen."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Det gick inte att lagra ansiktet."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Ansiktsåtgärden har avbrutits."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Autentiseringen av ansiktet avbröts av användaren."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Du har gjort för många försök. Försök igen senare."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"För många försök. Ansiktsautentisering inaktiverad"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Försök igen."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Inget ansikte har registrerats."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Enheten har ingen sensor för ansiktsautentisering."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Ansikte <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Öppna <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> stängs utan att spara"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Minnesgränsen har överskridits för <xliff:g id="PROC">%1$s</xliff:g>"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"En minnesdump har skapats. Tryck här om du vill dela den."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vill du dela minnesdumpen?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Minnesgränsen på <xliff:g id="SIZE">%2$s</xliff:g> har överskridits för processen <xliff:g id="PROC">%1$s</xliff:g>. En dump av minnesheapen har skapats så att du kan dela den med utvecklaren. Var försiktig: minnesdumpen kan innehålla personliga uppgifter som appen har åtkomst till."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Välj en åtgärd för text"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringvolym"</string>
<string name="volume_music" msgid="5421651157138628171">"Mediavolym"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tryck för att visa alla nätverk"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Anslut"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alla nätverk"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Det finns ett tillgängligt Wi‑Fi-nätverk som föreslås av <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Vill du ansluta till nätverk som föreslås av <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nej"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi aktiveras automatiskt"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Logga in på nätverket"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi-nätverket är inte anslutet till internet"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tryck för alternativ"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Ansluten"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Ändringar i inställningarna för surfzon"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Frekvensbandet för surfzonen har ändrats."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Den här enheten har inte stöd för inställningen för att endast använda 5 GHz. I stället används 5 GHz när det är möjligt."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-felsökning ansluten"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Tryck för att inaktivera USB-felsökning"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Välj för att inaktivera USB-felsökning."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Vätska eller smuts i USB-porten"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-porten har inaktiverats automatiskt. Tryck för att läsa mer."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Nu kan du använda USB-porten igen"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tryck och lås upp jobbprofilen"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Ansluten till <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Filerna visas om du trycker här"</string>
- <string name="pin_target" msgid="3052256031352291362">"Fäst"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Lossa"</string>
<string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
<string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Demo startas …"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Avisering om rutinläge"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batteriet kan ta slut innan du brukar ladda det"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterisparläget har aktiverats för att utöka batteritiden"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Mapp"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android-app"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fil"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index ae7531b0..358c1fb 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Kupiga simu kupitia WiFi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Imezimwa"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi inapedelewa"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mtandao wa simu unapendelewa"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi pekee"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Haijatumiwa mwingine"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Ripoti ya hitilafu"</string>
<string name="global_action_logout" msgid="935179188218826050">"Maliza kipindi"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Picha ya skrini"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Chukua ripoti ya hitilafu"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Hii itakusanya maelezo kuhusu hali ya kifaa chako kwa sasa, na itume kama barua pepe. Itachukua muda mfupi tangu ripoti ya hitilafu ianze kuzalishwa hadi iwe tayari kutumwa; vumilia."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Ripoti ya kushirikiana"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Tumia chaguo hili katika hali nyingi. Hukuruhusu kufuatilia jinsi ripoti yako inavyoendelea, kuandika maelezo zaidi kuhusu tatizo na kupiga picha za skrini. Huenda ikaacha baadhi ya sehemu ambazo hazitumiki sana na zinachukua muda mrefu kuripoti."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Mahali"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"itambue mahali kifaa hiki kilipo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> itambue mahali kifaa kilipo?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Programu itafikia tu data ya mahali ulipo unaipotumia."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Ungependa kuruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie data ya mahali kifaa hiki kilipo kila wakati?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Programu itaweza kufikia data ya mahali kifaa kilipo hata wakati huitumii."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ifikie kalenda yako"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie kalenda yako?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie muziki wako?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Picha na video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"kufikia picha na video zako"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Ungependa kuruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ufikie picha na video zako, yakiwemo maeneo uliyotambulisha?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Kufikia maudhui ya dirisha"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kuchunguza maudhui ya dirisha unalotumia."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Kuwasha \'Chunguza kwa Kugusa\'"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Inaruhusu programu kuwasiliana na lebo, kadi na wasomaji wa Near Field Communication (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"zima kufuli la skrini yako"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Inaruhusu programu kulemaza ufunguo wa vitufe na usalama mwingine ambata wa nenosiri. Kwa mfano, simu inalemaza ufunguo wa viitufe inapopokea simu inayoingia, kisha inawezesha upya ufunguo wa vitufe wakati simu inapokamilika."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"iombe kiwango cha uchangamano wa kufunga skrini"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Huruhusu programu kupata maelezo kuhusu kiwango cha uchangamano wa kufunga skrini (juu, wastani, chini au hakuna), ambacho huashiria urefu unaowezekana na aina ya kufunga skrini. Programu pia inaweza kumpendekezea mtumiaji asasishe mbinu ya kufunga skrini iwe ya kiwango fulani lakini mtumiaji anaweza kuamua kupuuza na kuendelea. Kumbuka kuwa maelezo ya kufunga skrini hayahifadhiwi kama maandishi, hivyo programu haitambui nenosiri mahususi."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"tumia maunzi ya kibiolojia"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Huruhusu programu itumie maunzi ya kibiolojia katika uthibitishaji"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"dhibiti maunzi ya kitambulisho"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Huruhusu programu iombe njia za kuongeza na kufuta violezo vya uso vitakavyotumiwa."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"tumia maunzi ya kuthibistiha uso"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Huruhusu programu ithibitishe uso kwa kutumia maunzi ya kuthibitisha"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Imeshindwa kuchakata uso. Tafadhali jaribu tena."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Uso unang\'aa sana. Tafadhalia punguza mwangaza."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Uso hauna mwangaza wa kutosha. Tafadhali ongeza mwangaza."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Tafadhali sogeza kitambuzi mbali na uso."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Tafadhali sogeza kitambuzi karibu na uso."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Tafadhali sogeza kitambuzi juu."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Tafadhali sogeza kitambuzi chini."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Tafadhali sogeza kitambuzi kulia."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Tafadhali sogeza kitambuzi kushoto."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Tafadhali angalia kitambuzi."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Haikutambua uso wowote"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Inatikisika sana."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Tafadhali sajili uso wako tena."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Imetambua uso tofauti."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Inafanana sana, tafadhali badilisha mkao wako."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Tafadhali angalia kamera moja kwa moja."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Tafadhali angalia kamera moja kwa moja."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Tafadhali simamisha kichwa chako wima."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Tafadhali usifunike uso wako."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Maunzi ya uso hayapatikani."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Muda wa kutambua uso umeisha. Jaribu tena."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Huwezi kuhifadhi uso."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Utendaji wa kitambulisho umeghairiwa."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Uthibitishaji wa uso umeghairiwa na mtumiaji."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Umejaribu mara nyingi mno. Jaribu tena baadaye."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Umejaribu mara nyingi mno. Kitambuzi cha uso kimezimwa."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Jaribu tena."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Hujasajili uso wowote."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Kifaa hiki hakina kitambuzi kinachothibitisha uso."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Uso wa <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Fungua <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> itajifunga bila kuhifadhi mabadiliko"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> imezidi kiwango cha hifadhi kinachotakikana"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Imezidi kikomo cha hifadhi. Gusa ili ushiriki."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Ungependa kushiriki picha ya binafsi?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Mchakato wa <xliff:g id="PROC">%1$s</xliff:g> umezidi kiwango kinachotakikana cha hifadhi cha <xliff:g id="SIZE">%2$s</xliff:g>. Unaweza kupata picha ya hifadhi ili uishiriki na msadini programu wa picha. Tahadhari: picha hii ya hifadhi inaweza kuwa na maelezo yako ya binafsi ambayo yanaweza kufikiwa na programu."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Chagua kitendo kwa ajili ya maandishi"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Sauti ya mlio"</string>
<string name="volume_music" msgid="5421651157138628171">"Sauti ya muziki"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Gusa ili uone mitandao yote"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Unganisha"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Mitandao yote"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Mtandao wa Wi‑Fi uliopendekezwa na <xliff:g id="NAME">%s</xliff:g> unapatikana"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Je, ungependa kuunganisha kwenye mitandao inayopendekezwa na <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ndiyo"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Hapana"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi itawashwa kiotomatiki"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Ingia katika mtandao"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi haina muunganisho wa intaneti"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Gusa ili upate chaguo"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Imeunganisha"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Mabadiliko kwenye mipangilio ya mtandao pepe"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Bendi ya mtandao pepe wako imebadilika."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Kifaa hiki hakitumii mapendeleo yako ya GHz 5 pekee. Badala yake, kifaa hiki kitatumia bendi ya GHz 5 itakapopatikana."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Utatuaji wa USB umeunganishwa"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Gusa ili uzime utatuzi wa USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Chagua ili kulemaza utatuaji USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Unyevu au uchafu katika mlango wa USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Mlango wa USB umezimwa kiotomatiki. Gusa ili upate maelezo zaidi."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Ni salama kutumia mlango wa USB"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Gusa ili ufungue wasifu wa kazini"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Imeunganishwa na <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Gusa ili uangalie faili"</string>
- <string name="pin_target" msgid="3052256031352291362">"Bandika"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Bandua"</string>
<string name="app_info" msgid="6856026610594615344">"Maelezo ya programu"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Inaanzisha onyesho..."</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Arifa ya maelezo ya Hali ya Kawaida"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Huenda betri itakwisha chaji mapema"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Imewasha Kiokoa Betri ili kurefusha muda wa matumizi ya betri"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folda"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Programu ya Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Faili"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index ded03cc..a1cf66a 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi కాలింగ్"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ఆఫ్లో ఉంది"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fiకి ప్రాధాన్యత"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"మొబైల్కి ప్రాధాన్యత ఇవ్వబడింది"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi మాత్రమే"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ఫార్వార్డ్ చేయబడలేదు"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"బగ్ నివేదిక"</string>
<string name="global_action_logout" msgid="935179188218826050">"సెషన్ను ముగించు"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"స్క్రీన్షాట్"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"బగ్ నివేదికను సిద్ధం చేయి"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"ఇది ఇ-మెయిల్ సందేశం రూపంలో పంపడానికి మీ ప్రస్తుత పరికర స్థితి గురించి సమాచారాన్ని సేకరిస్తుంది. బగ్ నివేదికను ప్రారంభించడం మొదలుకొని పంపడానికి సిద్ధం చేసే వరకు ఇందుకు కొంత సమయం పడుతుంది; దయచేసి ఓపిక పట్టండి."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ప్రభావశీల నివేదిక"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"చాలా సందర్భాల్లో దీన్ని ఉపయోగించండి. ఇది నివేదిక ప్రోగ్రెస్ను ట్రాక్ చేయడానికి, సమస్య గురించి మరిన్ని వివరాలను నమోదు చేయడానికి మరియు స్క్రీన్షాట్లు తీయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది నివేదించడానికి ఎక్కువ సమయం పట్టే తక్కువ వినియోగ విభాగాలను విడిచిపెట్టవచ్చు."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"స్థానం"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"మీరు యాప్ని ఉపయోగిస్తున్నప్పుడు మాత్రమే యాప్ స్థానానికి యాక్సెస్ కలిగి ఉంటుంది."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని ఎల్లప్పుడూ అనుమతించాలా?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ఈ యాప్ ఎల్లప్పుడూ స్థానానికి యాక్సెస్ కలిగి ఉంటుంది, మీరు యాప్ని ఉపయోగించనప్పుడు కూడా."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"క్యాలెండర్"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"మీ క్యాలెండర్ను యాక్సెస్ చేయడానికి"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"మీ క్యాలెండర్ని యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"మీ సంగీతాన్ని యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని అనుమతించాలా?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"ఫోటోలు & వీడియోలు"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"మీ ఫోటోలను & వీడియోలను యాక్సెస్ చేయండి"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"ట్యాగ్ చేసిన స్థానాలతో సహా, మీ ఫోటోలు, వీడియోలను యాక్సెస్ చేయడానికి <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ను అనుమతించాలా?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"విండో కంటెంట్ను తిరిగి పొందుతుంది"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"మీరు పరస్పర చర్య చేస్తున్న విండో కంటెంట్ను పరిశీలిస్తుంది."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"తాకడం ద్వారా విశ్లేషణను ప్రారంభిస్తుంది"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"సమీప ఫీల్డ్ కమ్యూనికేషన్ (NFC) ట్యాగ్లు, కార్డులు మరియు రీడర్లతో కమ్యూనికేట్ చేయడానికి యాప్ను అనుమతిస్తుంది."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"మీ స్క్రీన్ లాక్ను నిలిపివేయడం"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"కీలాక్ మరియు ఏదైనా అనుబంధించబడిన పాస్వర్డ్ భద్రతను నిలిపివేయడానికి యాప్ను అనుమతిస్తుంది. ఉదాహరణకు, ఇన్కమింగ్ ఫోన్ కాల్ వస్తున్నప్పుడు ఫోన్ కీలాక్ను నిలిపివేస్తుంది, ఆపై కాల్ ముగిసిన తర్వాత కీలాక్ను మళ్లీ ప్రారంభిస్తుంది."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"స్క్రీన్ లాక్ సంక్లిష్టత అభ్యర్థన"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"ఇది మీ స్క్రీన్ లాక్ పాస్వర్డ్ బల స్థాయి (తీవ్రంగా ఉండాలా లేదా ఓ మోస్తరుగా ఉండాలా లేదా తక్కువ తీవ్రంగా గానీ అసలు ఏదీ కాకుండా ఉండాలా) అనే విషయాన్ని గుర్తుంచుకోవడానికి యాప్కి అనుమతిస్తుంది, అలాగే పాస్వర్డ్ పొడుగు ఎంత ఉండాలీ, ఏ రకమైన స్క్రీన్ లాక్ పధ్ధతి అనుసరించాలో సూచిస్తుంది. యాప్ ఇంకా స్క్రీన్ లాక్ పాస్వర్డ్ బల స్థాయిని ఏ స్థాయిలో సెట్ చేసుకుంటే బాగుంటుందో వినియోగదారులకు తెలపగలదు కానీ వినియోగదారులు దాని సూచనలను పట్టించుకోకుండా వారి ఇష్టం మేరకు చక్కగా సెట్ చేసుకోవచ్చు. మీకో ముఖ్యమైన మాట స్క్రీన్ లాక్ పాస్వర్డ్ అనేది సాదా వచన రూపంలో నిల్వ చేయబడదు, కనుక అసలు మీరు పాస్వర్డ్ ఏం పెట్టారనే విషయం యాప్కి తెలియదు."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"బయోమెట్రిక్ హార్డ్వేర్ని ఉపయోగించు"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"ప్రమాణీకరణ కోసం బయోమెట్రిక్ హార్డ్వేర్ను ఉపయోగించడానికి యాప్ని అనుమతిస్తుంది"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"వేలిముద్ర హార్డ్వేర్ని నిర్వహించడానికి అనుమతి"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"వినియోగం కోసం ముఖ టెంప్లేట్లను జోడించే మరియు తొలగించే పద్ధతులను అమలు చేయడానికి యాప్ను అనుమతిస్తుంది."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ముఖ ప్రమాణీకరణ హార్డ్వేర్ను వాడండి"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ప్రమాణీకరణ కోసం ముఖ ప్రామాణీకరణ హార్డ్వేర్ను ఉపయోగించడానికి యాప్ని అనుమతిస్తుంది"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"ముఖాన్ని ప్రాసెస్ చేయడం సాధ్యపడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"ముఖం చాలా ప్రకాశవంతంగా ఉంటుంది. దయచేసి తక్కువ కాంతిలో ప్రయత్నించండి."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"ముఖం చాలా చీకటిగా ఉంది. దయచేసి కాంతి మూలాన్ని వెతకండి."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"దయచేసి ముఖం నుండి దూరంగా సెన్సార్ను జరపండి."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"దయచేసి సెన్సార్ను ముఖానికి మరింత దగ్గరగా తీసుకురండి."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"దయచేసి సెన్సార్ను ఎక్కువకు జరపండి."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"దయచేసి సెన్సార్ను తక్కువకు జరపండి."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"దయచేసి సెన్సార్ను కుడికి జరపండి."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"దయచేసి సెన్సార్ను ఎడమవైపుకు జరపండి."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"దయచేసి సెన్సార్ను చూడండి."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"ఎలాంటి ముఖం గుర్తించబడలేదు."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"చలనం ఎక్కువగా ఉంది."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"దయచేసి మీ ముఖాన్ని మళ్లీ నమోదు చేయండి."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"వేరొక ముఖం గుర్తించబడింది."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"ఒకే మాదిరిగా ఉంది, దయచేసి భంగిమను మార్చండి."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"దయచేసి కెమెరా వైపు మరింత సూటిగా చూడండి."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"దయచేసి కెమెరా వైపు మరింత సూటిగా చూడండి."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"దయచేసి మీ తలను నిలువుగా, నిటారుగా ఉంచండి."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"దయచేసి మీ ముఖంపై చీకటి లేకుండా చూడండి."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"ముఖ హార్డ్వేర్ అందుబాటులో లేదు."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"ముఖ గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"ముఖం నిల్వ చేయబడదు."</string>
<string name="face_error_canceled" msgid="283945501061931023">"ముఖ కార్యకలాపం రద్దయింది."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"వినియోగదారు ద్వారా ముఖ ప్రమాణీకరణ రద్దు చేయబడింది."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. ముఖ ప్రమాణీకరణ నిలిపివేయబడింది."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"మళ్లీ ప్రయత్నించండి."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"ముఖం నమోదు చేయబడలేదు."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"ముఖాన్ని ప్రమాణీకరణ చేసే సెన్సార్ ఈ పరికరం కలిగిలేదు."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"ముఖ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g>ని తెరువు"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> సేవ్ చేయకుండానే మూసివేయబడుతుంది"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> మెమరీ పరిమితిని మించిపోయింది"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"కుప్పలు తెప్పలుగా సేకరించబడింది. షేర్ చేయడానికి నొక్కండి"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"హీప్ డంప్ను భాగస్వామ్యం చేయాలా?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> ప్రాసెస్ దాని <xliff:g id="SIZE">%2$s</xliff:g> ప్రాసెస్ మెమరీ పరిమితిని మించిపోయింది. మీకు దాని డెవలపర్తో షేర్ చేయడానికి హీప్ డంప్ అందుబాటులో ఉంది. జాగ్రత్తగా ఉండండి: ఈ హీప్ డంప్లో యాప్ యాక్సెస్ కలిగి ఉన్న మీ వ్యక్తిగత సమాచారం ఏదైనా ఉండవచ్చు."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"వచనం కోసం చర్యను ఎంచుకోండి"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"రింగర్ వాల్యూమ్"</string>
<string name="volume_music" msgid="5421651157138628171">"మీడియా వాల్యూమ్"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"అన్ని నెట్వర్క్లు చూడటానికి నొక్కండి"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"కనెక్ట్ చేయి"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"అన్ని నెట్వర్క్లు"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> సూచించిన ఒక Wi-Fi నెట్వర్క్ ఇప్పుడు అందుబాటులో ఉంది"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"మీరు <xliff:g id="NAME">%s</xliff:g> సూచించిన నెట్వర్క్లతో కనెక్ట్ చేయాలనుకుంటున్నారా?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"అవును"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"లేదు"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi స్వయంచాలకంగా ఆన్ అవుతుంది"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"నెట్వర్క్కి సైన్ ఇన్ చేయండి"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fiకి ఇంటర్నెట్ యాక్సెస్ లేదు"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ఎంపికల కోసం నొక్కండి"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"కనెక్ట్ చేయబడింది"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"మీ హాట్స్పాట్ సెట్టింగ్లకు మార్పులు"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"మీ హాట్స్పాట్ బ్యాండ్ మార్చబడింది."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ఈ పరికరం 5GHz కోసం మాత్రమే మీ ప్రాధాన్యతకు మద్దతు ఇవ్వదు. బదులుగా, ఈ పరికరం అందుబాటులో ఉన్నప్పుడు 5GHz బ్యాండ్ను ఉపయోగిస్తుంది."</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB డీబగ్గింగ్ కనెక్ట్ చేయబడింది"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB డీబగ్గింగ్ను ఆఫ్ చేయడానికి నొక్కండి"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"డీబగ్గింగ్ని నిలిపివేయడానికి ఎంచుకోండి."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB పోర్ట్లో ద్రవ లేదా వ్యర్థ పదార్థాలు ఉన్నాయి"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB పోర్ట్ ఆటోమేటిక్గా నిలిపివేయబడింది. మరింత తెలుసుకోవడానికి నొక్కండి."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"ఇప్పుడు సురక్షితంగా USB పోర్ట్ని ఉపయోగించుకోవచ్చు"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"కార్యాలయ ప్రొఫైల్ అన్లాక్ చేయుటకు నొక్కండి"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g>కి కనెక్ట్ చేయబడింది"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ఫైల్లను వీక్షించడానికి నొక్కండి"</string>
- <string name="pin_target" msgid="3052256031352291362">"పిన్ చేయి"</string>
- <string name="unpin_target" msgid="3556545602439143442">"అన్పిన్ చేయి"</string>
<string name="app_info" msgid="6856026610594615344">"యాప్ సమాచారం"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"డెమోను ప్రారంభిస్తోంది..."</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"రొటీన్ మోడ్ సమాచార నోటిఫికేషన్"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"మామూలుగా ఛార్జ్ చేసేలోపు బ్యాటరీ ఖాళీ కావచ్చు"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి బ్యాటరీ సేవర్ యాక్టివేట్ చేయబడింది"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"ఫోల్డర్"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android అప్లికేషన్"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ఫైల్"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 5b2541f..54d7b32 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"การโทรผ่าน Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ปิด"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ต้องการใช้ Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ต้องการใช้อินเทอร์เน็ตมือถือ"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi เท่านั้น"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ไม่ได้โอนสาย"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"รายงานข้อบกพร่อง"</string>
<string name="global_action_logout" msgid="935179188218826050">"จบเซสชัน"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ภาพหน้าจอ"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"ใช้รายงานข้อบกพร่อง"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"การดำเนินการนี้จะรวบรวมข้อมูลเกี่ยวกับสถานะปัจจุบันของอุปกรณ์ของคุณ โดยจะส่งไปในรูปแบบข้อความอีเมล อาจใช้เวลาสักครู่ตั้งแต่เริ่มการสร้างรายงานข้อบกพร่องจนกระทั่งเสร็จสมบูรณ์ โปรดอดทนรอ"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"รายงานแบบอินเทอร์แอกทีฟ"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"ใช้ตัวเลือกนี้ได้เกือบทุกสถานการณ์ โดยจะอนุญาตให้คุณติดตามความคืบหน้าของรายงาน ป้อนรายละเอียดเพิ่มเติมของปัญหา และถ่ายภาพหน้าจอ หัวข้อที่ใช้งานน้อยแต่ใช้เวลานานในการรายงานอาจถูกข้ามไป"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ตำแหน่ง"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"เข้าถึงตำแหน่งของอุปกรณ์นี้"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"อนุญาตให้ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> เข้าถึงตำแหน่งของอุปกรณ์นี้ไหม"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"แอปจะมีสิทธิ์เข้าถึงตำแหน่งได้ในขณะที่คุณกำลังใช้แอปเท่านั้น"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"อนุญาตให้ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> เข้าถึงตำแหน่งของอุปกรณ์นี้ทุกครั้งไหม"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"แอปจะมีสิทธิ์เข้าถึงตำแหน่งเสมอแม้ว่าคุณจะไม่ได้ใช้แอป"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ปฏิทิน"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"เข้าถึงปฏิทิน"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"อนุญาตให้ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> เข้าถึงปฏิทินไหม"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"อนุญาตให้ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> เข้าถึงเพลงไหม"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"รูปภาพและวิดีโอ"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"เข้าถึงรูปภาพและวิดีโอ"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"อนุญาตให้ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> เข้าถึงรูปภาพและวิดีโอของคุณ รวมถึงตำแหน่งที่ติดแท็กไหม"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"เรียกข้อมูลเนื้อหาของหน้าต่าง"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ตรวจสอบเนื้อหาของหน้าต่างที่คุณกำลังโต้ตอบอยู่"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"เปิด \"แตะเพื่อสำรวจ\""</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"อนุญาตให้แอปพลิเคชันสื่อสารกับแท็ก Near Field Communication (NFC) การ์ด และโปรแกรมอ่าน"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ปิดใช้งานการล็อกหน้าจอของคุณ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"อนุญาตให้แอปพลิเคชันปิดใช้งานการล็อกปุ่มกดและการรักษาความปลอดภัยด้วยรหัสผ่านใดๆ ที่เกี่ยวข้อง ตัวอย่างเช่น โทรศัพท์ปิดใช้งานการล็อกปุ่มกดเมื่อรับสายเรียกเข้า จากนั้นจึงเปิดใช้งานการล็อกปุ่มกดใหม่หลังจากวางสาย"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ขอความซับซ้อนของการล็อกหน้าจอ"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"อนุญาตให้แอปเรียนรู้ระดับความซับซ้อนของการล็อกหน้าจอ (สูง ปานกลาง ต่ำ หรือไม่มี) ซึ่งแสดงให้เห็นช่วงความยาวและประเภทของการล็อกหน้าจอที่เป็นไปได้ นอกจากนี้แอปยังแนะนำให้ผู้ใช้อัปเดตการล็อกหน้าจอเป็นระดับหนึ่งๆ ได้ด้วย แต่ผู้ใช้จะปฏิเสธและไปยังส่วนต่างๆ ต่อได้ โปรดทราบว่าระบบไม่ได้จัดเก็บการล็อกหน้าจอไว้เป็นข้อความธรรมดา เพื่อให้แอปไม่รู้รหัสผ่าน"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"ใช้ฮาร์ดแวร์ชีวมิติ"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"อนุญาตให้แอปใช้ฮาร์ดแวร์ชีวมิติเพื่อตรวจสอบสิทธิ์"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"จัดการฮาร์ดแวร์ลายนิ้วมือ"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"อนุญาตให้แอปเรียกใช้วิธีเพิ่มและลบเทมเพลตใบหน้าสำหรับการใช้งาน"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"อนุญาตให้แอปใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้าเพื่อตรวจสอบสิทธิ์"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"ประมวลผลใบหน้าไม่ได้ โปรดลองอีกครั้ง"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"ใบหน้าสว่างเกินไป โปรดลดแสง"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"ใบหน้ามืดเกินไป โปรดเปิดแหล่งกำเนิดแสง"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"โปรดขยับเซ็นเซอร์ให้ห่างจากใบหน้ามากขึ้น"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"โปรดขยับเซ็นเซอร์ให้ใกล้ใบหน้ามากขึ้น"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"โปรดขยับเซ็นเซอร์ให้สูงขึ้น"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"โปรดขยับเซ็นเซอร์ให้ต่ำลง"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"โปรดขยับเซ็นเซอร์ไปทางขวา"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"โปรดขยับเซ็นเซอร์ไปทางซ้าย"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"โปรดมองที่เซ็นเซอร์"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"ไม่พบใบหน้า"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"มีการเคลื่อนไหวมากเกินไป"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"โปรดลงทะเบียนใบหน้าอีกครั้ง"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"ตรวจพบใบหน้าอื่น"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"ใกล้เคียงเกินไป โปรดเปลี่ยนท่าโพส"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"โปรดมองตรงไปที่กล้อง"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"โปรดมองตรงไปที่กล้อง"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"โปรดตั้งศีรษะให้ตรง"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"โปรดอย่าปิดบังใบหน้า"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"ฮาร์ดแวร์รู้จำใบหน้าไม่พร้อมใช้งาน"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"หมดเวลาใช้ใบหน้าแล้ว โปรดลองอีกครั้ง"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"จัดเก็บข้อมูลใบหน้าไม่ได้"</string>
<string name="face_error_canceled" msgid="283945501061931023">"ยกเลิกการดำเนินการกับใบหน้าแล้ว"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"ผู้ใช้ยกเลิกการตรวจสอบสิทธิ์ใบหน้า"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"ดำเนินการหลายครั้งเกินไป ปิดใช้การตรวจสอบสิทธิ์ด้วยใบหน้าแล้ว"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"ลองอีกครั้ง"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"ไม่ได้ลงทะเบียนใบหน้าไว้"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"อุปกรณ์นี้ไม่มีเซ็นเซอร์ตรวจสอบสิทธิ์ด้วยใบหน้า"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"ใบหน้า <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"เปิด <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> จะปิดโดยไม่บันทึก"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> เกินขีดจำกัดของหน่วยความจำ"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"รวบรวมฮีพดัมพ์แล้ว แตะเพื่อแชร์"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"แชร์ฮีพดัมพ์ไหม"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> มีขนาดเกิน <xliff:g id="SIZE">%2$s</xliff:g> ซึ่งเป็นขีดจำกัดของหน่วยความจำกระบวนการแล้ว ฮีพดัมพ์จะพร้อมให้คุณแชร์กับนักพัฒนาซอฟต์แวร์ โปรดระวัง ฮีพดัมพ์นี้สามารถเก็บข้อมูลส่วนบุคคลที่แอปพลิเคชันมีสิทธิ์เข้าถึงได้"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"เลือกการทำงานกับข้อความ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ระดับความดังเสียงเรียกเข้า"</string>
<string name="volume_music" msgid="5421651157138628171">"ระดับเสียงของสื่อ"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"แตะเพื่อดูเครือข่ายทั้งหมด"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"เชื่อมต่อ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"เครือข่ายทั้งหมด"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"เครือข่าย Wi-Fi ที่ <xliff:g id="NAME">%s</xliff:g> เสนอใช้งานได้"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"ต้องการเชื่อมต่อเครือข่ายที่ <xliff:g id="NAME">%s</xliff:g> เสนอไหม"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ใช่"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ไม่"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi จะเปิดโดยอัตโนมัติ"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"ลงชื่อเข้าใช้เครือข่าย"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi เชื่อมต่ออินเทอร์เน็ตไม่ได้"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"แตะเพื่อดูตัวเลือก"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"เชื่อมต่อแล้ว"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"มีการเปลี่ยนแปลงการตั้งค่าฮอตสปอต"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ย่านความถี่ฮอตสปอตมีการเปลี่ยนแปลง"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"อุปกรณ์นี้ไม่รองรับค่ากำหนดของคุณเฉพาะสำหรับ 5 GHz เท่านั้น และจะใช้ย่านความถี่ 5 GHz แทน เมื่อใช้ได้"</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"เชื่อมต่อการแก้ไขข้อบกพร่องผ่าน USB แล้ว"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"แตะเพื่อปิดการแก้ไขข้อบกพร่อง USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"เลือกเพื่อปิดใช้งานการแก้ไขข้อบกพร่อง USB"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"มีของเหลวหรือฝุ่นละอองในพอร์ต USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"พอร์ต USB ปิดใช้โดยอัตโนมัติ แตะเพื่อดูข้อมูลเพิ่มเติม"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"ใช้พอร์ต USB ได้อย่างปลอดภัย"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"แตะเพื่อปลดล็อกโปรไฟล์งาน"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"เชื่อมต่อ <xliff:g id="PRODUCT_NAME">%1$s</xliff:g> แล้ว"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"แตะเพื่อดูไฟล์"</string>
- <string name="pin_target" msgid="3052256031352291362">"ปักหมุด"</string>
- <string name="unpin_target" msgid="3556545602439143442">"เลิกปักหมุด"</string>
<string name="app_info" msgid="6856026610594615344">"ข้อมูลแอป"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"กำลังเริ่มการสาธิต…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"การแจ้งเตือนข้อมูลโหมดกิจวัตร"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"แบตเตอรี่อาจหมดก่อนการชาร์จปกติ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"เปิดใช้งานโหมดประหยัดแบตเตอรี่แล้วเพื่อยืดอายุการใช้งานแบตเตอรี่"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"โฟลเดอร์"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"ไฟล์แอปพลิเคชัน Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"ไฟล์"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 4d7e7a2..d3c7852 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Pagtawag Gamit ang WiFi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Naka-off"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Mas gusto ang Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mas gusto ang mobile"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi lang"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Hindi naipasa"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Ulat sa bug"</string>
<string name="global_action_logout" msgid="935179188218826050">"Tapusin ang session"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Kunin ang ulat sa bug"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Mangongolekta ito ng impormasyon tungkol sa kasalukuyang katayuan ng iyong device, na ipapadala bilang mensaheng e-mail. Gugugol ito ng kaunting oras mula sa pagsisimula ng ulat sa bug hanggang sa handa na itong maipadala; mangyaring magpasensya."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive na ulat"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Gamitin ito sa karamihan ng sitwasyon. Nagbibigay-daan ito sa iyo na masubaybayan ang pag-usad ng ulat, makapaglagay ng higit pang mga detalye tungkol sa problema, at makakuha ng mga screenshot. Maaari itong mag-alis ng ilan sa mga hindi masyadong ginagamit na seksyon na nangangailangan ng mahabang panahon upang iulat."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokasyon"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"i-access ang lokasyon ng device na ito"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang lokasyon ng device na ito?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Maa-access lang ng app ang lokasyon habang ginagamit mo ang app."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Laging payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang lokasyon?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Palaging maa-access ng app ang lokasyon, kahit na hindi mo ginagamit ang app."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendaryo"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"i-access ang iyong kalendaryo"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang iyong kalendaryo?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang iyong musika?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Mga larawan at video"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"i-access ang iyong mga larawan at video"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang iyong mga larawan at video, kasama ang mga naka-tag na lokasyon?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Kunin ang content ng window"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Siyasatin ang nilalaman ng isang window kung saan ka nakikipag-ugnayan."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"I-on ang Explore by Touch"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Pinapayagan ang app na makipag-ugnay sa Near Field Communication (NFC) na mga tag, card, at reader."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"i-disable ang iyong screen lock"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Pinapayagan ang app na i-disable ang keylock at anumang nauugnay na seguridad sa password. Halimbawa, hindi pinapagana ng telepono ang keylock kapag nakakatanggap ng papasok na tawag sa telepono, pagkatapos ay muling pinapagana ang keylock kapag tapos na ang tawag."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"humiling ng pagiging kumplikado ng lock ng screen"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Pinapayagan ang app na malaman ang antas ng pagiging kumplikado ng lock ng screen (mataas, katamtaman, mababa, o wala), na nagsasaad ng posibleng hanay ng haba at uri ng lock ng screen. Maaari ding magmungkahi ang app sa mga user na i-update nila ang lock ng screen sa isang partikular na antas ngunit malaya ang mga user na balewalain ito at mag-navigate palayo. Tandaang hindi naka-store bilang plaintext ang lock ng screen kaya hindi alam ng app ang eksaktong password."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"gumamit ng biometric hardware"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Pinapayagan ang app na gumamit ng biometric hardware para sa pag-authenticate"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"pamahalaan ang hardware ng fingerprint"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Pumapayag na mag-invoke ang app ng paraang magdagdag at mag-delete ng template ng mukha."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gumamit ng hardware sa pag-authenticate ng mukha"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Pumapayag na gumamit ng face authentication hardware ang app para sa pag-authenticate"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Hindi maiproseso ang mukha. Pakisubukang muli."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Masyadong maliwanag. Pakisubukan sa mas madilim."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Masyadong madilim. Huwag takpan ang ilaw."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Pakilayo sa mukha ang sensor."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Pakilapit sa mukha ang sensor."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Pakitaas ang sensor."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Pakibaba ang sensor."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Pakiusog pakanan ang sensor."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Pakiusog pakaliwa ang sensor."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Tumingin sa sensor."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Walang natukoy na mukha."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Masyadong magalaw."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Paki-enroll muli ang iyong mukha."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"May na-detect na ibang mukha."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Masyadong magkatulad, pakibago ang pose mo."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Tumingin nang mas direkta sa camera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Tumingin nang mas direkta sa camera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Pakituwid ang iyong mukha."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Pakialis ang tumatakip sa iyong mukha."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Hindi available ang hardware para sa mukha."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Nag-time out ang mukha. Subukang muli."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Hindi ma-store ang mukha."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Nakansela ang operation kaugnay ng mukha."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Kinansela ng user ang pag-authenticate ng mukha."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Masyadong maraming pagsubok. Subukang muli mamaya."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Sobrang pagsubok. Bawal na: facial authentication."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Subukang muli."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Walang naka-enroll na mukha."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Walang sensor ng authentication ng mukha ang device na ito."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Mukha <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Buksan ang <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"Magsasara ang <xliff:g id="OLD_APP">%1$s</xliff:g> nang hindi nagse-save"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Lumampas ang <xliff:g id="PROC">%1$s</xliff:g> sa limitasyon ng memory"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Nakolekta ang heap dump. I-tap para ibahagi."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Ibahagi ang heap dump?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Lumampas ang proseso na <xliff:g id="PROC">%1$s</xliff:g> sa limitasyon ng memory ng proseso nito na <xliff:g id="SIZE">%2$s</xliff:g>. Available ang isang heap dump upang iyong ibahagi sa developer nito. Maging maingat: maaaring naglalaman ang heap dump na ito ng anuman sa iyong personal na impormasyon na naa-access ng application."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Pumili ng pagkilos para sa teksto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Lakas ng tunog ng ringer"</string>
<string name="volume_music" msgid="5421651157138628171">"Lakas ng tunog ng media"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"I-tap upang makita ang lahat ng network"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Kumonekta"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Lahat ng network"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"May available na Wi‑Fi network na iminumungkahi ng <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Gusto mo bang kumonekta sa mga network na iminumungkahi ng <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Oo"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Hindi"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Awtomatikong mag-o-on ang Wi‑Fi"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Mag-sign in sa network"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Walang access sa internet ang Wi-Fi"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"I-tap para sa mga opsyon"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Nakakonekta"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Mga pagbabago sa mga setting ng iyong hotspot"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Nagbago ang band ng iyong hotspot."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Hindi sinusuportahan ng device na ito ang kagustuhan mong gumamit lang ng 5GHz. Sa halip, gagamitin ng device na ito ang 5GHz na band kapag available."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Nakakonekta ang pag-debug ng USB"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"I-tap para i-off ang pag-debug ng USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Piliin upang i-disable ang debugging ng USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Liquid o debris sa USB port"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Awtomatikong na-disable ang USB port. Mag-tap para matuto pa."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Ligtas na gamitin ang USB port"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"I-unlock ang profile sa trabaho, i-tap"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Nakakonekta sa <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"I-tap upang makita ang mga file"</string>
- <string name="pin_target" msgid="3052256031352291362">"I-pin"</string>
- <string name="unpin_target" msgid="3556545602439143442">"I-unpin"</string>
<string name="app_info" msgid="6856026610594615344">"Impormasyon ng app"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Sinisimulan ang demo…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notification ng impormasyon ng Routine Mode"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Maaaring maubos ang baterya bago ang karaniwang pag-charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Na-activate ang Pangtipid sa Baterya para patagalin ang buhay ng baterya"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 3e1bfb8..23b6031 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Kablosuz Çağrı"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Kapalı"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Kablosuz bağlantı tercihli"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobil tercihli"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Yalnızca kablosuz"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönlendirilmedi"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Hata raporu"</string>
<string name="global_action_logout" msgid="935179188218826050">"Oturumu sonlandır"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekran görüntüsü"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Hata raporu al"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Bu rapor, e-posta iletisi olarak göndermek üzere cihazınızın şu anki durumuyla ilgili bilgi toplar. Hata raporu başlatıldıktan sonra hazır olması biraz zaman alabilir, lütfen sabırlı olun."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Etkileşimli rapor"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Çoğu durumda bunu kullanın. Bu seçenek, raporun ilerleme durumunu takip etmenize, sorunla ilgili daha fazla ayrıntı girmenize ve ekran görüntüleri almanıza olanak tanır. Rapor edilmesi uzun süren ve az kullanılan bazı bölümleri yok sayabilir."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Konum"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"bu cihazın konumuna erişme"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının bu cihazın konumuna erişmesine izin verilsin mi?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Bu uygulama konum bilgisine yalnızca kullanıldığı sırada erişebilecektir."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının bu cihazın konumuna erişmesine her zaman izin verilsin mi?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Bu uygulama, kullanılmadığında bile konum bilgisine her zaman erişebilecektir."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Takvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"takviminize erişme"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının takviminize erişmesine izin verilsin mi?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının müziğinize erişmesine izin veriyor musunuz?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Fotoğraflar ve videolar"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"fotoğraflarınıza ve videolarınıza erişme"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasına, etiketlenmiş yerler de dahil fotoğraf ve videolarınıza erişim izni verilsin mi?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pencere içeriğini alma"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Etkileşim kurduğunuz pencerenin içeriğini inceler."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Dokunarak Keşfet\'i açma"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Uygulamaya, Near Field Communication (NFC) etiketleri, kartlar ve okuyucular ile iletişim kurma izni verir."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ekran kilidimi devre dışı bırak"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Uygulamaya, tuş kilidini ve ilişkili tüm şifreli güvenlik önlemlerini devre dışı bırakma izni verir. Örneğin, telefon, çağrı alındığında tuş kilidinin devre dışı bırakır ve sonra, görüşme bittiğinde kilidi yeniden etkinleştirir."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ekran kilidi karmaşıklığı iste"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Uygulamanın, ekran kilidi karmaşıklık seviyesini (yüksek, orta, düşük veya yok) öğrenmesini sağlar. Ekran kilidi karmaşıklık seviyesi, ekran kilidinin olası uzunluk aralığını ve türünü gösterir. Uygulama, kullanıcılara ekran kilidini belirli bir seviyeye güncellemelerini de önerebilir, ancak kullanıcılar bunu istedikleri gibi yoksayabilir ve geçebilirler. Ekran kilidi şifrelenmemiş metin olarak saklanmadığı için uygulamanın şifreyi tam olarak bilmediğini unutmayın."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"biyometrik donanım kullan"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Uygulamanın kimlik doğrulama için biyometrik donanım kullanmasına izin verir"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"parmak izi donanımını yönetme"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Uygulamanın, kullanılacak yüz şablonlarını ekleme ve silme yöntemlerini başlatmasına izin verir."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"yüz kimlik doğrulaması donanımını kullanma"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Uygulamanın yüz kimlik doğrulaması donanımı kullanmasına izin verir"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Yüz işlenemedi. Lütfen tekrar deneyin."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Yüzünüz çok parlak. Lütfen ışığı kısmayı deneyin."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Yüzünüz çok karanlık. Lütfen ışığı artırın."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Lütfen sensörü yüzünüzden biraz uzaklaştırın."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Lütfen sensörü yüzünüze yaklaştırın."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Lütfen sensörü daha yukarı kaldırın."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Lütfen sensörü daha aşağı indirin."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Lütfen sensörü sağa kaydırın."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Lütfen sensörü sola kaydırın."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Lütfen sensöre bakın."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Yüz algılanmadı."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Çok fazla hareket ediyorsunuz."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Lütfen yüzünüzü yeniden kaydedin."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Farklı yüz algılandı."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Duruşunuz çok benzer, lütfen pozunuzu değiştirin."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Lütfen kameraya daha doğrudan bakın."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Lütfen kameraya daha doğrudan bakın."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Lütfen başınızı tam dik olacak şekilde tutun."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Lütfen yüzünüzü açın."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Yüz donanımı kullanılamıyor."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Yüz için zaman aşımı oluştu. Tekrar deneyin."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Yüz kaydedilemiyor."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Yüz işlemi iptal edildi."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Yüz kimlik doğrulama işlemini kullanıcı iptal etti."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Çok fazla deneme yapıldı. Yüz kimlik doğrulaması devre dışı bırakıldı."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Tekrar deneyin."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Herhangi bir yüz kaydedilmedi."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Bu cihazda yüz kimlik doğrulaması için sensör yok."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Yüz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> uygulamasını aç"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> kaydetmeden kapanacak"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> bellek sınırını aştı"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Yığın dökümü toplandı. Paylaşmak için dokunun."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Yığın dökümü paylaşılsın mı?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g>, <xliff:g id="SIZE">%2$s</xliff:g> olan işlem bellek sınırını aştı. İşlemin geliştiricisiyle paylaşabileceğiniz bir bellek yığını dökümü hazır. Dikkat: Bu bellek yığını dökümü, uygulamanın erişebildiği tüm kişisel bilgilerinizi içerebilir."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Kısa mesaj için bir işlem seçin"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Zil ses düzeyi"</string>
<string name="volume_music" msgid="5421651157138628171">"Medya ses düzeyi"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tüm ağları görmek için dokunun"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Bağlan"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tüm ağlar"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> tarafından önerilen bir kablosuz ağ kullanılabilir"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"<xliff:g id="NAME">%s</xliff:g> tarafından önerilen ağlara bağlanmak istiyor musunuz?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Evet"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Hayır"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Kablosuz özelliği otomatik olarak açılacak"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Ağda oturum açın"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Kablosuz bağlantının internet erişimi yok"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Seçenekler için dokunun"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Bağlandı"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot ayarlarınız değişti"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot bandı değişti."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Bu cihaz yalnızca 5 GHz bandının kullanılmasına yönelik tercihinizi desteklemiyor. Bunun yerine, bu cihaz 5 GHz bandını mevcut olduğunda kullanacak."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hata ayıklaması bağlandı"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB hata ayıklama işlevini kapatmak için dokunun"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB hata ayıklamasını devre dışı bırakmak için seçin."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB bağlantı noktasında sıvı veya toz var"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB bağlantı noktası otomatik olarak devre dışı bırakıldı. Daha fazla bilgi için dokunun."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB bağlantı noktası güvenli bir şekilde kullanılabilir"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"İş profilinin kilidini açmak için dokunun"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> cihazına bağlandı"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Dosyaları görüntülemek için dokunun"</string>
- <string name="pin_target" msgid="3052256031352291362">"Sabitle"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Sabitlemeyi kaldır"</string>
<string name="app_info" msgid="6856026610594615344">"Uygulama bilgileri"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Demo başlatılıyor…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rutin Modu bilgi bildirimi"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Pil normal şarjdan önce bitebilir"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Pilin ömrünü uzatmak için Pil Tasarrufu etkinleştirildi"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Klasör"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android uygulaması"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Dosya"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 9ca44d9..41ad7b5 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -143,8 +143,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Дзвінки через Wi-Fi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"Передавання голосу через Wi-Fi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Вимкнено"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi за умовчанням"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Мобільна мережа за умовчанням"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Лише Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не переслано"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -232,7 +234,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Звіт про помилки"</string>
<string name="global_action_logout" msgid="935179188218826050">"Завершити сеанс"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Знімок екрана"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Звіт про помилку"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Інформація про поточний стан вашого пристрою буде зібрана й надіслана електронною поштою. Підготовка звіту триватиме певний час."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Інтерактивний звіт"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Підходить для більшості випадків. Можна відстежувати, як створюється звіт, вводити більше деталей про проблему та робити знімки екрана. Можуть опускатися деякі розділи, які рідко використовуються, але довго створюються."</string>
@@ -287,9 +290,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Геодані"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"доступ до геоданих пристрою"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до геоданих пристрою?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Додаток матиме доступ до геоданих, лише коли ви ним користуєтеся."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Завжди надавати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до геоданих цього пристрою?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Додаток матиме доступ до геоданих, навіть коли ви ним не користуєтеся."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"отримувати доступ до календаря"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до календаря?"</string>
@@ -322,7 +328,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до музики?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Фотографії та відео"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"доступ до фото й відео"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Дозволити додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> отримувати доступ до ваших фотографій і відео, зокрема до позначок місцеположення?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Отримувати вміст вікна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Перевіряти вміст вікна, з яким ви взаємодієте."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Увімкнути функцію дослідження дотиком"</string>
@@ -515,8 +524,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Дозволяє програмі обмінюватися даними з тегами, картками та читачами екрана Near Field Communication (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"вимикати блокування екрана"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Дозволяє програмі вимикати блокування клавіатури та будь-який пов’язаний паролем захист. Наприклад: телефон вимикає блокування клавіатури під час отримання вхідного дзвінка, після закінчення якого блокування клавіатури відновлюється."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"запит складності способу блокування екрана"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Дозволяє додатку визначати рівень складності способу блокування екрана (високий, середній, низький або нульовий). Враховуються кількість символів і тип блокування. Додаток також може пропонувати користувачам вибрати складніший тип блокування екрана, але це не обов’язково робити. Примітка: оскільки пароль зашифрований, додаток його не знає."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"використовувати біометричне апаратне забезпечення"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Додаток може використовувати біометричне апаратне забезпечення для автентифікації"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"керувати апаратним забезпеченням для цифрових відбитків"</string>
@@ -571,37 +582,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Додаток може активувати способи додавання й видалення шаблонів облич."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"застосовувати обладнання для автентифікації облич"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Додаток може застосовувати обладнання для автентифікації облич"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Не вдалося розпізнати обличчя. Повторіть спробу."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Обличчя засвітле. Спробуйте знизити яскравість."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Обличчя затемне. Не заступайте джерело світла."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Перемістіть сканер далі від обличчя."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Перемістіть сканер ближче до обличчя."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Перемістіть сканер вище."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Перемістіть сканер нижче."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Перемістіть сканер праворуч."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Перемістіть сканер ліворуч."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Дивіться на сканер."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Обличчя не виявлено."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Забагато рухів."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторно проскануйте обличчя."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Виявлено інше обличчя."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Надто схоже на попередню спробу, змініть позу."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Дивіться просто в камеру."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Дивіться просто в камеру."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Тримайте голову вертикально."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Відкрийте обличчя."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Обладнання для сканування облич недоступне."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Час очікування обличчя минув. Повторіть спробу."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Не вдається зберегти обличчя."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Дію з обличчям скасовано."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Користувач скасував автентифікацію облич."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Забагато спроб. Повторіть пізніше."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Забагато спроб. Автентифікацію обличчя вимкнено."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Повторіть спробу."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Немає зареєстрованих облич."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"На цьому пристрої немає сканера для автентифікації облич."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Обличчя <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1253,9 +1286,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Відкрийте додаток <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> закриється без зберігання"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Процес <xliff:g id="PROC">%1$s</xliff:g> перевищив ліміт пам’яті"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Дані динамічної пам’яті зібрано. Торкніться, щоб надіслати."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Поділитися даними динамічної пам’яті?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Процес <xliff:g id="PROC">%1$s</xliff:g> перевищив ліміт пам’яті (<xliff:g id="SIZE">%2$s</xliff:g>). Ви можете поділитися даними динамічної пам’яті з розробником. Увага: ці дані можуть містити вашу особисту інформацію, до якої має доступ додаток."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Виберіть дію для тексту"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Гучність дзвінка"</string>
<string name="volume_music" msgid="5421651157138628171">"Гучність медіа"</string>
@@ -1298,8 +1338,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Торкніться, щоб побачити всі мережі"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Під’єднатися"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Усі мережі"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Доступна мережа Wi‑Fi, запропонована додатком <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Підключатися до мереж, які пропонує <xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Так"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ні"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi вмикатиметься автоматично"</string>
@@ -1311,9 +1353,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Вхід у мережу"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Мережа Wi-Fi не має доступу до Інтернету"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Торкніться, щоб відкрити опції"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Підключено"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Зміни в налаштуваннях точки доступу"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Діапазон точки доступу змінено."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"На цьому пристрої не підтримується налаштування лише 5 ГГц. Замість цього буде використовуватися діапазон 5 ГГц, якщо доступно."</string>
@@ -1398,6 +1445,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Налагодження USB завершено"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Торкніться, щоб вимкнути налагоджувач USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Виберіть, щоб вимкнути налагодження за USB"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Рідина або сміття в USB-порту"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB-порт автоматично вимкнено. Торкніться, щоб дізнатися більше."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Можна безпечно використовувати USB-порт"</string>
@@ -1440,8 +1491,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Налаштувати"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Відключити"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Переглянути"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Змініть вихід"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Немає пристрою <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Вставте пристрій знову"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Переміщення додатка <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1974,8 +2024,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Торкніться, щоб розблокувати"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Під’єднано до пристрою <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Торкніться, щоб переглянути файли"</string>
- <string name="pin_target" msgid="3052256031352291362">"Закріпити"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Відкріпити"</string>
<string name="app_info" msgid="6856026610594615344">"Про додаток"</string>
<string name="negative_duration" msgid="5688706061127375131">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Запуск демонстрації…"</string>
@@ -2068,6 +2116,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Сповіщення про послідовнсть дій"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Акумулятор може розрядитися раніше ніж зазвичай"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Режим економії заряду акумулятора активовано для збільшення часу його роботи"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Додаток Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 22fbd56..52a1bbc 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi کالنگ"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"آف"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ترجیحی"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"موبائل ترجیحی"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"صرف Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : فارورڈ نہیں کی گئی"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"بگ کی اطلاع"</string>
<string name="global_action_logout" msgid="935179188218826050">"سیشن ختم کریں"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"اسکرین شاٹ"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"بگ کی اطلاع لیں"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"ایک ای میل پیغام کے بطور بھیجنے کیلئے، یہ آپ کے موجودہ آلہ کی حالت کے بارے میں معلومات جمع کرے گا۔ بگ کی اطلاع شروع کرنے سے لے کر بھیجنے کیلئے تیار ہونے تک اس میں تھوڑا وقت لگے گا؛ براہ کرم تحمل سے کام لیں۔"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"متعامل رپورٹ"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"زیادہ تر حالات میں اسے استعمال کریں۔ یہ آپ کو رپورٹ کی پیش رفت کا پتہ رکھنے، مسئلہ سے متعلق زیادہ تفصیلات درج کرنے اور اسکرین شاٹس لینے کی اجازت دیتا ہے۔ شاید یہ کچھ ایسے کم استعمال ہونے والے سیکشنز کو خارج کر دے جو اطلاع کرنے میں زیادہ وقت لگاتے ہیں۔"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"مقام"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"اس آلہ کے مقام تک رسائی حاصل کریں"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو اس آلہ کے مقام تک رسائی کی اجازت دیں؟"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"جب آپ ایپ استعمال کریں گے تبھی ایپ کو مقام تک رسائی حاصل ہوگی۔"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو ہمیشہ اس آلہ کے مقام تک رسائی کرنے کی اجازت دیں؟"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"اگرچہ آپ ایپ استعمال نہ کر رہے ہوں تب بھی ایپ کو ہمیشہ مقام تک رسائی حاصل ہوگی۔"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"کیلنڈر"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"اپنے کیلنڈر تک رسائی حاصل کریں"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو آپ کے کیلنڈر تک رسائی کی اجازت دیں؟"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو آپ کی موسیقی تک رسائی کی اجازت دیں؟"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"تصاویر اور ویڈیوز"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"اپنی تصاویر اور ویڈیوز تک رسائی حاصل کریں"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو ٹیگ کردہ مقامات سمیت آپ کی تصاویر اور ویڈیوز تک رسائی کی اجازت دیں؟"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ونڈو مواد بازیافت کرنے کی"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"کسی ایسی ونڈو کے مواد کا معائنہ کریں جس کے ساتھ آپ تعامل کر رہے ہیں۔"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ٹچ کے ذریعے دریافت کریں کو آن کرنے کی"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"ایپ کو Near Field Communication (NFC) ٹیگز، کارڈز اور ریڈرز کے ساتھ مواصلت کرنے کی اجازت دیٹا ہے۔"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"اپنے اسکرین لاک کو غیر فعال کریں"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ایپ کو کلیدی لاک اور کسی بھی متعلقہ پاس ورڈ سیکیورٹی کو غیر فعال کرنے کی اجازت دیتا ہے۔ مثلاً، کوئی آنے والی فون کال موصول ہونے کے وقت فون کلیدی لاک کو غیر فعال کرتا ہے، پھر کال پوری ہوجانے پر کلیدی لاک کو دوبارہ فعال کردیتا ہے۔"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"اسکرین لاک پیچیدگی کی درخواست کریں"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"اپپ کو اسکرین لاک کی پیچیدگی (مُشکل، درمیانی، آسان یا کوئی نہیں) کو جاننے کی اجازت دیتا ہے، جو لمبائی کی ممکنہ حد اور اسکرین لاک کے قسم کو بتاتا ہے۔ اپپ صارفین کو مشوره بھی دے سکتی ہے کہ وہ اسکرین لاک کو مخصوس لیول تک اپ ڈیٹ کرتے ہیں لیکن صارفین آزادانہ طور پر نظر انداز اور نیویگیٹ کر سکتے ہیں۔ یاد رکھیں کہ اسکرین لاک کو پلین ٹیکسٹ میں اسٹور نہیں کیا گیا ہے اس لیے اپپ صحیح پاس ورڈ نہیں جانتی ہے۔"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"بایومیٹرک ہارڈ ویئر استعمال کریں"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"ایپ کو توثیق کے لیے بایومیٹرک ہارڈ ویئر استعمال کرنے کی اجازت دیتا ہے"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"فنگر پرنٹ ہارڈ ویئر کا نظم کریں"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"ایپ کو چہرے کی تمثیلات شامل اور حذف کرنے کے طریقوں کو کالعدم قرار دینے کی اجازت دیتا ہے۔"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"چہرے کی توثیق کا ہارڈویئر استعمال کریں"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ایپ کو توثیق کیلئے چہرے کا ہارڈ ویئر استعمال کرنے کی اجازت دیتا ہے"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"چہرے پر کارروائی نہیں ہو سکی۔ دوبارہ کوشش کریں۔"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"چہرے پر بہت زیادہ روشنی ہے۔ براہ کرم کم روشنی میں کوشش کریں۔"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"چہرے پر روشنی بہت کم ہے۔ براہ کرم روشنی بڑھائیں۔"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"براہ کرم سینسر کو چہرے سے تھوڑا دور رکھیں۔"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"براہ کرم سینسر کو چہرے سے تھوڑا قریب رکھیں۔"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"براہ کرم سینسر کو تھوڑا اوپر کریں۔"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"براہ کرم سینسر کو تھوڑا نیچے کریں۔"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"براہ کرم سینسر کو دائیں طرف کریں۔"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"براہ کرم سینسر کو بائیں طرف کریں۔"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"براہ کرم سینسر کی طرف دیکھیں۔"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"کسی چہرے کا پتہ نہیں چلا۔"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"کافی حرکت ہو رہی ہے۔"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"براہ کرم اپنے چہرے کو دوبارہ مندرج کریں۔"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"کسی اور کے چہرے کا پتا چل رہا ہے۔"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"کافی ملتا جلتا ہے، براہ کرم اپنا پوز بدلیں۔"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"براہ کرم کیمرے کی طرف چہرے کو بالکل سیدھا رکھیں۔"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"براہ کرم کیمرے کی طرف چہرے کو بالکل سیدھا رکھیں۔"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"براہ کرم اپنا سر عمودی طور پر سیدھا کریں۔"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"براہ کرم اپنے چہرے سے کور ہٹائیں۔"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"چہرے کا ہارڈویئر دستیاب نہیں ہے۔"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"چہرہ پہچانے کی میعاد ختم ہو گئی۔ دوبارہ کوشش کریں۔"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"چہرے کو اسٹور نہیں کیا جا سکتا۔"</string>
<string name="face_error_canceled" msgid="283945501061931023">"چہرے پر ہونے والی کارروائی منسوخ ہو گئی۔"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"صارف نے چہرے کی تصدیق کو مسترد کر دیا۔"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"کافی زیادہ کوششیں کی گئیں۔ دوبارہ کوشش کریں۔"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"کافی زیادہ کوششیں کی گئیں۔ چہرے کی توثیق منسوخ ہو گئی۔"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"دوبارہ کوشش کریں۔"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"کوئی بھی چہرہ مندرج نہیں ہے۔"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"اس آلہ میں چہرے کی تصدیق کرنے والا سینسر نہیں ہے۔"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"چہرہ <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> کھوليں"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> محفوظ کیے بغیر بند ہو جائے گی"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> میموری کی حد سے تجاوز کرگئی"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"ہیپ ڈمپ جمع ہو گیا ہے۔ اشتراک کرنے کیلئے تھپتھپائیں۔"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ہیپ ڈمپ کا اشتراک کریں؟"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"کارروائی <xliff:g id="PROC">%1$s</xliff:g> اپنی کارروائی کی میموری کی حد <xliff:g id="SIZE">%2$s</xliff:g> سے تجاوز کر گئی ہے۔ آپ کیلئے ایک ہیپ ڈمپ اس کے ڈیولپر سے اشتراک کرنے کیلئے دستیاب ہے۔ احتیاط برتیں: اس ہیپ ڈمپ میں آپ کی ایسی ذاتی معلومات میں سے کوئی بھی شامل ہو سکتی ہے جس تک ایپلیکیشن کو رسائی ہے۔"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"متن کیلئے ایک کارروائی منتخب کریں"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"رنگر والیوم"</string>
<string name="volume_music" msgid="5421651157138628171">"میڈیا والیوم"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"تمام نیٹ ورکس دیکھنے کیلئے تھپتھپائيں"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"منسلک کریں"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"سبھی نیٹ ورکس"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> کا تجویز کردہ ایک Wi‑Fi نیٹ ورک دستیاب ہے"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"کیا آپ <xliff:g id="NAME">%s</xliff:g> کے تجویز کردہ نیٹ ورکس سے منسلک ہونا چاہتے ہیں؟"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ہاں"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"نہیں"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi از خود آن ہو جائے گا"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"نیٹ ورک میں سائن ان کریں"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi کو انٹرنیٹ تک رسائی نہیں ہے"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"اختیارات کیلئے تھپتھپائیں"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"منسلک ہے"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"اپنے ہاٹ اسپاٹ کی ترتیبات میں تبدیلیاں"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"آپ کا ہاٹ اسپات بینڈ تبدیل ہو گیا۔"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"یہ آلہ صرف 5GHz کے لئے آپ کی ترجیح کا تعاون نہیں کرے گا۔ بلکہ 5GHz بینڈ کے دستیاب ہونے پر اس کا استعمال کرے گا۔"</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ڈیبگ کرنا مربوط ہو گیا"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB ڈیبگنگ آف کرنے کے لیے تھپتھپائیں"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ڈیبگ کرنے کو غیر فعال کرنے کیلئے منتخب کریں۔"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB پورٹ میں سیال یا دھول ہے"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB پورٹ خودکار طور پر غیر فعال کر دیا گیا۔ مزید جاننے کیلئے تھپتھپائیں۔"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB پورٹ کا استعمال محفوظ ہے"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"دفتری پروفائل غیر مقفل کرنے کیلئے تھپتھپائیں"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> سے منسلک"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"فائلوں کو دیکھنے کیلئے تھپتھپائیں"</string>
- <string name="pin_target" msgid="3052256031352291362">"پن کریں"</string>
- <string name="unpin_target" msgid="3556545602439143442">"پن ہٹائیں"</string>
<string name="app_info" msgid="6856026610594615344">"ایپ کی معلومات"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"ڈیمو شروع ہو رہا ہے…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"روٹین موڈ معلومات کی اطلاع"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"معمول چارج سے پہلے بیٹری ختم ہو سکتی ہے"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"بیٹری لائف کو بڑھانے کے لیے بیٹری سیور کو فعال کر دیا گیا ہے"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"فولڈر"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android ایپلیکیشن"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"فائل"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index eaf81d7..92d7675 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi chaqiruv"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWi-Fi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"O‘chiq"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi afzalligi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobil internet afzalligi"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Faqat Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yo‘naltirilmadi"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Nosozlik haqida ma’lumot berish"</string>
<string name="global_action_logout" msgid="935179188218826050">"Seansni yakunlash"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skrinshot"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Xatoliklar hisoboti"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Qurilmangiz holati haqidagi ma’lumotlar to‘planib, e-pochta orqali yuboriladi. Hisobotni tayyorlash biroz vaqt olishi mumkin."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv hisobot"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Bundan maxsus vaziyatlarda foydalaning. Bu hisobot jarayonini kuzatish imkonini beradi, muammo haqida batafsil ma’lumotlarni ko‘rishingiz va skrinshotlar olishingiz mumkin bo‘ladi. Hisobot uchun ko‘p vaqt oladigan kam ishlatiladigan bo‘limlar qoldirib ketilishi mumkin."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Joylashuv"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"shu qurilmaning joylashuvi haqidagi axborotga kirish"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun bu qurilmaning joylashuvi haqidagi axborotdan foydalanishiga ruxsat berilsinmi?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Bu ilovadan foydalanilayotdangina u joylashuv axborotidan foydalana oladi."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun bu qurilmaning joylashuvi haqidagi axborotdan foydalanishiga ruxsat berilsinmi?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Bu ilovadan foydalanilmaganda ham u doim joylashuv axborotidan foydalana oladi."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Taqvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"taqvimingizga kirish"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun taqvimingizga ruxsat berilsinmi?"</string>
@@ -314,9 +320,12 @@
<string name="permgrouplab_aural" msgid="965607064083134896">"Musiqa"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"musiqaga kirish"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun musiqangizga kirishga ruxsat berilsinmi?"</string>
- <string name="permgrouplab_visual" msgid="6477382108771145134">"Surat va videolar"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Suratlar va videolar"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"surat va videolarga kirish"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ilovasi uchun surat va videolaringizga, jumladan, teglangan joylarga ham ruxsat berilsinmi?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Oynadagi kontentni o‘qiydi"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Joriy oynadagi kontent mazmunini aniqlaydi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Teginib o‘rganish xizmatini yoqadi"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Ilova qisqa masofali aloqa (NFC) texnologiyasi yordamida NFC yorliqlari, kartalar va o‘qish moslamalari bilan ma’lumot almashishi mumkin."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ekran qulfini o‘chirib qo‘yish"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ilovaga ekran qulfini va har qanday parol yordamidagi xavfsizlik himoyalarini o‘chirishga ruxsat beradi. Masalan, kirish qo‘ng‘irog‘ida telefon ekran qulfini o‘chiradi va qo‘ng‘iroq tugashi bilan qulfni yoqadi."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ekran qulfi qiyinligi darajasi haqida soʻrov"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Ilova ekran qulfining qiyinlik darajasi (yuqori, oʻrta, past yoki hech qanday), jumladan, qulf turi va parol uzunligi haqida axborotga ruxsat oladi. Bundan tashqari, foydalanuvchilarga qulflash qiyinligi darajasini oshirish taklif etiladi. Bu tavsiyalar majburiy emas. Parollar ochiq matn sifatida saqlanmaydi va ilova uni ocha olmaydi."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"biometrik sensordan foydalanish"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Haqiqiylikni tekshirish uchun biometrik sensordan foydalanish imkonini beradi"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"barmoq izi skanerini boshqarish"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Ilova foydalanish uchun yuz namunalarini qo‘shish va o‘chirish usullarini tatbiq qilishi mumkin."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"yuzni aniqlash qurilmasidan foydalanish"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Haqiqiylikni tekshirish uchun skanerdan foydalanish imkonini beradi"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Yuz aniqlanmadi. Qaytadan urining."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Yuz juda yorqin. Yorug‘likni kamaytiring."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Yuz juda xira. Yorug‘likni oshiring."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Qurilmani yuzingizdan uzoqroq tuting."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Qurilmani yuzga yaqin tuting."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Qurilmani teparoq ko‘taring."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Qurilmani pastroq tushiring."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Qurilmani o‘ngroq suring."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Qurilmani chaproq suring."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Qurilma kamerasiga qarang."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Yuz aniqlanmadi."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Qurilmani qimirlatmang."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Yuzingizni qaytadan qayd qildiring."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Boshqa yuz aniqlandi."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Yuz ifodasi oldingiday. Holatingizni oʻzgartiring."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Kameraga tik qarang."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Kameraga tik qarang."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Boshingizni tik tuting."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Yuzingizni oching."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Yuzni aniqlash uchun qurilma mavjud emas."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Yuzni aniqlash vaqti tugadi. Qaytadan urining."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Aniqlangan yuz saqlanmadi."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Yuzni aniqlash bekor qilindi."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Yuz tekshiruvi bekor qilindi."</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Juda ko‘p urinildi. Keyinroq qaytadan urining."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Juda ko‘p urinildi. Skaner faolsizlantirildi."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Qaytadan urining."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Hech qanday yuz qayd qilinmagan."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Bu qurilmada yuzni aniqlash uchun skaner mavjud emas."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Yuz <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> ilovasini ochish"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> saqlanmasdan yopiladi"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> foydalanish uchun ajratilgan xotira chegarasidan o‘tib ketdi"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Hip-damp yaratildi. Uni ulashish uchun bosing."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Hip-damp ma’lumotlari bilan ulashasizmi?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> jarayoni o‘zi uchun ajratilgan <xliff:g id="SIZE">%2$s</xliff:g> xotira chegarasidan o‘tib ketdi. Ilova dasturchisi bilan ulashishingiz uchun hip-damp ma’lumotlari yig‘ilib qoldi. Ehtiyot bo\'ling: ushbu hip-dampda ilova uchun foydalanishga ruxsat berilgan shaxsiy ma’lumotlaringiz bo‘lishi mumkin."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Matn uchun amalni tanlash"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Jiringlaganda tovush balandligi"</string>
<string name="volume_music" msgid="5421651157138628171">"Multimedia tovushi"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Barcha tarmoqlarni ko‘rish uchun bosing"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Ulanish"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Barcha tarmoqlar"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g> topgan Wi‑Fi tarmoq mavjud"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"<xliff:g id="NAME">%s</xliff:g> topgan tarmoqqa ulanishni xohlaysizmi?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ha"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Yoʻq"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi avtomatik ravishda yoqiladi"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Tarmoqqa kirish"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tarmoqda internet aloqasi yo‘q"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Variantlarni ko‘rsatish uchun bosing"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Ulandi"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot sozlamalari o‘zgartirildi"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot chastotasi o‘zgartirildi."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Qurilma faqat 5 GGs chastotada ishlay olmaydi. Bu chastotadan imkoniyatga qarab foydalaniladi."</string>
@@ -1355,6 +1402,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozliklarni tuzatish"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB orqali nosozliklarni aniqlashni faolsizlantirish uchun bosing"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB orqali nosozliklarni tuzatishni o‘chirib qo‘yish uchun bosing."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB portda suyuqlik yoki parcha bor"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB port avtomatik tarzda faolsizlashtirildi. Batafsil axborot olish uchun bosing."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB portdan foydalanish xavfsiz"</string>
@@ -1906,8 +1957,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Qulfini ochish uchun bosing"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> qurilmasiga ulandi"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Fayllarni ko‘rish uchun bosing"</string>
- <string name="pin_target" msgid="3052256031352291362">"Qadash"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Olib tashlash"</string>
<string name="app_info" msgid="6856026610594615344">"Ilova haqida"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Demo boshlanmoqda…"</string>
@@ -1998,6 +2047,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Kun tartibi rejimi haqidagi bildirishnoma"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batareya quvvati odatdagidan ertaroq tugashi mumkin"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batareya quvvati uzoqroq ishlashi uchun Tejamkor rejim yoqildi"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Jild"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android ilova"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Fayl"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index d7effc0..a2f8639 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"WLAN 通话"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"关闭"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"首选 WLAN"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"首选移动数据网络"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"仅限 WLAN"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:无法转接"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"错误报告"</string>
<string name="global_action_logout" msgid="935179188218826050">"结束会话"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"屏幕截图"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"提交错误报告"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"这会收集有关当前设备状态的信息,并以电子邮件的形式进行发送。从开始生成错误报告到准备好发送需要一点时间,请耐心等待。"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"互动式报告"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"在大多数情况下,建议您使用此选项,以便追踪报告的生成进度,输入与相应问题相关的更多详细信息,以及截取屏幕截图。系统可能会省略掉一些不常用的区段,从而缩短生成报告的时间。"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"位置信息"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"获取此设备的位置信息"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"要允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”获取此设备的位置信息吗?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"只有当您使用该应用时,该应用才有权获取位置信息。"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"一律允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”获取此设备的位置信息吗?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"即使您并未使用该应用,该应用也将始终有权获取位置信息。"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日历"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"访问您的日历"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您的日历吗?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您的音乐吗?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"照片和视频"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"访问您的照片和视频"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您的照片和视频(包括标记的位置)吗?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"检索窗口内容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"检测您正访问的窗口的内容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"启用触摸浏览"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"允许应用与近距离无线通信(NFC)标签、卡和读取器通信。"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"停用屏幕锁定"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"允许该应用停用键锁以及任何关联的密码安全措施。例如,让手机在接听来电时停用键锁,在通话结束后重新启用键锁。"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"请求屏幕锁定复杂度"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"允许应用了解屏幕锁定复杂度(高、中、低或无),即屏幕锁定的可能长度范围和类型。应用还可以建议用户将屏幕锁定更新为特定复杂度,但用户可以随意选择忽略该建议并离开应用。请注意,系统不会以纯文字形式存储屏幕锁定选项的内容,因此应用不会知道确切密码。"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"使用生物特征硬件"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"允许该应用使用生物特征硬件进行身份验证"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"管理指纹硬件"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"允许该应用调用方法来添加和删除可用的人脸模板。"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用人脸身份验证硬件"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允许该应用使用人脸身份验证硬件进行身份验证"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"无法识别此面孔,请重试。"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"面部太亮,请在光线适中的环境下重试。"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"面部太暗,请不要挡住光线。"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"请将传感器移到距离面孔较远处。"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"请将传感器靠近面孔。"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"请上移传感器。"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"请下移传感器。"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"请右移传感器。"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"请左移传感器。"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"请目视传感器。"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"未检测到任何面孔。"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"请将设备拿稳。"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"请重新注册您的面孔。"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"检测到其他面孔。"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"与先前的姿势太相近,请换一个姿势。"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"请直视相机。"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"请直视相机。"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"请将头摆正。"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"请露出整张脸。"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"无法使用面孔识别硬件"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"面孔处理操作超时,请重试。"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"无法存储面孔。"</string>
<string name="face_error_canceled" msgid="283945501061931023">"面孔处理操作已取消。"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"用户已取消面孔验证。"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"尝试次数过多,请稍后重试。"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"尝试次数过多,系统已停用人脸身份验证功能。"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"请重试。"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"未注册任何面孔。"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"此设备没有人脸身份验证传感器。"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"面孔 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"打开<xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g>将会在不保存的情况下关闭"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>占用的内存已超出限制"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"已收集堆转储数据。点按即可分享。"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"要共享堆转储数据吗?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g>进程占用的内存已超出限制 (<xliff:g id="SIZE">%2$s</xliff:g>)。您可以将收集的堆转储数据共享给相应的开发者。请注意:此数据中可能包含该应用有权存取的您的个人信息。"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"选择要对文字执行的操作"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"铃声音量"</string>
<string name="volume_music" msgid="5421651157138628171">"媒体音量"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"点按即可查看所有网络"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"连接"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有网络"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g>建议的 WLAN 网络可以使用"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"要连接到<xliff:g id="NAME">%s</xliff:g>建议的网络吗?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"是"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"否"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WLAN 将自动开启"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"登录到网络"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"此 WLAN 网络无法访问互联网"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"点按即可查看相关选项"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"已连接"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"您的热点设置已变更"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"您的热点频段已变更。"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"此设备不支持您的偏好设置(仅限 5GHz),而且会在 5GHz 频段可用时使用该频段。"</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"已连接到 USB 调试"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"点按即可关闭 USB 调试"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"选择即可停用 USB 调试功能。"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB 端口中有液体或碎屑"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB 端口已自动停用。点按即可了解详情。"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"现在可安全使用 USB 端口"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"点按即可解锁工作资料"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"已连接到<xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"点按即可查看文件"</string>
- <string name="pin_target" msgid="3052256031352291362">"固定"</string>
- <string name="unpin_target" msgid="3556545602439143442">"取消固定"</string>
<string name="app_info" msgid="6856026610594615344">"应用信息"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"正在启动演示模式…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"日常安排模式信息通知"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"电池电量可能会在您平时的充电时间之前耗尽"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"已启用省电模式以延长电池续航时间"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"文件夹"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android 应用"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"文件"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 20231fc..c559ec2 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi 通話"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"關閉"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"首選 Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"流動數據優先"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"只限 Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:尚未轉接"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"錯誤報告"</string>
<string name="global_action_logout" msgid="935179188218826050">"結束工作階段"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"取得錯誤報告"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"這會收集您目前裝置狀態的相關資訊,並以電郵傳送給您。從開始建立錯誤報告到準備傳送需要一段時間,請耐心等候。"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"互動報告"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"在大部分情況下,建議您使用此選項,以便追蹤報告進度、輸入更多與問題相關的詳細資料,以及擷取螢幕畫面。系統可能會省略一些不常用的部分,以縮短產生報告的時間。"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"位置資訊"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"存取此裝置的位置"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取此裝置的位置資訊嗎?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"只有在您使用此應用程式時,應用程式才能存取位置資訊。"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"要一律允許「<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>」存取此裝置的位置資訊嗎?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"即使您沒有使用此應用程式,應用程式亦一直能夠存取位置資訊。"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日曆"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"存取您的日曆"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取您的日曆嗎?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"要允許「<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>」存取您的音樂嗎?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"相片和影片"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"存取您的相片和影片"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取您的相片和影片 (包括標記的位置資訊) 嗎?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您使用中的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"開啟「輕觸探索」功能"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"允許應用程式使用近距離無線通訊 (NFC) 標記、卡片及讀取程式進行通訊。"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"停用螢幕上鎖"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"允許應用程式停用按鍵鎖定以及其他相關的密碼安全措施。例如:手機收到來電時停用按鍵鎖定,通話結束後重新啟用按鍵鎖定。"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"要求螢幕鎖定複雜程度"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"允許應用程式瞭解螢幕鎖定的複雜程度 (高、中、低或無),這項資料說明了螢幕鎖定的可能長度範圍和類型。應用程式亦能建議使用者將螢幕鎖定更新至某個複雜程度,但使用者可以隨意忽略並離開。請注意,螢幕鎖定並非以純文字儲存,因此應用程式不知道確切的密碼。"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"使用生物識別硬件"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"允許應用程式使用生物識別硬件驗證"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"管理指紋硬件"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"允許應用程式調用方法,以加入和刪除可用的臉孔範本。"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用臉孔驗證硬件"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允許應用程式使用臉孔驗證硬件來驗證"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"無法識別臉孔,請再試一次。"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"臉孔太光亮,請在較暗的光線下嘗試。"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"臉孔太暗,請尋找更佳光源。"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"請將感應器移離臉孔。"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"請將感應器靠近臉孔。"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"請將感應器向上移。"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"請將感應器向下移。"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"請將感應器向右移。"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"請將感應器向左移。"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"請看著感應器。"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"未偵測到任何臉孔。"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"裝置不夠穩定。"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"請重新註冊臉孔。"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"偵測到不同的臉孔。"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"臉孔位置太相近,請改變您的姿勢。"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"請以更直視的角度看著鏡頭。"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"請以更直視的角度看著鏡頭。"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"請保持頭部垂直。"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"不要遮住臉孔。"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"無法使用臉孔識別硬件。"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"臉孔操作已逾時,請再試一次。"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"無法儲存臉孔。"</string>
<string name="face_error_canceled" msgid="283945501061931023">"臉孔操作已取消。"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"使用者已取消臉孔驗證。"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"嘗試次數過多,臉孔驗證已停用。"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"請再試一次。"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"未註冊任何臉孔。"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"此裝置沒有臉孔驗證感應器。"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"開啟「<xliff:g id="NEW_APP">%1$s</xliff:g>」"</string>
<string name="new_app_description" msgid="5894852887817332322">"「<xliff:g id="OLD_APP">%1$s</xliff:g>」將會在不儲存的情況下關閉"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> 的記憶體用量已超過限額"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"已收集堆轉儲,輕按即可分享。"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"分享堆轉儲?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"這處理程序 (<xliff:g id="PROC">%1$s</xliff:g>) 的記憶體用量已超過限額 (<xliff:g id="SIZE">%2$s</xliff:g>)。您可將已收集的堆轉儲分享給開發人員。請謹慎,這堆轉儲可包含該應用程式有權存取您的任何個人資料。"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"選擇處理文字的操作"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"鈴聲音量"</string>
<string name="volume_music" msgid="5421651157138628171">"媒體音量"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕按即可查看所有網絡"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有網絡"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"<xliff:g id="NAME">%s</xliff:g>建議的 Wi‑Fi 網絡現已可用"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"要連線至「<xliff:g id="NAME">%s</xliff:g>」建議的網絡嗎?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"是"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"否"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi 將會自動開啟"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"登入網絡"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi 並未連接互聯網"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"輕按即可查看選項"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"已連接"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"您的熱點設定變更"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"您的熱點頻段已變更。"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"此裝置不支援只限 5 GHz 的偏好設定,但會在 5 GHz 頻段可用時採用。"</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"輕按即可關閉 USB 偵錯功能"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"選取即可停用 USB 偵錯。"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB 連接埠中有液體或碎片"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"USB 連接埠已自動停用。輕按即可瞭解詳情。"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB 連接埠可安全使用"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"輕按即可將工作設定檔解鎖"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"已連線至 <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"輕按即可查看檔案"</string>
- <string name="pin_target" msgid="3052256031352291362">"固定"</string>
- <string name="unpin_target" msgid="3556545602439143442">"取消固定"</string>
<string name="app_info" msgid="6856026610594615344">"應用程式資料"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"正在開始示範…"</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"「日常安排模式」資料通知"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"電量可能會在日常充電前耗盡"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"「省電模式」已啟用,以便延長電池壽命"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"資料夾"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android 應用程式"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"檔案"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 8fa7681..77bbcb2 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Wi-Fi 通話"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"關閉"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi 優先"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"行動網路優先"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"只限 Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未轉接"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"錯誤報告"</string>
<string name="global_action_logout" msgid="935179188218826050">"結束"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"取得錯誤報告"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"這會收集你目前裝置狀態的相關資訊,以便透過電子郵件傳送。從錯誤報告開始建立到準備傳送的這段過程可能需要一點時間,敬請耐心等候。"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"互動式報告"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"在一般情況下,建議你使用這個選項,以便追蹤報告產生進度、輸入更多與問題相關的資訊,以及擷取螢幕畫面。系統可能會省略部分較少使用的區段,藉此縮短報告產生時間。"</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"位置"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"存取這台裝置的位置資訊"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取這個裝置的位置資訊嗎?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"該應用程式只有在你使用時,才能存取位置資訊。"</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"要一律允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取這個裝置的位置資訊嗎?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"該應用程式即使在你未使用時,也隨時可以存取位置資訊。"</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日曆"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"存取你的日曆"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的日曆嗎?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取你的音樂嗎?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"相片和影片"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"存取你的相片和影片"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<b></b>存取你的相片和影片 (包括加上標記的地點) 嗎?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查你存取的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"啟用輕觸探索功能"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"允許應用程式與近距離無線通訊 (NFC) 電子感應標籤、卡片及感應器進行通訊。"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"停用螢幕鎖定"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"允許應用程式停用按鍵鎖定以及其他相關的密碼安全性功能。例如:手機收到來電時停用按鍵鎖定,通話結束後重新啟用按鍵鎖定。"</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"要求螢幕鎖定的複雜度"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"允許應用程式記住螢幕鎖定的複雜度 (高、中、低或無),即螢幕鎖定的可能長度範圍和類型。這樣一來,應用程式還能建議使用者將螢幕鎖定更新為特定複雜度,但使用者可選擇忽略建議並離開應用程式。請注意,系統不會以純文字格式儲存螢幕鎖定選項的內容,因此應用程式不會知道確切密碼。"</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"使用生物特徵硬體"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"允許應用程式使用生物特徵硬體進行驗證"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"管理指紋硬體"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"允許應用程式呼叫方法來新增及移除可用的臉孔範本。"</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用臉孔驗證硬體"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允許應用程式使用臉孔驗證硬體進行驗證"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"無法識別臉孔,請再試一次。"</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"臉孔過亮。請移至光線適中的場所,然後再試一次。"</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"臉孔過暗。請增添光源,然後再試一次。"</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"請將感應器移到距離臉孔較遠處。"</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"請將感應器靠近臉孔。"</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"請將感應器往上移動。"</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"請將感應器往下移動。"</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"請將感應器往右移動。"</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"請將感應器往左移動。"</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"請直視感應器。"</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"未偵測到任何臉孔。"</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"請將裝置拿穩。"</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"請重新註冊你的臉孔。"</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"偵測到其他臉孔。"</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"與先前的姿勢太相似,請換一個姿勢。"</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"請直視鏡頭。"</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"請直視鏡頭。"</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"請將頭擺正。"</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"請不要遮住臉。"</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"無法使用臉部辨識硬體。"</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"臉孔處理作業逾時,請再試一次。"</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"無法儲存臉孔。"</string>
<string name="face_error_canceled" msgid="283945501061931023">"臉孔處理作業已取消。"</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"使用者已取消臉孔驗證。"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"嘗試次數過多,臉孔驗證功能已停用。"</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"請再試一次。"</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"未登錄任何臉孔。"</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"這個裝置沒有臉孔驗證感應器。"</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"開啟「<xliff:g id="NEW_APP">%1$s</xliff:g>」"</string>
<string name="new_app_description" msgid="5894852887817332322">"「<xliff:g id="OLD_APP">%1$s</xliff:g>」即將直接關閉不儲存"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> 已超出記憶體上限"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"已取得記憶體快照資料。輕觸即可分享。"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"分享記憶體快照資料?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"程序「<xliff:g id="PROC">%1$s</xliff:g>」已超出 <xliff:g id="SIZE">%2$s</xliff:g> 的程序記憶體上限。系統已產生記憶體快照資料,可供你與開發人員分享。請注意:記憶體快照資料中可能包含應用程式可存取的個人資訊。"</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"選取傳送文字內容的方式"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"鈴聲音量"</string>
<string name="volume_music" msgid="5421651157138628171">"媒體音量"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕觸即可查看所有網路"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有網路"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"「<xliff:g id="NAME">%s</xliff:g>」建議的 Wi‑Fi 網路可以使用"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"確定要連上「<xliff:g id="NAME">%s</xliff:g>」建議的網路嗎?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"是"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"否"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi 將自動開啟"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"登入網路"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi 沒有網際網路連線"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"輕觸即可查看選項"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"已連線"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"無線基地台設定變更"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"你的無線基地台頻帶已變更。"</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"這個裝置不支援你的偏好設定 (僅限 5GHz),而是會在 5GHz 可用時使用該頻帶。"</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"輕觸即可關閉 USB 偵錯功能"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"選取這個選項以停用 USB 偵錯功能。"</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"USB 連接埠中有液體或灰塵"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"系統已自動停用 USB 連接埠。輕觸即可瞭解詳情。"</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"現在可安全使用 USB 連接埠"</string>
@@ -1396,8 +1447,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"設定"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"退出"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"探索"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"切換輸出裝置"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"找不到 <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"請再次插入裝置"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"正在移動「<xliff:g id="NAME">%s</xliff:g>」"</string>
@@ -1906,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"輕觸即可將工作資料夾解鎖"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"已連線至 <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"輕觸即可查看檔案"</string>
- <string name="pin_target" msgid="3052256031352291362">"固定"</string>
- <string name="unpin_target" msgid="3556545602439143442">"取消固定"</string>
<string name="app_info" msgid="6856026610594615344">"應用程式資訊"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"正在啟動示範模式..."</string>
@@ -1998,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"日常安排模式資訊通知"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"電池電力可能會在你平常的充電時間前耗盡"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"已啟用節約耗電量模式以延長電池續航力"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"資料夾"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Android 應用程式"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"檔案"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 93280cb..ec66a72 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -141,8 +141,10 @@
<string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="1336669776254502831">"Ukushaya kwe-WiFi"</string>
<string name="wfcSpnFormat_vowifi" msgid="1765176406171272629">"VoWifi"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Valiwe"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Kuncanyelwa i-Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Kuncanyelwa iselula"</string>
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (7335489823608689868) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (7081742743152286290) -->
+ <skip />
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"I-Wi-Fi kuphela"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Akudlulisiwe"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -228,7 +230,8 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Umbiko wephutha"</string>
<string name="global_action_logout" msgid="935179188218826050">"Phothula isikhathi"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Isithombe-skrini"</string>
- <string name="bugreport_title" msgid="2667494803742548533">"Thatha umbiko wesiphazamiso"</string>
+ <!-- no translation found for bugreport_title (5981047024855257269) -->
+ <skip />
<string name="bugreport_message" msgid="398447048750350456">"Lokhu kuzoqoqa ulwazi mayelana nesimo samanje sedivayisi yakho, ukuthumela imilayezo ye-imeyili. Kuzothatha isikhathi esincane kusuka ekuqaleni umbiko wesiphazamiso uze ulungele ukuthunyelwa; sicela ubekezele."</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Umbiko obandakanyayo"</string>
<string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Sebenzisa lokhu ngaphansi kwezimo eziningi. Kukuvumela ukuthi ulandele ukuqhubeka kombiko, ufake imininingwane engeziwe mayelana nenkinga, futhi uthathe izithombe zikrini. Ingasika okunye ukukhetha okuncane okuthatha isikhathi eside ukubika."</string>
@@ -281,9 +284,12 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Indawo"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"finyelela kundawo yale divayisi"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ingene kundawo yale divayisi?"</string>
- <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Uhlelo lokusebenza luzoba nokufinyelela kundawo kuphela uma usebenzisa uhlelo lokusebenza."</string>
- <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Hlala uvumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele indawo yale divayisi?"</string>
- <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Uhlelo lokusebenza luzohlala lunokufinyelela kundawo, nanoma ungasebenzisi uhlelo lokusebenza."</string>
+ <!-- no translation found for permgrouprequestdetail_location (1347189607421252902) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequest_location (5039063878675613235) -->
+ <skip />
+ <!-- no translation found for permgroupbackgroundrequestdetail_location (4597006851453417387) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Ikhalenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"finyelela kukhalenda yakho"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele kukhalenda yakho?"</string>
@@ -316,7 +322,10 @@
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ifinyelele umculo wakho?"</string>
<string name="permgrouplab_visual" msgid="6477382108771145134">"Izithombe Namavidiyo"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"finyelela izithombe zakho namavidiyo"</string>
- <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vumela <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukufinyelela izithombe zakho namavidiyo, kufaka phakathi izindawo ezimakiwe?"</string>
+ <!-- no translation found for permgrouprequest_visual (4926581398380334943) -->
+ <skip />
+ <!-- no translation found for permgrouprequestdetail_visual (3827237829805228971) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Thola okuqukethwe kwewindi"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Hlola okuqukethwe kwewindi ohlanganyela nalo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vula ukuhlola ngokuthinta"</string>
@@ -509,8 +518,10 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Ivuela uhlelo lokusebenza ukuthi ixhumane ne-Near Field Communication (NFC) amathegi, amakhadi kanye nezinhlelo zokufunda."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"khubaza ukukhiya kwakho iskrini"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ivumela uhlelo lokusebenza ukukhubaza ukuvala ukhiye nanoma yikuphi ukuphepha kwephasiwedi okuhlobene. Isibonelo, ifoni ikhubaza ukuvala ukhiye lapho ithola ikholi yefoni engenayo, bese inike amandla kabusha ukuvala ukhiye lapho ikholi isiqedile."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"cela ukuxubana kokukhiya isikrini"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Ivumela uhlelo lokusebenza ukufunda ileveli yokukhiywa kwesikrini (phezulu, phakathi, phansi noma lutho), okubonisa ibanga elinokwenzeka lobubanzi nohlobo lokukhiywa kwesikrini. Uhlelo lokusebenza futhi lingaphakamisa kubasebenzisi ukuthi babuyekeze ukukhiywa kwesikrini kuya kwenye ileveli kodwa abasebenzisi bangaziba kalula bese bazule. Qaphela ukuthi ukhiywa kwesikrini akulondoloziwe embalweni ocacile ukuze uhlelo lokusebenza lingazi iphasiwedi."</string>
+ <!-- no translation found for permlab_requestPasswordComplexity (202650535669249674) -->
+ <skip />
+ <!-- no translation found for permdesc_requestPasswordComplexity (4730994229754212347) -->
+ <skip />
<string name="permlab_useBiometric" msgid="8837753668509919318">"sebenzisa izingxenyekazi zekhompyutha ze-biometric"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Ivumela uhlelo lokusebenza ukuthi lusebenzise izingxenyekazi zekhompyutha ze-biometric ukuze kuqinisekiswe"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"phatha izingxenyekazi zekhompyutha zezigxivizo zeminwe"</string>
@@ -565,37 +576,59 @@
<string name="permdesc_manageFace" msgid="8919637120670185330">"Ivumela uhlelo lokusebenza ukuthi luhoxise izindlela zokungeza nokususa amathempulethi obuso azosetshenziswa."</string>
<string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"sebenzisa izingxenyekazi zekhompuyutha zokufakazela ubuqiniso kobuso"</string>
<string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Ivumela uhlelo lokusebenza ukuthi lusebenzise ukufakazela ubuqiniso bobuso bezingxenyekazi ukuze kufakazelwe ubuqiniso"</string>
- <string name="face_acquired_insufficient" msgid="5901287247766106330">"Ayikwazanga ukucubungula ubuso. Sicela uzame futhi."</string>
- <string name="face_acquired_too_bright" msgid="610606792381297174">"Ubuso bukhanya kakhulu. Sicela uzame ekukhanyeni okuncane."</string>
- <string name="face_acquired_too_dark" msgid="7229162716976778371">"Ubuso bumnyama kakhulu. Sicela uvule umthombo wokukhanya."</string>
- <string name="face_acquired_too_close" msgid="1980310037427755293">"Sicela uhambise inzwa kude kunobuso."</string>
- <string name="face_acquired_too_far" msgid="4494571381828850007">"Sicela ulethe inzwa eduze kobuso."</string>
- <string name="face_acquired_too_high" msgid="228411096134808372">"Sicela uhambise inzwa phezulu."</string>
- <string name="face_acquired_too_low" msgid="4539774649296349109">"Sicela uhambise inzwa ngezansi."</string>
- <string name="face_acquired_too_right" msgid="1650292067226118760">"Sicela uhambise inzwa ngakwesokudla."</string>
- <string name="face_acquired_too_left" msgid="2712489669456176505">"Sicela uhambise inzwa ngakwesokunxele."</string>
- <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Sicela ubheke kunzwa."</string>
- <string name="face_acquired_not_detected" msgid="5707782294589511391">"Abukho ubuso obutholiwe."</string>
- <string name="face_acquired_too_much_motion" msgid="470381210701463822">"Ukunyakaza okukhulu kakhulu."</string>
+ <!-- no translation found for face_acquired_insufficient (2767330364802375742) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_bright (5005650874582450967) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_dark (1966194696381394616) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_close (1401011882624272753) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_far (1210969240069012510) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_high (3362395713403348013) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_low (488983581737550912) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_right (941726879175375970) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_left (5873592047381190672) -->
+ <skip />
+ <!-- no translation found for face_acquired_poor_gaze (8471716624377228327) -->
+ <skip />
+ <!-- no translation found for face_acquired_not_detected (4885504661626728809) -->
+ <skip />
+ <!-- no translation found for face_acquired_too_much_motion (3149332171102108851) -->
+ <skip />
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Sicela uphinde ubhalise ubuso bakho."</string>
- <string name="face_acquired_too_different" msgid="5553210341111255124">"Ubuso obuhlukile butholiwe."</string>
+ <!-- no translation found for face_acquired_too_different (7663983770123789694) -->
+ <skip />
<string name="face_acquired_too_similar" msgid="1508776858407646460">"Kufana kakhulu, sicela ushintshe ukuma kwakho."</string>
- <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"Sicela ubheke ngokuqondile kukhamera."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"Sicela ubheke ngokuqondile kukhamera."</string>
+ <!-- no translation found for face_acquired_pan_too_extreme (1852495480382773759) -->
+ <skip />
+ <!-- no translation found for face_acquired_tilt_too_extreme (1290820400317982049) -->
+ <skip />
<string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"Sicela uqondise ikhanda lakho ngokumile."</string>
- <string name="face_acquired_obscured" msgid="3055077697850272097">"Sicela uvule ubuso bakho."</string>
+ <!-- no translation found for face_acquired_obscured (5747521031647744553) -->
+ <skip />
+ <!-- no translation found for face_acquired_sensor_dirty (364493868630891300) -->
+ <skip />
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"Izingxenyekazi zekhompuyutha zobuso azitholakali."</string>
- <string name="face_error_timeout" msgid="4014326147867150054">"Kufinyelelwe kusikhathi sokuvala sobuso. Zama futhi."</string>
+ <!-- no translation found for face_error_timeout (2605673935810019129) -->
+ <skip />
<string name="face_error_no_space" msgid="8224993703466381314">"Ubuso abukwazi ukugcinwa."</string>
<string name="face_error_canceled" msgid="283945501061931023">"Umsebenzi wobuso ukhanselwe."</string>
<string name="face_error_user_canceled" msgid="8943921120862164539">"Ukufakazela ubuqiniso kobuso kukhanselwe umsebenzisi"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string>
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"Imizamo eminingi kakhulu. Ukufakazela ubuqiniso kobuso kukhutshaziwe."</string>
- <string name="face_error_unable_to_process" msgid="238761109287767270">"Zama futhi."</string>
- <string name="face_error_not_enrolled" msgid="9166792142679691323">"Abukho ubuso obubhalisiwe."</string>
- <string name="face_error_hw_not_present" msgid="916085883581450331">"Le divayisi ayinayo inzwa yokufakazela ubuqiniso yobuso."</string>
+ <!-- no translation found for face_error_unable_to_process (4940944939691171539) -->
+ <skip />
+ <!-- no translation found for face_error_not_enrolled (4245760276260427472) -->
+ <skip />
+ <!-- no translation found for face_error_hw_not_present (5296043240874659926) -->
+ <skip />
<string name="face_name_template" msgid="7004562145809595384">"Ubuso be-<xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1213,9 +1246,16 @@
<string name="new_app_action" msgid="6694851182870774403">"Vula i-<xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> izovala ngaphandle kokulondoloza"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"I-<xliff:g id="PROC">%1$s</xliff:g> idlule umkhawulo wememori"</string>
+ <!-- no translation found for dump_heap_ready_notification (1162196579925048701) -->
+ <skip />
<string name="dump_heap_notification_detail" msgid="3993078784053054141">"Ukulahlwa kwehipu kuqoqiwe. Thepha ukuze wabelane."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Yabelana ngokulahlwa kwehipu?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"Inqubo engu-<xliff:g id="PROC">%1$s</xliff:g> idlule inqubo yayo yomkhawulo wememori ongu-<xliff:g id="SIZE">%2$s</xliff:g>. Ukulahlwa kwehipu kuyatholakala kuwe ukuze wabelane nonjiniyela wayo. Qaphela: lokhu kulahlwa kwehipu kungaqukatha noma yiluphi ulwazi lakho lomuntu siqu uhlelo lokusebenza elinokufinyelela kukho."</string>
+ <!-- no translation found for dump_heap_text (8546022920319781701) -->
+ <skip />
+ <!-- no translation found for dump_heap_system_text (1205466256312104134) -->
+ <skip />
+ <!-- no translation found for dump_heap_ready_text (6759394977904051000) -->
+ <skip />
<string name="sendText" msgid="5209874571959469142">"Khetha okufanele kwenziwe okomqhafazo"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ivolumu yesishayeli"</string>
<string name="volume_music" msgid="5421651157138628171">"Ivolumu yemidiya"</string>
@@ -1254,8 +1294,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Thepha ukuze ubone onke amanethiwekhi"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Xhuma"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Onke amanethiwekhi"</string>
- <string name="wifi_suggestion_title" msgid="8951405130379148709">"Inethiwekhi ye-Wi-Fi ephakanyiswe u-<xliff:g id="NAME">%s</xliff:g> iyatholakala"</string>
- <string name="wifi_suggestion_content" msgid="2658317015552324848">"Uyafuna ukuxhumeka kumanethiwekhi aphakanyiswe u-<xliff:g id="NAME">%s</xliff:g>?"</string>
+ <!-- no translation found for wifi_suggestion_title (9099832833531486167) -->
+ <skip />
+ <!-- no translation found for wifi_suggestion_content (5883181205841582873) -->
+ <skip />
<string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yebo"</string>
<string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Cha"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"I-Wi-Fi izovuleka ngokuzenzakalela"</string>
@@ -1267,9 +1309,14 @@
<string name="network_available_sign_in" msgid="1848877297365446605">"Ngena ngemvume kunethiwekhi"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_no_internet" msgid="8938267198124654938">"I-Wi-Fi ayinakho ukufinyelela kwe-inthanethi"</string>
+ <!-- no translation found for wifi_no_internet (5198100389964214865) -->
+ <skip />
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Thepha ukuze uthole izinketho"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Kuxhunyiwe"</string>
+ <!-- no translation found for network_partial_connectivity (7774883385494762741) -->
+ <skip />
+ <!-- no translation found for network_partial_connectivity_detailed (1959697814165325217) -->
+ <skip />
<string name="wifi_softap_config_change" msgid="8475911871165857607">"Ushintsho kuzilungiselelo zakho ze-hotspot"</string>
<string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ibhendi yakho ye-hotspot ishintshile."</string>
<string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Le divayisi ayisekeli okuncamelayo kwe-5GHz kuphela. Kunalokho, le divayisi izosebenzisa ibhendi ye-5GHz uma itholakala."</string>
@@ -1354,6 +1401,10 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ukulungisa iphutha le-USB kuxhunyiwe"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"Thepha ukuze uvale ukulungisa amaphutha kwe-USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Khetha ukuvimbela ukulungisa iphutha le-USB."</string>
+ <!-- no translation found for test_harness_mode_notification_title (2216359742631914387) -->
+ <skip />
+ <!-- no translation found for test_harness_mode_notification_message (1343197173054407119) -->
+ <skip />
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Uketshezi noma ama-debris kumbobo ye-USB"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Imbobo ye-USB inqanyulwa ngokuzenzakalela. Thepha ukuze ufunde kabanzi."</string>
<string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"Kuphephile ukusebenzisa imbobo ye-USB"</string>
@@ -1905,8 +1956,6 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"Thepha ukuze uvule iphrofayela yomsebenzi"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Kuxhumekile ku-<xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Thepha ukuze ubuke onke amafayela"</string>
- <string name="pin_target" msgid="3052256031352291362">"Phina"</string>
- <string name="unpin_target" msgid="3556545602439143442">"Susa ukuphina"</string>
<string name="app_info" msgid="6856026610594615344">"Ulwazi lohlelo lokusebenza"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="5268556852031489931">"Iqalisa i-demo..."</string>
@@ -1997,6 +2046,22 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Isaziso solwazi lwe-Routine Mode"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Ibhethri lingaphela ngaphambi kokushaja okuvamile"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Isilondolozi sebhethri siyasebenza ngaphandle kwempilo yebhethri"</string>
+ <!-- no translation found for battery_saver_notification_channel_name (2083316159716201806) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_title (6376147579378764641) -->
+ <skip />
+ <!-- no translation found for battery_saver_sticky_disabled_notification_summary (8090192609249817945) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (2960978289873161288) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (7555713825806482451) -->
+ <skip />
+ <!-- no translation found for battery_saver_charged_notification_title (5954873381559605660) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_notification_summary (1374222493681267143) -->
+ <skip />
+ <!-- no translation found for battery_saver_off_alternative_notification_summary (4340727818546508436) -->
+ <skip />
<string name="mime_type_folder" msgid="7111951698626315204">"Ifolda"</string>
<string name="mime_type_apk" msgid="5518003630972506900">"Uhlelo lokusebenza lwe-Android"</string>
<string name="mime_type_generic" msgid="6833871596845900027">"Ifayela"</string>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index fe2c665..362d01c 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -1673,8 +1673,19 @@
This flag is turned on by default. <em>This attribute is usable only by system apps.
</em> -->
<attr name="allowClearUserDataOnFailedRestore"/>
- <!-- If {@code true} the app's non sensitive audio can be capture by other apps.
- The default value is true. -->
+ <!-- If {@code true} the app's non sensitive audio can be capture by other apps with
+ {@code AudioPlaybackCaptureConfiguration} and a {@code MediaProjection}.
+
+ <p>
+ Non sensitive audio is defined as audio whose {@code AttributeUsage} is
+ {@code USAGE_UNKNOWN}), {@code USAGE_MEDIA}) or {@code USAGE_GAME}).
+ All other usages (eg. {@code USAGE_VOICE_COMMUNICATION}) will not be captured.
+
+ <p>
+ The default value is:
+ - {@code true} for apps with targetSdkVersion >= 29 (Q).
+ - {@code false} for apps with targetSdkVersion < 29.
+ -->
<attr name="allowAudioPlaybackCapture" format="boolean" />
</declare-styleable>
<!-- The <code>permission</code> tag declares a security permission that can be
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index dc0ec03..5f3b328 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -3975,4 +3975,7 @@
<!-- The type of the light sensor to be used by the display framework for things like
auto-brightness. If unset, then it just gets the default sensor of type TYPE_LIGHT. -->
<string name="config_displayLightSensorType" translatable="false" />
+
+ <!-- Whether or not to enable automatic heap dumps for the system server on debuggable builds. -->
+ <bool name="config_debugEnableAutomaticSystemServerHeapDumps">false</bool>
</resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 023fbad..feecd02 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -725,4 +725,5 @@
<dimen name="resolver_icon_size">42dp</dimen>
<dimen name="resolver_badge_size">18dp</dimen>
<dimen name="chooser_target_width">76dp</dimen>
+ <dimen name="chooser_max_collapsed_height">288dp</dimen>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ae54a6a..0ce6851f 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2771,6 +2771,7 @@
<java-symbol type="dimen" name="chooser_edge_margin_normal" />
<java-symbol type="dimen" name="chooser_preview_image_font_size"/>
<java-symbol type="dimen" name="chooser_preview_width" />
+ <java-symbol type="dimen" name="chooser_max_collapsed_height" />
<java-symbol type="layout" name="chooser_grid" />
<java-symbol type="layout" name="chooser_grid_preview_text" />
<java-symbol type="layout" name="chooser_grid_preview_image" />
@@ -3222,6 +3223,8 @@
<java-symbol type="string" name="config_batterymeterPowersavePath" />
<java-symbol type="bool" name="config_batterymeterDualTone" />
+ <java-symbol type="bool" name="config_debugEnableAutomaticSystemServerHeapDumps" />
+
<!-- Accessibility Shortcut -->
<java-symbol type="string" name="accessibility_shortcut_warning_dialog_title" />
<java-symbol type="string" name="accessibility_shortcut_toogle_warning" />
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 8fc6a96..80250db 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -287,8 +287,6 @@
Settings.Global.HDMI_CONTROL_ENABLED,
Settings.Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED,
- Settings.Global.HIDDEN_API_ACCESS_LOG_SAMPLING_RATE,
- Settings.Global.HIDDEN_API_ACCESS_STATSLOG_SAMPLING_RATE,
Settings.Global.HIDDEN_API_POLICY,
Settings.Global.HIDE_ERROR_DIALOGS,
Settings.Global.HTTP_PROXY,
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
index 8c2375e..185fa07 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
@@ -599,7 +599,7 @@
mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
waitForIdle();
- verify(mockLogger, Mockito.times(3)).write(logMakerCaptor.capture());
+ verify(mockLogger, Mockito.times(2)).write(logMakerCaptor.capture());
// First invocation is from onCreate
assertThat(logMakerCaptor.getAllValues().get(1).getCategory(),
is(MetricsEvent.ACTION_SHARE_WITH_PREVIEW));
@@ -629,7 +629,7 @@
ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class);
mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
waitForIdle();
- verify(mockLogger, Mockito.times(3)).write(logMakerCaptor.capture());
+ verify(mockLogger, Mockito.times(2)).write(logMakerCaptor.capture());
// First invocation is from onCreate
assertThat(logMakerCaptor.getAllValues().get(1).getCategory(),
is(MetricsEvent.ACTION_SHARE_WITH_PREVIEW));
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index fd37735..3190678 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -240,7 +240,7 @@
}
public void drawColor(@ColorInt int color) {
- nDrawColor(mNativeCanvasWrapper, color, PorterDuff.Mode.SRC_OVER.nativeInt);
+ nDrawColor(mNativeCanvasWrapper, color, BlendMode.SRC_OVER.getXfermode().porterDuffMode);
}
/**
diff --git a/graphics/java/android/graphics/BaseRecordingCanvas.java b/graphics/java/android/graphics/BaseRecordingCanvas.java
index 3e11741..2afc3d2 100644
--- a/graphics/java/android/graphics/BaseRecordingCanvas.java
+++ b/graphics/java/android/graphics/BaseRecordingCanvas.java
@@ -200,7 +200,7 @@
@Override
public final void drawColor(@ColorInt int color) {
- nDrawColor(mNativeCanvasWrapper, color, PorterDuff.Mode.SRC_OVER.nativeInt);
+ nDrawColor(mNativeCanvasWrapper, color, BlendMode.SRC_OVER.getXfermode().porterDuffMode);
}
/**
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index 49c3a3b..d8a8640 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -436,9 +436,15 @@
static void validate(Options opts) {
if (opts == null) return;
- if (opts.inBitmap != null && opts.inBitmap.getConfig() == Bitmap.Config.HARDWARE) {
- throw new IllegalArgumentException(
- "Bitmaps with Config.HARDWARE are always immutable");
+ if (opts.inBitmap != null) {
+ if (opts.inBitmap.getConfig() == Bitmap.Config.HARDWARE) {
+ throw new IllegalArgumentException(
+ "Bitmaps with Config.HARDWARE are always immutable");
+ }
+ if (opts.inBitmap.isRecycled()) {
+ throw new IllegalArgumentException(
+ "Cannot reuse a recycled Bitmap");
+ }
}
if (opts.inMutable && opts.inPreferredConfig == Bitmap.Config.HARDWARE) {
diff --git a/graphics/java/android/graphics/BlendMode.java b/graphics/java/android/graphics/BlendMode.java
index 39392c8..0b26704 100644
--- a/graphics/java/android/graphics/BlendMode.java
+++ b/graphics/java/android/graphics/BlendMode.java
@@ -454,6 +454,64 @@
return null;
}
+ /**
+ * @hide
+ */
+ public static int toValue(BlendMode mode) {
+ return mode.getXfermode().porterDuffMode;
+ }
+
+ /**
+ * @hide
+ */
+ public static @Nullable PorterDuff.Mode blendModeToPorterDuffMode(@Nullable BlendMode mode) {
+ if (mode != null) {
+ switch (mode) {
+ case CLEAR:
+ return PorterDuff.Mode.CLEAR;
+ case SRC:
+ return PorterDuff.Mode.SRC;
+ case DST:
+ return PorterDuff.Mode.DST;
+ case SRC_OVER:
+ return PorterDuff.Mode.SRC_OVER;
+ case DST_OVER:
+ return PorterDuff.Mode.DST_OVER;
+ case SRC_IN:
+ return PorterDuff.Mode.SRC_IN;
+ case DST_IN:
+ return PorterDuff.Mode.DST_IN;
+ case SRC_OUT:
+ return PorterDuff.Mode.SRC_OUT;
+ case DST_OUT:
+ return PorterDuff.Mode.DST_OUT;
+ case SRC_ATOP:
+ return PorterDuff.Mode.SRC_ATOP;
+ case DST_ATOP:
+ return PorterDuff.Mode.DST_ATOP;
+ case XOR:
+ return PorterDuff.Mode.XOR;
+ case DARKEN:
+ return PorterDuff.Mode.DARKEN;
+ case LIGHTEN:
+ return PorterDuff.Mode.LIGHTEN;
+ // b/73224934 PorterDuff Multiply maps to Skia Modulate
+ case MODULATE:
+ return PorterDuff.Mode.MULTIPLY;
+ case SCREEN:
+ return PorterDuff.Mode.SCREEN;
+ case PLUS:
+ return PorterDuff.Mode.ADD;
+ case OVERLAY:
+ return PorterDuff.Mode.OVERLAY;
+ default:
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
@NonNull
private final Xfermode mXfermode;
diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java
index 189e174..93ddb10 100644
--- a/graphics/java/android/graphics/ComposeShader.java
+++ b/graphics/java/android/graphics/ComposeShader.java
@@ -39,7 +39,10 @@
* @param shaderB The colors from this shader are seen as the "src" by the mode
* @param mode The mode that combines the colors from the two shaders. If mode
* is null, then SRC_OVER is assumed.
+ *
+ * @deprecated use {@link #ComposeShader(Shader, Shader, BlendMode)} instead
*/
+ @Deprecated
public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull Xfermode mode) {
this(shaderA, shaderB, mode.porterDuffMode);
}
@@ -52,12 +55,29 @@
* @param shaderA The colors from this shader are seen as the "dst" by the mode
* @param shaderB The colors from this shader are seen as the "src" by the mode
* @param mode The PorterDuff mode that combines the colors from the two shaders.
- */
+ *
+ * @deprecated use {@link #ComposeShader(Shader, Shader, BlendMode)} instead
+ */
+ @Deprecated
public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB,
@NonNull PorterDuff.Mode mode) {
this(shaderA, shaderB, mode.nativeInt);
}
+ /**
+ * Create a new compose shader, given shaders A, B, and a combining PorterDuff mode.
+ * When the mode is applied, it will be given the result from shader A as its
+ * "dst", and the result from shader B as its "src".
+ *
+ * @param shaderA The colors from this shader are seen as the "dst" by the mode
+ * @param shaderB The colors from this shader are seen as the "src" by the mode
+ * @param blendMode The blend mode that combines the colors from the two shaders.
+ */
+ public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB,
+ @NonNull BlendMode blendMode) {
+ this(shaderA, shaderB, blendMode.getXfermode().porterDuffMode);
+ }
+
private ComposeShader(Shader shaderA, Shader shaderB, int nativeMode) {
if (shaderA == null || shaderB == null) {
throw new IllegalArgumentException("Shader parameters must not be null");
diff --git a/graphics/java/android/graphics/PorterDuff.java b/graphics/java/android/graphics/PorterDuff.java
index fba5043..459291b 100644
--- a/graphics/java/android/graphics/PorterDuff.java
+++ b/graphics/java/android/graphics/PorterDuff.java
@@ -23,7 +23,10 @@
* that can be passed to {@link PorterDuffXfermode}, a specialized implementation
* of {@link Paint}'s {@link Paint#setXfermode(Xfermode) transfer mode}.
* All the available modes can be found in the {@link Mode} enum.</p>
+ *
+ * @deprecated Use {@link BlendMode} with {@link Paint#setBlendMode(BlendMode)} instead
*/
+@Deprecated
public class PorterDuff {
/**
* {@usesMathJax}
diff --git a/graphics/java/android/graphics/PorterDuffXfermode.java b/graphics/java/android/graphics/PorterDuffXfermode.java
index 84d953d..5b933c4 100644
--- a/graphics/java/android/graphics/PorterDuffXfermode.java
+++ b/graphics/java/android/graphics/PorterDuffXfermode.java
@@ -21,6 +21,11 @@
* {@link Paint#setXfermode(Xfermode) transfer mode}. Refer to the
* documentation of the {@link PorterDuff.Mode} enum for more
* information on the available alpha compositing and blending modes.</p>
+ *
+ * @deprecated Consider using {@link BlendMode} instead as it supports a wider
+ * set of blend modes than those defined in {@link PorterDuff.Mode}
+ *
+ * @see Paint#setBlendMode(BlendMode)
*/
public class PorterDuffXfermode extends Xfermode {
/**
diff --git a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
index cb12a7c..7def322 100644
--- a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
+++ b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
@@ -27,6 +27,7 @@
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
+import android.graphics.BlendMode;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
@@ -35,7 +36,6 @@
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.Shader;
@@ -701,13 +701,13 @@
}
@Override
- public void setTintMode(Mode tintMode) {
+ public void setTintMode(@NonNull BlendMode blendMode) {
final ChildDrawable[] array = mLayerState.mChildren;
final int N = mLayerState.N_CHILDREN;
for (int i = 0; i < N; i++) {
final Drawable dr = array[i].mDrawable;
if (dr != null) {
- dr.setTintMode(tintMode);
+ dr.setTintMode(blendMode);
}
}
}
diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
index d9dab98..f45bf9b 100644
--- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
@@ -33,12 +33,12 @@
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
+import android.graphics.BlendMode;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Insets;
import android.graphics.Outline;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
import android.graphics.RecordingCanvas;
import android.graphics.Rect;
import android.graphics.RenderNode;
@@ -477,8 +477,8 @@
}
@Override
- public void setTintMode(PorterDuff.Mode tintMode) {
- mAnimatedVectorState.mVectorDrawable.setTintMode(tintMode);
+ public void setTintMode(@NonNull BlendMode blendMode) {
+ mAnimatedVectorState.mVectorDrawable.setTintMode(blendMode);
}
@Override
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index 9761901..6b30158 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -25,6 +25,8 @@
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
+import android.graphics.BlendMode;
+import android.graphics.BlendModeColorFilter;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.ImageDecoder;
@@ -33,9 +35,7 @@
import android.graphics.Outline;
import android.graphics.Paint;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.Xfermode;
@@ -90,7 +90,7 @@
@UnsupportedAppUsage
private BitmapState mBitmapState;
- private PorterDuffColorFilter mTintFilter;
+ private BlendModeColorFilter mBlendModeFilter;
@UnsupportedAppUsage
private int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
@@ -527,8 +527,8 @@
}
final boolean clearColorFilter;
- if (mTintFilter != null && paint.getColorFilter() == null) {
- paint.setColorFilter(mTintFilter);
+ if (mBlendModeFilter != null && paint.getColorFilter() == null) {
+ paint.setColorFilter(mBlendModeFilter);
clearColorFilter = true;
} else {
clearColorFilter = false;
@@ -678,17 +678,19 @@
final BitmapState state = mBitmapState;
if (state.mTint != tint) {
state.mTint = tint;
- mTintFilter = updateTintFilter(mTintFilter, tint, mBitmapState.mTintMode);
+ mBlendModeFilter = updateBlendModeFilter(mBlendModeFilter, tint,
+ mBitmapState.mBlendMode);
invalidateSelf();
}
}
@Override
- public void setTintMode(PorterDuff.Mode tintMode) {
+ public void setTintMode(@NonNull BlendMode blendMode) {
final BitmapState state = mBitmapState;
- if (state.mTintMode != tintMode) {
- state.mTintMode = tintMode;
- mTintFilter = updateTintFilter(mTintFilter, mBitmapState.mTint, tintMode);
+ if (state.mBlendMode != blendMode) {
+ state.mBlendMode = blendMode;
+ mBlendModeFilter = updateBlendModeFilter(mBlendModeFilter, mBitmapState.mTint,
+ blendMode);
invalidateSelf();
}
}
@@ -706,7 +708,7 @@
*/
@UnsupportedAppUsage
public Mode getTintMode() {
- return mBitmapState.mTintMode;
+ return BlendMode.blendModeToPorterDuffMode(mBitmapState.mBlendMode);
}
/**
@@ -744,8 +746,9 @@
@Override
protected boolean onStateChange(int[] stateSet) {
final BitmapState state = mBitmapState;
- if (state.mTint != null && state.mTintMode != null) {
- mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ if (state.mTint != null && state.mBlendMode != null) {
+ mBlendModeFilter = updateBlendModeFilter(mBlendModeFilter, state.mTint,
+ state.mBlendMode);
return true;
}
return false;
@@ -864,7 +867,7 @@
final int tintMode = a.getInt(R.styleable.BitmapDrawable_tintMode, -1);
if (tintMode != -1) {
- state.mTintMode = Drawable.parseTintMode(tintMode, Mode.SRC_IN);
+ state.mBlendMode = Drawable.parseBlendMode(tintMode, BlendMode.SRC_IN);
}
final ColorStateList tint = a.getColorStateList(R.styleable.BitmapDrawable_tint);
@@ -979,7 +982,8 @@
int[] mThemeAttrs = null;
Bitmap mBitmap = null;
ColorStateList mTint = null;
- Mode mTintMode = DEFAULT_TINT_MODE;
+ BlendMode mBlendMode = DEFAULT_BLEND_MODE;
+
int mGravity = Gravity.FILL;
float mBaseAlpha = 1.0f;
Shader.TileMode mTileModeX = null;
@@ -1005,7 +1009,7 @@
BitmapState(BitmapState bitmapState) {
mBitmap = bitmapState.mBitmap;
mTint = bitmapState.mTint;
- mTintMode = bitmapState.mTintMode;
+ mBlendMode = bitmapState.mBlendMode;
mThemeAttrs = bitmapState.mThemeAttrs;
mChangingConfigurations = bitmapState.mChangingConfigurations;
mGravity = bitmapState.mGravity;
@@ -1065,7 +1069,8 @@
*/
private void updateLocalState(Resources res) {
mTargetDensity = resolveDensity(res, mBitmapState.mTargetDensity);
- mTintFilter = updateTintFilter(mTintFilter, mBitmapState.mTint, mBitmapState.mTintMode);
+ mBlendModeFilter = updateBlendModeFilter(mBlendModeFilter, mBitmapState.mTint,
+ mBitmapState.mBlendMode);
computeBitmapSize();
}
}
diff --git a/graphics/java/android/graphics/drawable/ColorDrawable.java b/graphics/java/android/graphics/drawable/ColorDrawable.java
index 3c44916..efa806a 100644
--- a/graphics/java/android/graphics/drawable/ColorDrawable.java
+++ b/graphics/java/android/graphics/drawable/ColorDrawable.java
@@ -26,13 +26,13 @@
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
+import android.graphics.BlendMode;
+import android.graphics.BlendModeColorFilter;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Outline;
import android.graphics.Paint;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffColorFilter;
import android.graphics.Xfermode;
import android.util.AttributeSet;
import android.view.ViewDebug;
@@ -58,7 +58,7 @@
@ViewDebug.ExportedProperty(deepExport = true, prefix = "state_")
private ColorState mColorState;
- private PorterDuffColorFilter mTintFilter;
+ private BlendModeColorFilter mBlendModeColorFilter;
private boolean mMutated;
@@ -111,9 +111,10 @@
@Override
public void draw(Canvas canvas) {
final ColorFilter colorFilter = mPaint.getColorFilter();
- if ((mColorState.mUseColor >>> 24) != 0 || colorFilter != null || mTintFilter != null) {
+ if ((mColorState.mUseColor >>> 24) != 0 || colorFilter != null
+ || mBlendModeColorFilter != null) {
if (colorFilter == null) {
- mPaint.setColorFilter(mTintFilter);
+ mPaint.setColorFilter(mBlendModeColorFilter);
}
mPaint.setColor(mColorState.mUseColor);
@@ -208,22 +209,25 @@
@Override
public void setTintList(ColorStateList tint) {
mColorState.mTint = tint;
- mTintFilter = updateTintFilter(mTintFilter, tint, mColorState.mTintMode);
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, tint,
+ mColorState.mBlendMode);
invalidateSelf();
}
@Override
- public void setTintMode(Mode tintMode) {
- mColorState.mTintMode = tintMode;
- mTintFilter = updateTintFilter(mTintFilter, mColorState.mTint, tintMode);
+ public void setTintMode(@NonNull BlendMode blendMode) {
+ mColorState.mBlendMode = blendMode;
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, mColorState.mTint,
+ blendMode);
invalidateSelf();
}
@Override
protected boolean onStateChange(int[] stateSet) {
final ColorState state = mColorState;
- if (state.mTint != null && state.mTintMode != null) {
- mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ if (state.mTint != null && state.mBlendMode != null) {
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, state.mTint,
+ state.mBlendMode);
return true;
}
return false;
@@ -261,7 +265,7 @@
@Override
public int getOpacity() {
- if (mTintFilter != null || mPaint.getColorFilter() != null) {
+ if (mBlendModeColorFilter != null || mPaint.getColorFilter() != null) {
return PixelFormat.TRANSLUCENT;
}
@@ -348,7 +352,7 @@
int mUseColor; // basecolor modulated by setAlpha()
@Config int mChangingConfigurations;
ColorStateList mTint = null;
- Mode mTintMode = DEFAULT_TINT_MODE;
+ BlendMode mBlendMode = DEFAULT_BLEND_MODE;
ColorState() {
// Empty constructor.
@@ -360,7 +364,7 @@
mUseColor = state.mUseColor;
mChangingConfigurations = state.mChangingConfigurations;
mTint = state.mTint;
- mTintMode = state.mTintMode;
+ mBlendMode = state.mBlendMode;
}
@Override
@@ -398,6 +402,7 @@
* after inflating or applying a theme.
*/
private void updateLocalState(Resources r) {
- mTintFilter = updateTintFilter(mTintFilter, mColorState.mTint, mColorState.mTintMode);
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, mColorState.mTint,
+ mColorState.mBlendMode);
}
}
diff --git a/graphics/java/android/graphics/drawable/ColorStateListDrawable.java b/graphics/java/android/graphics/drawable/ColorStateListDrawable.java
index ee4d1e7..b94b114 100644
--- a/graphics/java/android/graphics/drawable/ColorStateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/ColorStateListDrawable.java
@@ -21,10 +21,10 @@
import android.content.pm.ActivityInfo;
import android.content.res.ColorStateList;
import android.content.res.Resources;
+import android.graphics.BlendMode;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
import android.util.MathUtils;
/**
@@ -114,9 +114,9 @@
}
@Override
- public void setTintMode(@NonNull PorterDuff.Mode tintMode) {
- mState.mTintMode = tintMode;
- mColorDrawable.setTintMode(tintMode);
+ public void setTintMode(@NonNull BlendMode blendMode) {
+ mState.mBlendMode = blendMode;
+ mColorDrawable.setTintMode(blendMode);
onStateChange(getState());
}
@@ -236,7 +236,7 @@
ColorStateList mColor = null;
ColorStateList mTint = null;
int mAlpha = -1;
- PorterDuff.Mode mTintMode = DEFAULT_TINT_MODE;
+ BlendMode mBlendMode = DEFAULT_BLEND_MODE;
@ActivityInfo.Config int mChangingConfigurations = 0;
ColorStateListDrawableState() {
@@ -246,7 +246,7 @@
mColor = state.mColor;
mTint = state.mTint;
mAlpha = state.mAlpha;
- mTintMode = state.mTintMode;
+ mBlendMode = state.mBlendMode;
mChangingConfigurations = state.mChangingConfigurations;
}
@@ -292,8 +292,8 @@
mColorDrawable.setTintList(mState.mTint);
}
- if (mState.mTintMode != DEFAULT_TINT_MODE) {
- mColorDrawable.setTintMode(mState.mTintMode);
+ if (mState.mBlendMode != DEFAULT_BLEND_MODE) {
+ mColorDrawable.setTintMode(mState.mBlendMode);
}
}
}
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 49d3530..e4142a9 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -30,6 +30,8 @@
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.BlendMode;
+import android.graphics.BlendModeColorFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
@@ -182,6 +184,7 @@
private static final Rect ZERO_BOUNDS_RECT = new Rect();
static final PorterDuff.Mode DEFAULT_TINT_MODE = PorterDuff.Mode.SRC_IN;
+ static final BlendMode DEFAULT_BLEND_MODE = BlendMode.SRC_IN;
private int[] mStateSet = StateSet.WILD_CARD;
private int mLevel = 0;
@@ -210,6 +213,24 @@
protected int mSrcDensityOverride = 0;
/**
+ * Flag used to break the recursive loop between setTintMode(PorterDuff.Mode) and
+ * setTintMode(BlendMode) as each default implementation invokes the other in order to
+ * support new use cases that utilize the new blending modes as well as support the legacy
+ * use cases. This flag tracks that {@link #setTintMode(BlendMode)} is only invoked once
+ * per invocation.
+ */
+ private boolean mSetBlendModeInvoked = false;
+
+ /**
+ * Flag used to break the recursive loop between setTintMode(PorterDuff.Mode) and
+ * setTintMode(BlendMode) as each default implementation invokes the other in order to
+ * support new use cases that utilize the new blending modes as well as support the legacy
+ * use cases. This flag tracks that {@link #setTintMode(Mode)} is only invoked once
+ * per invocation;
+ */
+ private boolean mSetTintModeInvoked = false;
+
+ /**
* Draw in its bounds (set via setBounds) respecting optional effects such
* as alpha (set via setAlpha) and color filter (set via setColorFilter).
*
@@ -630,6 +651,7 @@
* @param tintColor Color to use for tinting this drawable
* @see #setTintList(ColorStateList)
* @see #setTintMode(PorterDuff.Mode)
+ * @see #setTintMode(BlendMode)
*/
public void setTint(@ColorInt int tintColor) {
setTintList(ColorStateList.valueOf(tintColor));
@@ -651,6 +673,7 @@
* {@code null} to clear the tint
* @see #setTint(int)
* @see #setTintMode(PorterDuff.Mode)
+ * @see #setTintMode(BlendMode)
*/
public void setTintList(@Nullable ColorStateList tint) {}
@@ -668,8 +691,45 @@
* @param tintMode A Porter-Duff blending mode
* @see #setTint(int)
* @see #setTintList(ColorStateList)
+ *
+ * @deprecated use {@link #setTintMode(BlendMode)} instead
*/
- public void setTintMode(@NonNull PorterDuff.Mode tintMode) {}
+ @Deprecated
+ public void setTintMode(@NonNull PorterDuff.Mode tintMode) {
+ if (!mSetTintModeInvoked) {
+ mSetTintModeInvoked = true;
+ BlendMode mode = BlendMode.fromValue(tintMode.nativeInt);
+ if (mode != null) {
+ setTintMode(mode);
+ }
+ mSetTintModeInvoked = false;
+ }
+ }
+
+ /**
+ * Specifies a tint blending mode for this drawable.
+ * <p>
+ * Defines how this drawable's tint color should be blended into the drawable
+ * before it is drawn to screen. Default tint mode is {@link BlendMode#SRC_IN}.
+ * </p>
+ * <p class="note"><strong>Note:</strong> Setting a color filter via
+ * {@link #setColorFilter(ColorFilter)}
+ * </p>
+ *
+ * @param blendMode
+ * @see #setTint(int)
+ * @see #setTintList(ColorStateList)
+ */
+ public void setTintMode(@NonNull BlendMode blendMode) {
+ if (!mSetBlendModeInvoked) {
+ mSetBlendModeInvoked = true;
+ PorterDuff.Mode mode = BlendMode.blendModeToPorterDuffMode(blendMode);
+ if (mode != null) {
+ setTintMode(mode);
+ }
+ mSetBlendModeInvoked = false;
+ }
+ }
/**
* Returns the current color filter, or {@code null} if none set.
@@ -1540,6 +1600,20 @@
return tintFilter;
}
+ @Nullable BlendModeColorFilter updateBlendModeFilter(@Nullable BlendModeColorFilter blendFilter,
+ @Nullable ColorStateList tint, @Nullable BlendMode blendMode) {
+ if (tint == null || blendMode == null) {
+ return null;
+ }
+
+ final int color = tint.getColorForState(getState(), Color.TRANSPARENT);
+ if (blendFilter == null || blendFilter.getColor() != color
+ || blendFilter.getMode() != blendMode) {
+ return new BlendModeColorFilter(color, blendMode);
+ }
+ return blendFilter;
+ }
+
/**
* Obtains styled attributes from the theme, if available, or unstyled
* resources if the theme is null.
@@ -1642,5 +1716,26 @@
default: return defaultMode;
}
}
+
+ /**
+ * Parses a {@link android.graphics.BlendMode} from a tintMode
+ * attribute's enum value.
+ *
+ * @hide
+ */
+ @UnsupportedAppUsage
+ public static BlendMode parseBlendMode(int value, BlendMode defaultMode) {
+ switch (value) {
+ case 3: return BlendMode.SRC_OVER;
+ case 5: return BlendMode.SRC_IN;
+ case 9: return BlendMode.SRC_ATOP;
+ // b/73224934 PorterDuff Multiply maps to Skia Modulate so actually
+ // return BlendMode.MODULATE here
+ case 14: return BlendMode.MODULATE;
+ case 15: return BlendMode.SCREEN;
+ case 16: return BlendMode.PLUS;
+ default: return defaultMode;
+ }
+ }
}
diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java
index 77e77c4..3e0881a 100644
--- a/graphics/java/android/graphics/drawable/DrawableContainer.java
+++ b/graphics/java/android/graphics/drawable/DrawableContainer.java
@@ -22,12 +22,12 @@
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
+import android.graphics.BlendMode;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Insets;
import android.graphics.Outline;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.os.Build;
import android.os.SystemClock;
@@ -196,14 +196,14 @@
}
@Override
- public void setTintMode(Mode tintMode) {
+ public void setTintMode(@NonNull BlendMode blendMode) {
mDrawableContainerState.mHasTintMode = true;
- if (mDrawableContainerState.mTintMode != tintMode) {
- mDrawableContainerState.mTintMode = tintMode;
+ if (mDrawableContainerState.mBlendMode != blendMode) {
+ mDrawableContainerState.mBlendMode = blendMode;
if (mCurrDrawable != null) {
- mCurrDrawable.setTintMode(tintMode);
+ mCurrDrawable.setTintMode(blendMode);
}
}
}
@@ -544,7 +544,7 @@
d.setTintList(mDrawableContainerState.mTintList);
}
if (mDrawableContainerState.mHasTintMode) {
- d.setTintMode(mDrawableContainerState.mTintMode);
+ d.setTintMode(mDrawableContainerState.mBlendMode);
}
}
@@ -730,7 +730,7 @@
boolean mHasColorFilter;
ColorStateList mTintList;
- Mode mTintMode;
+ BlendMode mBlendMode;
boolean mHasTintList;
boolean mHasTintMode;
@@ -762,7 +762,7 @@
mColorFilter = orig.mColorFilter;
mHasColorFilter = orig.mHasColorFilter;
mTintList = orig.mTintList;
- mTintMode = orig.mTintMode;
+ mBlendMode = orig.mBlendMode;
mHasTintList = orig.mHasTintList;
mHasTintMode = orig.mHasTintMode;
diff --git a/graphics/java/android/graphics/drawable/DrawableWrapper.java b/graphics/java/android/graphics/drawable/DrawableWrapper.java
index 70c90eb..d81401d 100644
--- a/graphics/java/android/graphics/drawable/DrawableWrapper.java
+++ b/graphics/java/android/graphics/drawable/DrawableWrapper.java
@@ -24,12 +24,12 @@
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
+import android.graphics.BlendMode;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Insets;
import android.graphics.Outline;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.Xfermode;
import android.util.AttributeSet;
@@ -324,9 +324,9 @@
}
@Override
- public void setTintMode(@Nullable PorterDuff.Mode tintMode) {
+ public void setTintMode(@NonNull BlendMode blendMode) {
if (mDrawable != null) {
- mDrawable.setTintMode(tintMode);
+ mDrawable.setTintMode(blendMode);
}
}
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index e58e802..cdb3441 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -28,6 +28,8 @@
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
+import android.graphics.BlendMode;
+import android.graphics.BlendModeColorFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
@@ -38,8 +40,6 @@
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
import android.graphics.RadialGradient;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -169,7 +169,7 @@
@UnsupportedAppUsage
private Paint mStrokePaint; // optional, set by the caller
private ColorFilter mColorFilter; // optional, set by the caller
- private PorterDuffColorFilter mTintFilter;
+ private BlendModeColorFilter mBlendModeColorFilter;
private int mAlpha = 0xFF; // modified by the caller
private final Path mPath = new Path();
@@ -731,7 +731,7 @@
mStrokePaint.getStrokeWidth() > 0;
final boolean haveFill = currFillAlpha > 0;
final GradientState st = mGradientState;
- final ColorFilter colorFilter = mColorFilter != null ? mColorFilter : mTintFilter;
+ final ColorFilter colorFilter = mColorFilter != null ? mColorFilter : mBlendModeColorFilter;
/* we need a layer iff we're drawing both a fill and stroke, and the
stroke is non-opaque, and our shapetype actually supports
@@ -1130,8 +1130,9 @@
}
}
- if (s.mTint != null && s.mTintMode != null) {
- mTintFilter = updateTintFilter(mTintFilter, s.mTint, s.mTintMode);
+ if (s.mTint != null && s.mBlendMode != null) {
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, s.mTint,
+ s.mBlendMode);
invalidateSelf = true;
}
@@ -1204,14 +1205,16 @@
@Override
public void setTintList(@Nullable ColorStateList tint) {
mGradientState.mTint = tint;
- mTintFilter = updateTintFilter(mTintFilter, tint, mGradientState.mTintMode);
+ mBlendModeColorFilter =
+ updateBlendModeFilter(mBlendModeColorFilter, tint, mGradientState.mBlendMode);
invalidateSelf();
}
@Override
- public void setTintMode(@Nullable PorterDuff.Mode tintMode) {
- mGradientState.mTintMode = tintMode;
- mTintFilter = updateTintFilter(mTintFilter, mGradientState.mTint, tintMode);
+ public void setTintMode(@NonNull BlendMode blendMode) {
+ mGradientState.mBlendMode = blendMode;
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, mGradientState.mTint,
+ blendMode);
invalidateSelf();
}
@@ -1465,7 +1468,7 @@
final int tintMode = a.getInt(R.styleable.GradientDrawable_tintMode, -1);
if (tintMode != -1) {
- state.mTintMode = Drawable.parseTintMode(tintMode, PorterDuff.Mode.SRC_IN);
+ state.mBlendMode = Drawable.parseBlendMode(tintMode, BlendMode.SRC_IN);
}
final ColorStateList tint = a.getColorStateList(R.styleable.GradientDrawable_tint);
@@ -2010,7 +2013,7 @@
boolean mOpaqueOverShape;
ColorStateList mTint = null;
- PorterDuff.Mode mTintMode = DEFAULT_TINT_MODE;
+ BlendMode mBlendMode = DEFAULT_BLEND_MODE;
int mDensity = DisplayMetrics.DENSITY_DEFAULT;
@@ -2068,7 +2071,7 @@
mOpaqueOverBounds = orig.mOpaqueOverBounds;
mOpaqueOverShape = orig.mOpaqueOverShape;
mTint = orig.mTint;
- mTintMode = orig.mTintMode;
+ mBlendMode = orig.mBlendMode;
mThemeAttrs = orig.mThemeAttrs;
mAttrSize = orig.mAttrSize;
mAttrGradient = orig.mAttrGradient;
@@ -2355,7 +2358,8 @@
}
}
- mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, state.mTint,
+ state.mBlendMode);
mGradientIsDirty = true;
state.computeOpacity();
diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java
index 71dd7a2..5fd18a1 100644
--- a/graphics/java/android/graphics/drawable/Icon.java
+++ b/graphics/java/android/graphics/drawable/Icon.java
@@ -30,6 +30,7 @@
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.BlendMode;
import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.AsyncTask;
@@ -105,8 +106,8 @@
private final int mType;
private ColorStateList mTintList;
- static final PorterDuff.Mode DEFAULT_TINT_MODE = Drawable.DEFAULT_TINT_MODE; // SRC_IN
- private PorterDuff.Mode mTintMode = DEFAULT_TINT_MODE;
+ static final BlendMode DEFAULT_BLEND_MODE = Drawable.DEFAULT_BLEND_MODE; // SRC_IN
+ private BlendMode mBlendMode = Drawable.DEFAULT_BLEND_MODE;
// To avoid adding unnecessary overhead, we have a few basic objects that get repurposed
// based on the value of mType.
@@ -320,10 +321,10 @@
*/
public Drawable loadDrawable(Context context) {
final Drawable result = loadDrawableInner(context);
- if (result != null && (mTintList != null || mTintMode != DEFAULT_TINT_MODE)) {
+ if (result != null && (mTintList != null || mBlendMode != DEFAULT_BLEND_MODE)) {
result.mutate();
result.setTintList(mTintList);
- result.setTintMode(mTintMode);
+ result.setTintMode(mBlendMode);
}
return result;
}
@@ -695,16 +696,30 @@
*
* @param mode a blending mode, as in {@link Drawable#setTintMode(PorterDuff.Mode)}, may be null
* @return this same object, for use in chained construction
+ *
+ * @deprecated use {@link #setTintMode(BlendMode)} instead
*/
- public Icon setTintMode(PorterDuff.Mode mode) {
- mTintMode = mode;
+ @Deprecated
+ public @NonNull Icon setTintMode(@NonNull PorterDuff.Mode mode) {
+ mBlendMode = BlendMode.fromValue(mode.nativeInt);
+ return this;
+ }
+
+ /**
+ * Store a blending mode to use whenever this Icon is drawn.
+ *
+ * @param mode a blending mode, as in {@link Drawable#setTintMode(PorterDuff.Mode)}, may be null
+ * @return this same object, for use in chained construction
+ */
+ public @NonNull Icon setTintMode(@NonNull BlendMode mode) {
+ mBlendMode = mode;
return this;
}
/** @hide */
@UnsupportedAppUsage
public boolean hasTint() {
- return (mTintList != null) || (mTintMode != DEFAULT_TINT_MODE);
+ return (mTintList != null) || (mBlendMode != DEFAULT_BLEND_MODE);
}
/**
@@ -757,7 +772,7 @@
sep = "|";
}
}
- if (mTintMode != DEFAULT_TINT_MODE) sb.append(" mode=").append(mTintMode);
+ if (mBlendMode != DEFAULT_BLEND_MODE) sb.append(" mode=").append(mBlendMode);
sb.append(")");
return sb.toString();
}
@@ -807,7 +822,7 @@
if (in.readInt() == 1) {
mTintList = ColorStateList.CREATOR.createFromParcel(in);
}
- mTintMode = PorterDuff.intToMode(in.readInt());
+ mBlendMode = BlendMode.fromValue(in.readInt());
}
@Override
@@ -837,7 +852,7 @@
dest.writeInt(1);
mTintList.writeToParcel(dest, flags);
}
- dest.writeInt(PorterDuff.modeToInt(mTintMode));
+ dest.writeInt(BlendMode.toValue(mBlendMode));
}
public static final @android.annotation.NonNull Parcelable.Creator<Icon> CREATOR
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index b4392c8..e2c8492 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -24,11 +24,11 @@
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
+import android.graphics.BlendMode;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Outline;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
@@ -1397,13 +1397,13 @@
}
@Override
- public void setTintMode(Mode tintMode) {
+ public void setTintMode(@NonNull BlendMode blendMode) {
final ChildDrawable[] array = mLayerState.mChildren;
final int N = mLayerState.mNumChildren;
for (int i = 0; i < N; i++) {
final Drawable dr = array[i].mDrawable;
if (dr != null) {
- dr.setTintMode(tintMode);
+ dr.setTintMode(blendMode);
}
}
}
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index b534771..4972e6a 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -25,6 +25,8 @@
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
+import android.graphics.BlendMode;
+import android.graphics.BlendModeColorFilter;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.ImageDecoder;
@@ -33,9 +35,6 @@
import android.graphics.Outline;
import android.graphics.Paint;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Region;
import android.util.AttributeSet;
@@ -73,7 +72,7 @@
@UnsupportedAppUsage
private NinePatchState mNinePatchState;
- private PorterDuffColorFilter mTintFilter;
+ private BlendModeColorFilter mBlendModeFilter;
private Rect mPadding;
private Insets mOpticalInsets = Insets.NONE;
private Rect mOutlineInsets;
@@ -198,8 +197,8 @@
int restoreToCount = -1;
final boolean clearColorFilter;
- if (mTintFilter != null && getPaint().getColorFilter() == null) {
- mPaint.setColorFilter(mTintFilter);
+ if (mBlendModeFilter != null && getPaint().getColorFilter() == null) {
+ mPaint.setColorFilter(mBlendModeFilter);
clearColorFilter = true;
} else {
clearColorFilter = false;
@@ -344,14 +343,16 @@
@Override
public void setTintList(@Nullable ColorStateList tint) {
mNinePatchState.mTint = tint;
- mTintFilter = updateTintFilter(mTintFilter, tint, mNinePatchState.mTintMode);
+ mBlendModeFilter = updateBlendModeFilter(mBlendModeFilter, tint,
+ mNinePatchState.mBlendMode);
invalidateSelf();
}
@Override
- public void setTintMode(@Nullable PorterDuff.Mode tintMode) {
- mNinePatchState.mTintMode = tintMode;
- mTintFilter = updateTintFilter(mTintFilter, mNinePatchState.mTint, tintMode);
+ public void setTintMode(@Nullable BlendMode blendMode) {
+ mNinePatchState.mBlendMode = blendMode;
+ mBlendModeFilter = updateBlendModeFilter(mBlendModeFilter, mNinePatchState.mTint,
+ blendMode);
invalidateSelf();
}
@@ -467,7 +468,7 @@
final int tintMode = a.getInt(R.styleable.NinePatchDrawable_tintMode, -1);
if (tintMode != -1) {
- state.mTintMode = Drawable.parseTintMode(tintMode, Mode.SRC_IN);
+ state.mBlendMode = Drawable.parseBlendMode(tintMode, BlendMode.SRC_IN);
}
final ColorStateList tint = a.getColorStateList(R.styleable.NinePatchDrawable_tint);
@@ -566,8 +567,9 @@
@Override
protected boolean onStateChange(int[] stateSet) {
final NinePatchState state = mNinePatchState;
- if (state.mTint != null && state.mTintMode != null) {
- mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ if (state.mTint != null && state.mBlendMode != null) {
+ mBlendModeFilter = updateBlendModeFilter(mBlendModeFilter, state.mTint,
+ state.mBlendMode);
return true;
}
@@ -593,7 +595,7 @@
@UnsupportedAppUsage
NinePatch mNinePatch = null;
ColorStateList mTint = null;
- Mode mTintMode = DEFAULT_TINT_MODE;
+ BlendMode mBlendMode = DEFAULT_BLEND_MODE;
Rect mPadding = null;
Insets mOpticalInsets = Insets.NONE;
float mBaseAlpha = 1.0f;
@@ -628,7 +630,7 @@
mChangingConfigurations = orig.mChangingConfigurations;
mNinePatch = orig.mNinePatch;
mTint = orig.mTint;
- mTintMode = orig.mTintMode;
+ mBlendMode = orig.mBlendMode;
mPadding = orig.mPadding;
mOpticalInsets = orig.mOpticalInsets;
mBaseAlpha = orig.mBaseAlpha;
@@ -751,7 +753,7 @@
} else {
mTargetDensity = Drawable.resolveDensity(res, mTargetDensity);
}
- mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ mBlendModeFilter = updateBlendModeFilter(mBlendModeFilter, state.mTint, state.mBlendMode);
computeBitmapSize();
}
}
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index 7bfb4c3..b5fe7f9 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -24,14 +24,13 @@
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
+import android.graphics.BlendMode;
+import android.graphics.BlendModeColorFilter;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Outline;
import android.graphics.Paint;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.Xfermode;
@@ -75,7 +74,7 @@
*/
public class ShapeDrawable extends Drawable {
private @NonNull ShapeState mShapeState;
- private PorterDuffColorFilter mTintFilter;
+ private BlendModeColorFilter mBlendModeColorFilter;
private boolean mMutated;
/**
@@ -238,8 +237,8 @@
// only draw shape if it may affect output
if (paint.getAlpha() != 0 || paint.getXfermode() != null || paint.hasShadowLayer()) {
final boolean clearColorFilter;
- if (mTintFilter != null && paint.getColorFilter() == null) {
- paint.setColorFilter(mTintFilter);
+ if (mBlendModeColorFilter != null && paint.getColorFilter() == null) {
+ paint.setColorFilter(mBlendModeColorFilter);
clearColorFilter = true;
} else {
clearColorFilter = false;
@@ -292,14 +291,16 @@
@Override
public void setTintList(ColorStateList tint) {
mShapeState.mTint = tint;
- mTintFilter = updateTintFilter(mTintFilter, tint, mShapeState.mTintMode);
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, tint,
+ mShapeState.mBlendMode);
invalidateSelf();
}
@Override
- public void setTintMode(PorterDuff.Mode tintMode) {
- mShapeState.mTintMode = tintMode;
- mTintFilter = updateTintFilter(mTintFilter, mShapeState.mTint, tintMode);
+ public void setTintMode(@NonNull BlendMode blendMode) {
+ mShapeState.mBlendMode = blendMode;
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, mShapeState.mTint,
+ blendMode);
invalidateSelf();
}
@@ -352,8 +353,9 @@
@Override
protected boolean onStateChange(int[] stateSet) {
final ShapeState state = mShapeState;
- if (state.mTint != null && state.mTintMode != null) {
- mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ if (state.mTint != null && state.mBlendMode != null) {
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, state.mTint,
+ state.mBlendMode);
return true;
}
return false;
@@ -475,7 +477,7 @@
final int tintMode = a.getInt(R.styleable.ShapeDrawable_tintMode, -1);
if (tintMode != -1) {
- state.mTintMode = Drawable.parseTintMode(tintMode, Mode.SRC_IN);
+ state.mBlendMode = Drawable.parseBlendMode(tintMode, BlendMode.SRC_IN);
}
final ColorStateList tint = a.getColorStateList(R.styleable.ShapeDrawable_tint);
@@ -540,7 +542,7 @@
int[] mThemeAttrs;
Shape mShape;
ColorStateList mTint;
- Mode mTintMode = DEFAULT_TINT_MODE;
+ BlendMode mBlendMode = DEFAULT_BLEND_MODE;
Rect mPadding;
int mIntrinsicWidth;
int mIntrinsicHeight;
@@ -573,7 +575,7 @@
}
}
mTint = orig.mTint;
- mTintMode = orig.mTintMode;
+ mBlendMode = orig.mBlendMode;
if (orig.mPadding != null) {
mPadding = new Rect(orig.mPadding);
}
@@ -625,7 +627,8 @@
* after inflating or applying a theme.
*/
private void updateLocalState() {
- mTintFilter = updateTintFilter(mTintFilter, mShapeState.mTint, mShapeState.mTintMode);
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, mShapeState.mTint,
+ mShapeState.mBlendMode);
}
/**
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index 7325b85..43772ec 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -24,11 +24,13 @@
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
+import android.graphics.BlendMode;
+import android.graphics.BlendModeColorFilter;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Insets;
import android.graphics.PixelFormat;
-import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Shader;
@@ -324,6 +326,8 @@
@UnsupportedAppUsage
private PorterDuffColorFilter mTintFilter;
+
+ private BlendModeColorFilter mBlendModeColorFilter;
private ColorFilter mColorFilter;
private boolean mMutated;
@@ -371,7 +375,7 @@
mDpiScaledDirty = true;
}
- mTintFilter = updateTintFilter(mTintFilter, mVectorState.mTint, mVectorState.mTintMode);
+ updateColorFilters(mVectorState.mBlendMode, mVectorState.mTint);
}
@Override
@@ -413,7 +417,8 @@
}
// Color filters always override tint filters.
- final ColorFilter colorFilter = (mColorFilter == null ? mTintFilter : mColorFilter);
+ final ColorFilter colorFilter = (mColorFilter == null ? mBlendModeColorFilter :
+ mColorFilter);
final long colorFilterNativeInstance = colorFilter == null ? 0 :
colorFilter.getNativeInstance();
boolean canReuseCache = mVectorState.canReuseCache();
@@ -475,17 +480,19 @@
final VectorDrawableState state = mVectorState;
if (state.mTint != tint) {
state.mTint = tint;
- mTintFilter = updateTintFilter(mTintFilter, tint, state.mTintMode);
+
+ updateColorFilters(mVectorState.mBlendMode, tint);
invalidateSelf();
}
}
@Override
- public void setTintMode(Mode tintMode) {
+ public void setTintMode(@NonNull BlendMode blendMode) {
final VectorDrawableState state = mVectorState;
- if (state.mTintMode != tintMode) {
- state.mTintMode = tintMode;
- mTintFilter = updateTintFilter(mTintFilter, state.mTint, tintMode);
+ if (state.mBlendMode != blendMode) {
+ state.mBlendMode = blendMode;
+
+ updateColorFilters(state.mBlendMode, state.mTint);
invalidateSelf();
}
}
@@ -515,14 +522,22 @@
changed = true;
state.mCacheDirty = true;
}
- if (state.mTint != null && state.mTintMode != null) {
- mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ if (state.mTint != null && state.mBlendMode != null) {
+ BlendMode blendMode = state.mBlendMode;
+ ColorStateList tint = state.mTint;
+ updateColorFilters(blendMode, tint);
changed = true;
}
return changed;
}
+ private void updateColorFilters(@Nullable BlendMode blendMode, ColorStateList tint) {
+ PorterDuff.Mode mode = BlendMode.blendModeToPorterDuffMode(blendMode);
+ mTintFilter = updateTintFilter(mTintFilter, tint, mode);
+ mBlendModeColorFilter = updateBlendModeFilter(mBlendModeColorFilter, tint, blendMode);
+ }
+
@Override
public int getOpacity() {
// We can't tell whether the drawable is fully opaque unless we examine all the pixels,
@@ -737,7 +752,7 @@
final int tintMode = a.getInt(R.styleable.VectorDrawable_tintMode, -1);
if (tintMode != -1) {
- state.mTintMode = Drawable.parseTintMode(tintMode, Mode.SRC_IN);
+ state.mBlendMode = Drawable.parseBlendMode(tintMode, BlendMode.SRC_IN);
}
final ColorStateList tint = a.getColorStateList(R.styleable.VectorDrawable_tint);
@@ -911,7 +926,7 @@
int[] mThemeAttrs;
@Config int mChangingConfigurations;
ColorStateList mTint = null;
- Mode mTintMode = DEFAULT_TINT_MODE;
+ BlendMode mBlendMode = DEFAULT_BLEND_MODE;
boolean mAutoMirrored;
int mBaseWidth = 0;
@@ -929,7 +944,7 @@
// Fields for cache
int[] mCachedThemeAttrs;
ColorStateList mCachedTint;
- Mode mCachedTintMode;
+ BlendMode mCachedBlendMode;
boolean mCachedAutoMirrored;
boolean mCacheDirty;
@@ -970,7 +985,7 @@
mThemeAttrs = copy.mThemeAttrs;
mChangingConfigurations = copy.mChangingConfigurations;
mTint = copy.mTint;
- mTintMode = copy.mTintMode;
+ mBlendMode = copy.mBlendMode;
mAutoMirrored = copy.mAutoMirrored;
mRootGroup = new VGroup(copy.mRootGroup, mVGTargetsMap);
createNativeTreeFromCopy(copy, mRootGroup);
@@ -1026,7 +1041,7 @@
if (!mCacheDirty
&& mCachedThemeAttrs == mThemeAttrs
&& mCachedTint == mTint
- && mCachedTintMode == mTintMode
+ && mCachedBlendMode == mBlendMode
&& mCachedAutoMirrored == mAutoMirrored) {
return true;
}
@@ -1039,7 +1054,7 @@
// likely hit cache miss more, but practically not much difference.
mCachedThemeAttrs = mThemeAttrs;
mCachedTint = mTint;
- mCachedTintMode = mTintMode;
+ mCachedBlendMode = mBlendMode;
mCachedAutoMirrored = mAutoMirrored;
mCacheDirty = false;
}
diff --git a/libs/hwui/HardwareBitmapUploader.cpp b/libs/hwui/HardwareBitmapUploader.cpp
index 8f7e814..9bb6031 100644
--- a/libs/hwui/HardwareBitmapUploader.cpp
+++ b/libs/hwui/HardwareBitmapUploader.cpp
@@ -349,8 +349,7 @@
} else {
SkBitmap bitmap;
const SkImageInfo& info = source.info();
- bitmap.allocPixels(
- SkImageInfo::MakeN32(info.width(), info.height(), info.alphaType(), nullptr));
+ bitmap.allocPixels(info.makeColorType(kN32_SkColorType));
SkCanvas canvas(bitmap);
canvas.drawColor(0);
@@ -416,7 +415,9 @@
}
void HardwareBitmapUploader::terminate() {
- sUploader->destroy();
+ if (sUploader) {
+ sUploader->destroy();
+ }
}
} // namespace android::uirenderer
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index b8ebf3b..c929098 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -493,6 +493,12 @@
mDeviceWaitIdle(mDevice);
}
+ VulkanSurface::NativeBufferInfo* bufferInfo = surface->getCurrentBufferInfo();
+ if (!bufferInfo) {
+ // If VulkanSurface::dequeueNativeBuffer failed earlier, then swapBuffers is a no-op.
+ return;
+ }
+
VkExportSemaphoreCreateInfo exportInfo;
exportInfo.sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO;
exportInfo.pNext = nullptr;
@@ -509,8 +515,6 @@
GrBackendSemaphore backendSemaphore;
backendSemaphore.initVulkan(semaphore);
- VulkanSurface::NativeBufferInfo* bufferInfo = surface->getCurrentBufferInfo();
-
int fenceFd = -1;
GrSemaphoresSubmitted submitted =
bufferInfo->skSurface->flush(SkSurface::BackendSurfaceAccess::kPresent,
diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp
index a98eb32..1708d3c 100644
--- a/libs/hwui/renderthread/VulkanSurface.cpp
+++ b/libs/hwui/renderthread/VulkanSurface.cpp
@@ -420,9 +420,10 @@
}
VulkanSurface::NativeBufferInfo* VulkanSurface::dequeueNativeBuffer() {
- // Set the dequeue index to invalid in case of error and only reset it to the correct
+ // Set the mCurrentBufferInfo to invalid in case of error and only reset it to the correct
// value at the end of the function if everything dequeued correctly.
- mDequeuedIndex = -1;
+ mCurrentBufferInfo = nullptr;
+
//check if the native window has been resized or rotated and update accordingly
SkISize newSize = SkISize::MakeEmpty();
@@ -511,7 +512,7 @@
}
}
- mDequeuedIndex = idx;
+ mCurrentBufferInfo = bufferInfo;
return bufferInfo;
}
@@ -535,7 +536,8 @@
ALOGE_IF(err != 0, "native_window_set_surface_damage failed: %s (%d)", strerror(-err), err);
}
- VulkanSurface::NativeBufferInfo& currentBuffer = mNativeBuffers[mDequeuedIndex];
+ LOG_ALWAYS_FATAL_IF(!mCurrentBufferInfo);
+ VulkanSurface::NativeBufferInfo& currentBuffer = *mCurrentBufferInfo;
int queuedFd = (semaphoreFd != -1) ? semaphoreFd : currentBuffer.dequeue_fence;
int err = mNativeWindow->queueBuffer(mNativeWindow.get(), currentBuffer.buffer.get(), queuedFd);
@@ -560,7 +562,8 @@
}
int VulkanSurface::getCurrentBuffersAge() {
- VulkanSurface::NativeBufferInfo& currentBuffer = mNativeBuffers[mDequeuedIndex];
+ LOG_ALWAYS_FATAL_IF(!mCurrentBufferInfo);
+ VulkanSurface::NativeBufferInfo& currentBuffer = *mCurrentBufferInfo;
return currentBuffer.hasValidContents ? (mPresentCount - currentBuffer.lastPresentedCount) : 0;
}
diff --git a/libs/hwui/renderthread/VulkanSurface.h b/libs/hwui/renderthread/VulkanSurface.h
index 4fd9cd2..418d40f 100644
--- a/libs/hwui/renderthread/VulkanSurface.h
+++ b/libs/hwui/renderthread/VulkanSurface.h
@@ -42,7 +42,9 @@
const VulkanManager& vkManager);
~VulkanSurface();
- sk_sp<SkSurface> getCurrentSkSurface() { return mNativeBuffers[mDequeuedIndex].skSurface; }
+ sk_sp<SkSurface> getCurrentSkSurface() {
+ return mCurrentBufferInfo ? mCurrentBufferInfo->skSurface : nullptr;
+ }
const SkMatrix& getCurrentPreTransform() { return mWindowInfo.preTransform; }
private:
@@ -65,7 +67,7 @@
};
NativeBufferInfo* dequeueNativeBuffer();
- NativeBufferInfo* getCurrentBufferInfo() { return &mNativeBuffers[mDequeuedIndex]; }
+ NativeBufferInfo* getCurrentBufferInfo() { return mCurrentBufferInfo; }
bool presentCurrentBuffer(const SkRect& dirtyRect, int semaphoreFd);
// The width and height are are the logical width and height for when submitting draws to the
@@ -115,8 +117,8 @@
WindowInfo mWindowInfo;
GrContext* mGrContext;
- int mDequeuedIndex = -1;
uint32_t mPresentCount = 0;
+ NativeBufferInfo* mCurrentBufferInfo = nullptr;
const SkISize mMinWindowSize;
const SkISize mMaxWindowSize;
diff --git a/libs/incident/Android.bp b/libs/incident/Android.bp
index 905e303..150f6dc 100644
--- a/libs/incident/Android.bp
+++ b/libs/incident/Android.bp
@@ -27,23 +27,29 @@
"libbinder",
"liblog",
"libutils",
+ "libprotobuf-cpp-lite",
+ ],
+
+ static_libs: [
+ "libplatformprotos",
+ ],
+
+ whole_static_libs: [
+ "libincidentcompanion",
],
aidl: {
- include_dirs: ["frameworks/base/core/java"],
+ include_dirs: [
+ "frameworks/base/core/java",
+ "frameworks/native/libs/incidentcompanion/binder",
+ ],
export_aidl_headers: true,
},
srcs: [
":libincident_aidl",
- "proto/android/os/metadata.proto",
"src/IncidentReportArgs.cpp",
],
- proto: {
- type: "lite",
- export_proto_headers: true,
- },
-
export_include_dirs: ["include"],
-}
\ No newline at end of file
+}
diff --git a/libs/incident/include/android/os/IncidentReportArgs.h b/libs/incident/include/android/os/IncidentReportArgs.h
index f056d3b..4391a9b 100644
--- a/libs/incident/include/android/os/IncidentReportArgs.h
+++ b/libs/incident/include/android/os/IncidentReportArgs.h
@@ -29,10 +29,11 @@
using namespace std;
-// DESTINATION enum value, sync with proto/android/privacy.proto
-const uint8_t DEST_LOCAL = 0;
-const uint8_t DEST_EXPLICIT = 100;
-const uint8_t DEST_AUTOMATIC = 200;
+// DESTINATION enum value, sync with frameworks/base/core/proto/android/privacy.proto
+const uint8_t PRIVACY_POLICY_LOCAL = 0;
+const uint8_t PRIVACY_POLICY_EXPLICIT = 100;
+const uint8_t PRIVACY_POLICY_AUTOMATIC = 200;
+const uint8_t PRIVACY_POLICY_UNSET = 255;
class IncidentReportArgs : public Parcelable {
@@ -45,7 +46,7 @@
virtual status_t readFromParcel(const Parcel* in);
void setAll(bool all);
- void setDest(int dest);
+ void setPrivacyPolicy(int privacyPolicy);
void addSection(int section);
void setReceiverPkg(const string& pkg);
void setReceiverCls(const string& cls);
@@ -53,10 +54,10 @@
inline bool all() const { return mAll; }
bool containsSection(int section) const;
- inline int dest() const { return mDest; }
+ inline int getPrivacyPolicy() const { return mPrivacyPolicy; }
inline const set<int>& sections() const { return mSections; }
- inline const String16& receiverPkg() const { return mReceiverPkg; }
- inline const String16& receiverCls() const { return mReceiverCls; }
+ inline const string& receiverPkg() const { return mReceiverPkg; }
+ inline const string& receiverCls() const { return mReceiverCls; }
inline const vector<vector<uint8_t>>& headers() const { return mHeaders; }
void merge(const IncidentReportArgs& that);
@@ -65,9 +66,9 @@
set<int> mSections;
vector<vector<uint8_t>> mHeaders;
bool mAll;
- int mDest;
- String16 mReceiverPkg;
- String16 mReceiverCls;
+ int mPrivacyPolicy;
+ string mReceiverPkg;
+ string mReceiverCls;
};
}
diff --git a/libs/incident/src/IncidentReportArgs.cpp b/libs/incident/src/IncidentReportArgs.cpp
index 46c8dcf9..4268638 100644
--- a/libs/incident/src/IncidentReportArgs.cpp
+++ b/libs/incident/src/IncidentReportArgs.cpp
@@ -26,7 +26,7 @@
IncidentReportArgs::IncidentReportArgs()
:mSections(),
mAll(false),
- mDest(-1)
+ mPrivacyPolicy(-1)
{
}
@@ -34,7 +34,9 @@
:mSections(that.mSections),
mHeaders(that.mHeaders),
mAll(that.mAll),
- mDest(that.mDest)
+ mPrivacyPolicy(that.mPrivacyPolicy),
+ mReceiverPkg(that.mReceiverPkg),
+ mReceiverCls(that.mReceiverCls)
{
}
@@ -76,17 +78,17 @@
}
}
- err = out->writeInt32(mDest);
+ err = out->writeInt32(mPrivacyPolicy);
if (err != NO_ERROR) {
return err;
}
- err = out->writeString16(mReceiverPkg);
+ err = out->writeString16(String16(mReceiverPkg.c_str()));
if (err != NO_ERROR) {
return err;
}
- err = out->writeString16(mReceiverCls);
+ err = out->writeString16(String16(mReceiverCls.c_str()));
if (err != NO_ERROR) {
return err;
}
@@ -137,15 +139,15 @@
}
}
- int32_t dest;
- err = in->readInt32(&dest);
+ int32_t privacyPolicy;
+ err = in->readInt32(&privacyPolicy);
if (err != NO_ERROR) {
return err;
}
- mDest = dest;
+ mPrivacyPolicy = privacyPolicy;
- mReceiverPkg = in->readString16();
- mReceiverCls = in->readString16();
+ mReceiverPkg = String8(in->readString16()).string();
+ mReceiverCls = String8(in->readString16()).string();
return OK;
}
@@ -160,9 +162,9 @@
}
void
-IncidentReportArgs::setDest(int dest)
+IncidentReportArgs::setPrivacyPolicy(int privacyPolicy)
{
- mDest = dest;
+ mPrivacyPolicy = privacyPolicy;
}
void
@@ -176,13 +178,13 @@
void
IncidentReportArgs::setReceiverPkg(const string& pkg)
{
- mReceiverPkg = String16(pkg.c_str());
+ mReceiverPkg = pkg;
}
void
IncidentReportArgs::setReceiverCls(const string& cls)
{
- mReceiverCls = String16(cls.c_str());
+ mReceiverCls = cls;
}
void
@@ -200,15 +202,18 @@
void
IncidentReportArgs::merge(const IncidentReportArgs& that)
{
- if (mAll) {
- return;
- } else if (that.mAll) {
- mAll = true;
- mSections.clear();
- } else {
- for (set<int>::const_iterator it=that.mSections.begin();
- it!=that.mSections.end(); it++) {
- mSections.insert(*it);
+ for (const vector<uint8_t>& header: that.mHeaders) {
+ mHeaders.push_back(header);
+ }
+ if (!mAll) {
+ if (that.mAll) {
+ mAll = true;
+ mSections.clear();
+ } else {
+ for (set<int>::const_iterator it=that.mSections.begin();
+ it!=that.mSections.end(); it++) {
+ mSections.insert(*it);
+ }
}
}
}
diff --git a/libs/protoutil/Android.bp b/libs/protoutil/Android.bp
index 44bc97a..b0af997 100644
--- a/libs/protoutil/Android.bp
+++ b/libs/protoutil/Android.bp
@@ -25,12 +25,15 @@
srcs: [
"src/EncodedBuffer.cpp",
+ "src/ProtoFileReader.cpp",
"src/ProtoOutputStream.cpp",
+ "src/ProtoReader.cpp",
"src/protobuf.cpp",
],
shared_libs: [
"libbase",
+ "libutils",
"libcutils",
"liblog",
],
diff --git a/libs/protoutil/include/android/util/EncodedBuffer.h b/libs/protoutil/include/android/util/EncodedBuffer.h
index 0b7f6e46..f9590ee 100644
--- a/libs/protoutil/include/android/util/EncodedBuffer.h
+++ b/libs/protoutil/include/android/util/EncodedBuffer.h
@@ -17,6 +17,11 @@
#ifndef ANDROID_UTIL_ENCODED_BUFFER_H
#define ANDROID_UTIL_ENCODED_BUFFER_H
+#include <android/util/ProtoReader.h>
+
+#include <utils/Errors.h>
+#include <utils/RefBase.h>
+
#include <stdint.h>
#include <vector>
@@ -34,12 +39,12 @@
* *Index: Index of a buffer within the mBuffers list.
* *Offset: Position within a buffer.
*/
-class EncodedBuffer
+class EncodedBuffer : public virtual RefBase
{
public:
EncodedBuffer();
explicit EncodedBuffer(size_t chunkSize);
- ~EncodedBuffer();
+ virtual ~EncodedBuffer();
class Pointer {
public:
@@ -80,8 +85,9 @@
Pointer* wp();
/**
- * Returns the current position of write pointer, if the write buffer is full, it will automatically
- * rotate to a new buffer with given chunkSize. If NULL is returned, it means NO_MEMORY
+ * Returns the current position of write pointer, if the write buffer is full, it will
+ * automatically rotate to a new buffer with given chunkSize. If NULL is returned, it
+ * means NO_MEMORY.
*/
uint8_t* writeBuffer();
@@ -120,6 +126,21 @@
*/
size_t writeHeader(uint32_t fieldId, uint8_t wireType);
+ /**
+ * Copy the contents of the parameter into the write buffer.
+ */
+ status_t writeRaw(uint8_t const* buf, size_t size);
+
+ /**
+ * Copy the entire contents of the ProtoReader into the write buffer.
+ */
+ status_t writeRaw(const sp<ProtoReader>& that);
+
+ /**
+ * Copy the size bytes of contents of the ProtoReader into the write buffer.
+ */
+ status_t writeRaw(const sp<ProtoReader>& that, size_t size);
+
/********************************* Edit APIs ************************************************/
/**
* Returns the edit pointer.
@@ -157,63 +178,35 @@
void copy(size_t srcPos, size_t size);
/********************************* Read APIs ************************************************/
- class iterator;
- friend class iterator;
- class iterator {
- public:
- explicit iterator(const EncodedBuffer& buffer);
-
- /**
- * Returns the number of bytes written in the buffer
- */
- size_t size() const;
-
- /**
- * Returns the size of total bytes read.
- */
- size_t bytesRead() const;
-
- /**
- * Returns the read pointer.
- */
- Pointer* rp();
-
- /**
- * Returns the current position of read pointer, if NULL is returned, it reaches end of buffer.
- */
- uint8_t const* readBuffer();
-
- /**
- * Returns the readable size in the current read buffer.
- */
- size_t currentToRead();
-
- /**
- * Returns true if next bytes is available for read.
- */
- bool hasNext();
-
- /**
- * Reads the current byte and moves pointer 1 bit.
- */
- uint8_t next();
-
- /**
- * Read varint from iterator, the iterator will point to next available byte.
- */
- uint64_t readRawVarint();
-
- private:
- const EncodedBuffer& mData;
- Pointer mRp;
- };
-
/**
- * Returns the iterator of EncodedBuffer so it guarantees consumers won't be able to modified the buffer.
+ * Returns the Reader of EncodedBuffer so it guarantees consumers won't be able to
+ * modify the buffer.
*/
- iterator begin() const;
+ sp<ProtoReader> read();
private:
+ class Reader;
+ friend class Reader;
+ class Reader : public ProtoReader {
+ public:
+ explicit Reader(const sp<EncodedBuffer>& buffer);
+ virtual ~Reader();
+
+ virtual ssize_t size() const;
+ virtual size_t bytesRead() const;
+ virtual uint8_t const* readBuffer();
+ virtual size_t currentToRead();
+ virtual bool hasNext();
+ virtual uint8_t next();
+ virtual uint64_t readRawVarint();
+ virtual void move(size_t amt);
+
+ private:
+ const sp<EncodedBuffer> mData;
+ Pointer mRp;
+ friend class EncodedBuffer;
+ };
+
size_t mChunkSize;
std::vector<uint8_t*> mBuffers;
diff --git a/libs/protoutil/include/android/util/ProtoFileReader.h b/libs/protoutil/include/android/util/ProtoFileReader.h
new file mode 100644
index 0000000..cb3d012
--- /dev/null
+++ b/libs/protoutil/include/android/util/ProtoFileReader.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#include <cstdint>
+#include <string>
+
+#include <android/util/EncodedBuffer.h>
+
+namespace android {
+namespace util {
+
+/**
+ * A ProtoReader on top of a file descriptor.
+ */
+class ProtoFileReader : public ProtoReader
+{
+public:
+ /**
+ * Read from this file descriptor.
+ */
+ ProtoFileReader(int fd);
+
+ /**
+ * Does NOT close the file.
+ */
+ virtual ~ProtoFileReader();
+
+ // From ProtoReader.
+ virtual ssize_t size() const;
+ virtual size_t bytesRead() const;
+ virtual uint8_t const* readBuffer();
+ virtual size_t currentToRead();
+ virtual bool hasNext();
+ virtual uint8_t next();
+ virtual uint64_t readRawVarint();
+ virtual void move(size_t amt);
+
+ status_t getError() const;
+private:
+ int mFd; // File descriptor for input.
+ status_t mStatus; // Any errors encountered during read.
+ ssize_t mSize; // How much total data there is, or -1 if we can't tell.
+ size_t mPos; // How much data has been read so far.
+ size_t mOffset; // Offset in current buffer.
+ size_t mMaxOffset; // How much data is left to read in mBuffer.
+ const int mChunkSize; // Size of mBuffer.
+ uint8_t mBuffer[32*1024];
+
+ /**
+ * If there is currently more data to read in the buffer, returns true.
+ * If there is not more, then tries to read. If more data can be read,
+ * it does so and returns true. If there is no more data, returns false.
+ * Resets mOffset and mMaxOffset as necessary. Does not advance mOffset.
+ */
+ bool ensure_data();
+};
+
+}
+}
+
diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h
index ad76559..360e8d3 100644
--- a/libs/protoutil/include/android/util/ProtoOutputStream.h
+++ b/libs/protoutil/include/android/util/ProtoOutputStream.h
@@ -121,7 +121,7 @@
* it is not able to write to ProtoOutputStream any more since the data is compact.
*/
size_t size(); // Get the size of the serialized protobuf.
- EncodedBuffer::iterator data(); // Get the reader apis of the data.
+ sp<ProtoReader> data(); // Get the reader apis of the data.
bool flush(int fd); // Flush data directly to a file descriptor.
/**
@@ -135,7 +135,7 @@
void writeRawByte(uint8_t byte);
private:
- EncodedBuffer mBuffer;
+ sp<EncodedBuffer> mBuffer;
size_t mCopyBegin;
bool mCompact;
uint32_t mDepth;
diff --git a/libs/protoutil/include/android/util/ProtoReader.h b/libs/protoutil/include/android/util/ProtoReader.h
new file mode 100644
index 0000000..204eb7d
--- /dev/null
+++ b/libs/protoutil/include/android/util/ProtoReader.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#include <utils/Errors.h>
+#include <utils/RefBase.h>
+
+#include <stdint.h>
+#include <vector>
+
+namespace android {
+namespace util {
+
+class ProtoReader : public virtual RefBase {
+public:
+ ProtoReader();
+ ~ProtoReader();
+
+ /**
+ * Returns the number of bytes written in the buffer
+ */
+ virtual ssize_t size() const = 0;
+
+ /**
+ * Returns the size of total bytes read.
+ */
+ virtual size_t bytesRead() const = 0;
+
+ /**
+ * Returns the current position of read pointer, if NULL is returned, it reaches
+ * end of buffer.
+ */
+ virtual uint8_t const* readBuffer() = 0;
+
+ /**
+ * Returns the readable size in the current read buffer.
+ */
+ virtual size_t currentToRead() = 0;
+
+ /**
+ * Returns true if next bytes is available for read.
+ */
+ virtual bool hasNext() = 0;
+
+ /**
+ * Reads the current byte and moves pointer 1 bit.
+ */
+ virtual uint8_t next() = 0;
+
+ /**
+ * Read varint from the reader, the reader will point to next available byte.
+ */
+ virtual uint64_t readRawVarint() = 0;
+
+ /**
+ * Advance the read pointer.
+ */
+ virtual void move(size_t amt) = 0;
+};
+
+} // util
+} // android
+
diff --git a/libs/protoutil/src/EncodedBuffer.cpp b/libs/protoutil/src/EncodedBuffer.cpp
index c017851..7ffd887 100644
--- a/libs/protoutil/src/EncodedBuffer.cpp
+++ b/libs/protoutil/src/EncodedBuffer.cpp
@@ -208,6 +208,63 @@
return writeRawVarint32((fieldId << FIELD_ID_SHIFT) | wireType);
}
+status_t
+EncodedBuffer::writeRaw(uint8_t const* buf, size_t size)
+{
+ while (size > 0) {
+ uint8_t* target = writeBuffer();
+ if (target == NULL) {
+ return -ENOMEM;
+ }
+ size_t chunk = currentToWrite();
+ if (chunk > size) {
+ chunk = size;
+ }
+ memcpy(target, buf, chunk);
+ size -= chunk;
+ buf += chunk;
+ mWp.move(chunk);
+ }
+ return NO_ERROR;
+}
+
+status_t
+EncodedBuffer::writeRaw(const sp<ProtoReader>& reader)
+{
+ status_t err;
+ uint8_t const* buf;
+ while ((buf = reader->readBuffer()) != nullptr) {
+ size_t amt = reader->currentToRead();
+ err = writeRaw(buf, amt);
+ reader->move(amt);
+ if (err != NO_ERROR) {
+ return err;
+ }
+ }
+ return NO_ERROR;
+}
+
+status_t
+EncodedBuffer::writeRaw(const sp<ProtoReader>& reader, size_t size)
+{
+ status_t err;
+ uint8_t const* buf;
+ while (size > 0 && (buf = reader->readBuffer()) != nullptr) {
+ size_t amt = reader->currentToRead();
+ if (size < amt) {
+ amt = size;
+ }
+ err = writeRaw(buf, amt);
+ reader->move(amt);
+ size -= amt;
+ if (err != NO_ERROR) {
+ return err;
+ }
+ }
+ return size == 0 ? NO_ERROR : NOT_ENOUGH_DATA;
+}
+
+
/******************************** Edit APIs ************************************************/
EncodedBuffer::Pointer*
EncodedBuffer::ep()
@@ -283,66 +340,63 @@
}
/********************************* Read APIs ************************************************/
-EncodedBuffer::iterator
-EncodedBuffer::begin() const
+sp<ProtoReader>
+EncodedBuffer::read()
{
- return EncodedBuffer::iterator(*this);
+ return new EncodedBuffer::Reader(this);
}
-EncodedBuffer::iterator::iterator(const EncodedBuffer& buffer)
+EncodedBuffer::Reader::Reader(const sp<EncodedBuffer>& buffer)
:mData(buffer),
- mRp(buffer.mChunkSize)
+ mRp(buffer->mChunkSize)
{
}
-size_t
-EncodedBuffer::iterator::size() const
+EncodedBuffer::Reader::~Reader() {
+}
+
+ssize_t
+EncodedBuffer::Reader::size() const
{
- return mData.size();
+ return (ssize_t)mData->size();
}
size_t
-EncodedBuffer::iterator::bytesRead() const
+EncodedBuffer::Reader::bytesRead() const
{
return mRp.pos();
}
-EncodedBuffer::Pointer*
-EncodedBuffer::iterator::rp()
-{
- return &mRp;
-}
-
uint8_t const*
-EncodedBuffer::iterator::readBuffer()
+EncodedBuffer::Reader::readBuffer()
{
- return hasNext() ? const_cast<uint8_t const*>(mData.at(mRp)) : NULL;
+ return hasNext() ? const_cast<uint8_t const*>(mData->at(mRp)) : NULL;
}
size_t
-EncodedBuffer::iterator::currentToRead()
+EncodedBuffer::Reader::currentToRead()
{
- return (mData.mWp.index() > mRp.index()) ?
- mData.mChunkSize - mRp.offset() :
- mData.mWp.offset() - mRp.offset();
+ return (mData->mWp.index() > mRp.index()) ?
+ mData->mChunkSize - mRp.offset() :
+ mData->mWp.offset() - mRp.offset();
}
bool
-EncodedBuffer::iterator::hasNext()
+EncodedBuffer::Reader::hasNext()
{
- return mRp.pos() < mData.mWp.pos();
+ return mRp.pos() < mData->mWp.pos();
}
uint8_t
-EncodedBuffer::iterator::next()
+EncodedBuffer::Reader::next()
{
- uint8_t res = *(mData.at(mRp));
+ uint8_t res = *(mData->at(mRp));
mRp.move();
return res;
}
uint64_t
-EncodedBuffer::iterator::readRawVarint()
+EncodedBuffer::Reader::readRawVarint()
{
uint64_t val = 0, shift = 0;
while (true) {
@@ -354,5 +408,11 @@
return val;
}
+void
+EncodedBuffer::Reader::move(size_t amt)
+{
+ mRp.move(amt);
+}
+
} // util
} // android
diff --git a/libs/protoutil/src/ProtoFileReader.cpp b/libs/protoutil/src/ProtoFileReader.cpp
new file mode 100644
index 0000000..074170a
--- /dev/null
+++ b/libs/protoutil/src/ProtoFileReader.cpp
@@ -0,0 +1,164 @@
+/*
+ * 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.
+ */
+#define LOG_TAG "libprotoutil"
+
+#include <android/util/ProtoFileReader.h>
+#include <cutils/log.h>
+
+#include <cinttypes>
+#include <type_traits>
+
+#include <unistd.h>
+
+namespace android {
+namespace util {
+
+/**
+ * Get the amount of data remaining in the file in fd, or -1 if the file size can't be measured.
+ * It's not the whole file, but this allows us to skip any preamble that might have already
+ * been passed over.
+ */
+ssize_t get_file_size(int fd) {
+ off_t current = lseek(fd, 0, SEEK_CUR);
+ if (current < 0) {
+ return -1;
+ }
+ off_t end = lseek(fd, 0, SEEK_END);
+ if (end < 0) {
+ return -1;
+ }
+ off_t err = lseek(fd, current, SEEK_SET);
+ if (err < 0) {
+ ALOGW("get_file_size could do SEEK_END but not SEEK_SET. We might have skipped data.");
+ return -1;
+ }
+ return (ssize_t)(end-current);
+}
+
+// =========================================================================
+ProtoFileReader::ProtoFileReader(int fd)
+ :mFd(fd),
+ mStatus(NO_ERROR),
+ mSize(get_file_size(fd)),
+ mPos(0),
+ mOffset(0),
+ mChunkSize(sizeof(mBuffer)) {
+}
+
+ProtoFileReader::~ProtoFileReader() {
+}
+
+ssize_t
+ProtoFileReader::size() const
+{
+ return (ssize_t)mSize;
+}
+
+size_t
+ProtoFileReader::bytesRead() const
+{
+ return mPos;
+}
+
+uint8_t const*
+ProtoFileReader::readBuffer()
+{
+ return hasNext() ? mBuffer + mOffset : NULL;
+}
+
+size_t
+ProtoFileReader::currentToRead()
+{
+ return mMaxOffset - mOffset;
+}
+
+bool
+ProtoFileReader::hasNext()
+{
+ return ensure_data();
+}
+
+uint8_t
+ProtoFileReader::next()
+{
+ if (!ensure_data()) {
+ // Shouldn't get to here. Always call hasNext() before calling next().
+ return 0;
+ }
+ return mBuffer[mOffset++];
+}
+
+uint64_t
+ProtoFileReader::readRawVarint()
+{
+ uint64_t val = 0, shift = 0;
+ while (true) {
+ if (!hasNext()) {
+ ALOGW("readRawVarint() called without hasNext() called first.");
+ mStatus = NOT_ENOUGH_DATA;
+ return 0;
+ }
+ uint8_t byte = next();
+ val |= (INT64_C(0x7F) & byte) << shift;
+ if ((byte & 0x80) == 0) break;
+ shift += 7;
+ }
+ return val;
+}
+
+void
+ProtoFileReader::move(size_t amt)
+{
+ while (mStatus == NO_ERROR && amt > 0) {
+ if (!ensure_data()) {
+ return;
+ }
+ const size_t chunk = mMaxOffset - mOffset < amt ? amt : mMaxOffset - mOffset;
+ mOffset += chunk;
+ amt -= chunk;
+ }
+}
+
+status_t
+ProtoFileReader::getError() const {
+ return mStatus;
+}
+
+bool
+ProtoFileReader::ensure_data() {
+ if (mStatus != NO_ERROR) {
+ return false;
+ }
+ if (mOffset < mMaxOffset) {
+ return true;
+ }
+ ssize_t amt = TEMP_FAILURE_RETRY(read(mFd, mBuffer, mChunkSize));
+ if (amt == 0) {
+ return false;
+ } else if (amt < 0) {
+ mStatus = -errno;
+ return false;
+ } else {
+ mOffset = 0;
+ mMaxOffset = amt;
+ return true;
+ }
+}
+
+
+} // util
+} // android
+
diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp
index ff3fad6..ccbb83b 100644
--- a/libs/protoutil/src/ProtoOutputStream.cpp
+++ b/libs/protoutil/src/ProtoOutputStream.cpp
@@ -27,7 +27,7 @@
namespace util {
ProtoOutputStream::ProtoOutputStream()
- :mBuffer(),
+ :mBuffer(new EncodedBuffer()),
mCopyBegin(0),
mCompact(false),
mDepth(0),
@@ -44,7 +44,7 @@
void
ProtoOutputStream::clear()
{
- mBuffer.clear();
+ mBuffer->clear();
mCopyBegin = 0;
mCompact = false;
mDepth = 0;
@@ -226,13 +226,13 @@
}
uint32_t id = (uint32_t)fieldId;
- size_t prevPos = mBuffer.wp()->pos();
- mBuffer.writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED);
- size_t sizePos = mBuffer.wp()->pos();
+ size_t prevPos = mBuffer->wp()->pos();
+ mBuffer->writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED);
+ size_t sizePos = mBuffer->wp()->pos();
mDepth++;
mObjectId++;
- mBuffer.writeRawFixed64(mExpectedObjectToken); // push previous token into stack.
+ mBuffer->writeRawFixed64(mExpectedObjectToken); // push previous token into stack.
mExpectedObjectToken = makeToken(sizePos - prevPos,
(bool)(fieldId & FIELD_COUNT_REPEATED), mDepth, mObjectId, sizePos);
@@ -258,26 +258,26 @@
uint32_t sizePos = getSizePosFromToken(token);
// number of bytes written in this start-end session.
- int childRawSize = mBuffer.wp()->pos() - sizePos - 8;
+ int childRawSize = mBuffer->wp()->pos() - sizePos - 8;
// retrieve the old token from stack.
- mBuffer.ep()->rewind()->move(sizePos);
- mExpectedObjectToken = mBuffer.readRawFixed64();
+ mBuffer->ep()->rewind()->move(sizePos);
+ mExpectedObjectToken = mBuffer->readRawFixed64();
// If raw size is larger than 0, write the negative value here to indicate a compact is needed.
if (childRawSize > 0) {
- mBuffer.editRawFixed32(sizePos, -childRawSize);
- mBuffer.editRawFixed32(sizePos+4, -1);
+ mBuffer->editRawFixed32(sizePos, -childRawSize);
+ mBuffer->editRawFixed32(sizePos+4, -1);
} else {
// reset wp which erase the header tag of the message when its size is 0.
- mBuffer.wp()->rewind()->move(sizePos - getTagSizeFromToken(token));
+ mBuffer->wp()->rewind()->move(sizePos - getTagSizeFromToken(token));
}
}
size_t
ProtoOutputStream::bytesWritten()
{
- return mBuffer.size();
+ return mBuffer->size();
}
bool
@@ -288,26 +288,26 @@
return false;
}
// record the size of the original buffer.
- size_t rawBufferSize = mBuffer.size();
+ size_t rawBufferSize = mBuffer->size();
if (rawBufferSize == 0) return true; // nothing to do if the buffer is empty;
// reset edit pointer and recursively compute encoded size of messages.
- mBuffer.ep()->rewind();
+ mBuffer->ep()->rewind();
if (editEncodedSize(rawBufferSize) == 0) {
ALOGE("Failed to editEncodedSize.");
return false;
}
// reset both edit pointer and write pointer, and compact recursively.
- mBuffer.ep()->rewind();
- mBuffer.wp()->rewind();
+ mBuffer->ep()->rewind();
+ mBuffer->wp()->rewind();
if (!compactSize(rawBufferSize)) {
ALOGE("Failed to compactSize.");
return false;
}
// copy the reset to the buffer.
if (mCopyBegin < rawBufferSize) {
- mBuffer.copy(mCopyBegin, rawBufferSize - mCopyBegin);
+ mBuffer->copy(mCopyBegin, rawBufferSize - mCopyBegin);
}
// mark true means it is not legal to write to this ProtoOutputStream anymore
@@ -322,34 +322,34 @@
size_t
ProtoOutputStream::editEncodedSize(size_t rawSize)
{
- size_t objectStart = mBuffer.ep()->pos();
+ size_t objectStart = mBuffer->ep()->pos();
size_t objectEnd = objectStart + rawSize;
size_t encodedSize = 0;
int childRawSize, childEncodedSize;
size_t childEncodedSizePos;
- while (mBuffer.ep()->pos() < objectEnd) {
- uint32_t tag = (uint32_t)mBuffer.readRawVarint();
+ while (mBuffer->ep()->pos() < objectEnd) {
+ uint32_t tag = (uint32_t)mBuffer->readRawVarint();
encodedSize += get_varint_size(tag);
switch (read_wire_type(tag)) {
case WIRE_TYPE_VARINT:
do {
encodedSize++;
- } while ((mBuffer.readRawByte() & 0x80) != 0);
+ } while ((mBuffer->readRawByte() & 0x80) != 0);
break;
case WIRE_TYPE_FIXED64:
encodedSize += 8;
- mBuffer.ep()->move(8);
+ mBuffer->ep()->move(8);
break;
case WIRE_TYPE_LENGTH_DELIMITED:
- childRawSize = (int)mBuffer.readRawFixed32();
- childEncodedSizePos = mBuffer.ep()->pos();
- childEncodedSize = (int)mBuffer.readRawFixed32();
+ childRawSize = (int)mBuffer->readRawFixed32();
+ childEncodedSizePos = mBuffer->ep()->pos();
+ childEncodedSize = (int)mBuffer->readRawFixed32();
if (childRawSize >= 0 && childRawSize == childEncodedSize) {
- mBuffer.ep()->move(childRawSize);
+ mBuffer->ep()->move(childRawSize);
} else if (childRawSize < 0 && childEncodedSize == -1){
childEncodedSize = editEncodedSize(-childRawSize);
- mBuffer.editRawFixed32(childEncodedSizePos, childEncodedSize);
+ mBuffer->editRawFixed32(childEncodedSizePos, childEncodedSize);
} else {
ALOGE("Bad raw or encoded values: raw=%d, encoded=%d at %zu",
childRawSize, childEncodedSize, childEncodedSizePos);
@@ -359,7 +359,7 @@
break;
case WIRE_TYPE_FIXED32:
encodedSize += 4;
- mBuffer.ep()->move(4);
+ mBuffer->ep()->move(4);
break;
default:
ALOGE("Unexpected wire type %d in editEncodedSize at [%zu, %zu]",
@@ -378,30 +378,30 @@
bool
ProtoOutputStream::compactSize(size_t rawSize)
{
- size_t objectStart = mBuffer.ep()->pos();
+ size_t objectStart = mBuffer->ep()->pos();
size_t objectEnd = objectStart + rawSize;
int childRawSize, childEncodedSize;
- while (mBuffer.ep()->pos() < objectEnd) {
- uint32_t tag = (uint32_t)mBuffer.readRawVarint();
+ while (mBuffer->ep()->pos() < objectEnd) {
+ uint32_t tag = (uint32_t)mBuffer->readRawVarint();
switch (read_wire_type(tag)) {
case WIRE_TYPE_VARINT:
- while ((mBuffer.readRawByte() & 0x80) != 0) {}
+ while ((mBuffer->readRawByte() & 0x80) != 0) {}
break;
case WIRE_TYPE_FIXED64:
- mBuffer.ep()->move(8);
+ mBuffer->ep()->move(8);
break;
case WIRE_TYPE_LENGTH_DELIMITED:
- mBuffer.copy(mCopyBegin, mBuffer.ep()->pos() - mCopyBegin);
+ mBuffer->copy(mCopyBegin, mBuffer->ep()->pos() - mCopyBegin);
- childRawSize = (int)mBuffer.readRawFixed32();
- childEncodedSize = (int)mBuffer.readRawFixed32();
- mCopyBegin = mBuffer.ep()->pos();
+ childRawSize = (int)mBuffer->readRawFixed32();
+ childEncodedSize = (int)mBuffer->readRawFixed32();
+ mCopyBegin = mBuffer->ep()->pos();
// write encoded size to buffer.
- mBuffer.writeRawVarint32(childEncodedSize);
+ mBuffer->writeRawVarint32(childEncodedSize);
if (childRawSize >= 0 && childRawSize == childEncodedSize) {
- mBuffer.ep()->move(childEncodedSize);
+ mBuffer->ep()->move(childEncodedSize);
} else if (childRawSize < 0){
if (!compactSize(-childRawSize)) return false;
} else {
@@ -411,7 +411,7 @@
}
break;
case WIRE_TYPE_FIXED32:
- mBuffer.ep()->move(4);
+ mBuffer->ep()->move(4);
break;
default:
ALOGE("Unexpected wire type %d in compactSize at [%zu, %zu]",
@@ -429,7 +429,7 @@
ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
return 0;
}
- return mBuffer.size();
+ return mBuffer->size();
}
bool
@@ -438,43 +438,45 @@
if (fd < 0) return false;
if (!compact()) return false;
- EncodedBuffer::iterator it = mBuffer.begin();
- while (it.readBuffer() != NULL) {
- if (!android::base::WriteFully(fd, it.readBuffer(), it.currentToRead())) return false;
- it.rp()->move(it.currentToRead());
+ sp<ProtoReader> reader = mBuffer->read();
+ while (reader->readBuffer() != NULL) {
+ if (!android::base::WriteFully(fd, reader->readBuffer(), reader->currentToRead())) {
+ return false;
+ }
+ reader->move(reader->currentToRead());
}
return true;
}
-EncodedBuffer::iterator
+sp<ProtoReader>
ProtoOutputStream::data()
{
if (!compact()) {
ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
- mBuffer.clear();
+ mBuffer->clear();
}
- return mBuffer.begin();
+ return mBuffer->read();
}
void
ProtoOutputStream::writeRawVarint(uint64_t varint)
{
- mBuffer.writeRawVarint64(varint);
+ mBuffer->writeRawVarint64(varint);
}
void
ProtoOutputStream::writeLengthDelimitedHeader(uint32_t id, size_t size)
{
- mBuffer.writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED);
+ mBuffer->writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED);
// reserves 64 bits for length delimited fields, if first field is negative, compact it.
- mBuffer.writeRawFixed32(size);
- mBuffer.writeRawFixed32(size);
+ mBuffer->writeRawFixed32(size);
+ mBuffer->writeRawFixed32(size);
}
void
ProtoOutputStream::writeRawByte(uint8_t byte)
{
- mBuffer.writeRawByte(byte);
+ mBuffer->writeRawByte(byte);
}
@@ -494,99 +496,99 @@
inline void
ProtoOutputStream::writeDoubleImpl(uint32_t id, double val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_FIXED64);
- mBuffer.writeRawFixed64(bit_cast<double, uint64_t>(val));
+ mBuffer->writeHeader(id, WIRE_TYPE_FIXED64);
+ mBuffer->writeRawFixed64(bit_cast<double, uint64_t>(val));
}
inline void
ProtoOutputStream::writeFloatImpl(uint32_t id, float val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_FIXED32);
- mBuffer.writeRawFixed32(bit_cast<float, uint32_t>(val));
+ mBuffer->writeHeader(id, WIRE_TYPE_FIXED32);
+ mBuffer->writeRawFixed32(bit_cast<float, uint32_t>(val));
}
inline void
ProtoOutputStream::writeInt64Impl(uint32_t id, int64_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint64(val);
+ mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+ mBuffer->writeRawVarint64(val);
}
inline void
ProtoOutputStream::writeInt32Impl(uint32_t id, int32_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint32(val);
+ mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+ mBuffer->writeRawVarint32(val);
}
inline void
ProtoOutputStream::writeUint64Impl(uint32_t id, uint64_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint64(val);
+ mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+ mBuffer->writeRawVarint64(val);
}
inline void
ProtoOutputStream::writeUint32Impl(uint32_t id, uint32_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint32(val);
+ mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+ mBuffer->writeRawVarint32(val);
}
inline void
ProtoOutputStream::writeFixed64Impl(uint32_t id, uint64_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_FIXED64);
- mBuffer.writeRawFixed64(val);
+ mBuffer->writeHeader(id, WIRE_TYPE_FIXED64);
+ mBuffer->writeRawFixed64(val);
}
inline void
ProtoOutputStream::writeFixed32Impl(uint32_t id, uint32_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_FIXED32);
- mBuffer.writeRawFixed32(val);
+ mBuffer->writeHeader(id, WIRE_TYPE_FIXED32);
+ mBuffer->writeRawFixed32(val);
}
inline void
ProtoOutputStream::writeSFixed64Impl(uint32_t id, int64_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_FIXED64);
- mBuffer.writeRawFixed64(val);
+ mBuffer->writeHeader(id, WIRE_TYPE_FIXED64);
+ mBuffer->writeRawFixed64(val);
}
inline void
ProtoOutputStream::writeSFixed32Impl(uint32_t id, int32_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_FIXED32);
- mBuffer.writeRawFixed32(val);
+ mBuffer->writeHeader(id, WIRE_TYPE_FIXED32);
+ mBuffer->writeRawFixed32(val);
}
inline void
ProtoOutputStream::writeZigzagInt64Impl(uint32_t id, int64_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint64((val << 1) ^ (val >> 63));
+ mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+ mBuffer->writeRawVarint64((val << 1) ^ (val >> 63));
}
inline void
ProtoOutputStream::writeZigzagInt32Impl(uint32_t id, int32_t val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint32((val << 1) ^ (val >> 31));
+ mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+ mBuffer->writeRawVarint32((val << 1) ^ (val >> 31));
}
inline void
ProtoOutputStream::writeEnumImpl(uint32_t id, int val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint32((uint32_t) val);
+ mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+ mBuffer->writeRawVarint32((uint32_t) val);
}
inline void
ProtoOutputStream::writeBoolImpl(uint32_t id, bool val)
{
- mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint32(val ? 1 : 0);
+ mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+ mBuffer->writeRawVarint32(val ? 1 : 0);
}
inline void
@@ -595,7 +597,7 @@
if (val == NULL) return;
writeLengthDelimitedHeader(id, size);
for (size_t i=0; i<size; i++) {
- mBuffer.writeRawByte((uint8_t)val[i]);
+ mBuffer->writeRawByte((uint8_t)val[i]);
}
}
@@ -605,7 +607,7 @@
if (val == NULL) return;
writeLengthDelimitedHeader(id, size);
for (size_t i=0; i<size; i++) {
- mBuffer.writeRawByte(val[i]);
+ mBuffer->writeRawByte(val[i]);
}
}
diff --git a/services/net/java/android/net/ApfCapabilitiesParcelable.aidl b/libs/protoutil/src/ProtoReader.cpp
similarity index 68%
rename from services/net/java/android/net/ApfCapabilitiesParcelable.aidl
rename to libs/protoutil/src/ProtoReader.cpp
index f0645d2..4f2a9f1 100644
--- a/services/net/java/android/net/ApfCapabilitiesParcelable.aidl
+++ b/libs/protoutil/src/ProtoReader.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2017 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,11 +13,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#define LOG_TAG "libprotoutil"
-package android.net;
+#include <android/util/ProtoReader.h>
-parcelable ApfCapabilitiesParcelable {
- int apfVersionSupported;
- int maximumApfProgramSize;
- int apfPacketFormat;
-}
\ No newline at end of file
+namespace android {
+namespace util {
+
+ProtoReader::ProtoReader() {
+}
+
+ProtoReader::~ProtoReader() {
+}
+
+} // util
+} // android
diff --git a/libs/protoutil/tests/EncodedBuffer_test.cpp b/libs/protoutil/tests/EncodedBuffer_test.cpp
index 964fc8e..398af60 100644
--- a/libs/protoutil/tests/EncodedBuffer_test.cpp
+++ b/libs/protoutil/tests/EncodedBuffer_test.cpp
@@ -16,6 +16,7 @@
#include <gtest/gtest.h>
using namespace android::util;
+using android::sp;
constexpr size_t TEST_CHUNK_SIZE = 16UL;
constexpr size_t TEST_CHUNK_HALF_SIZE = TEST_CHUNK_SIZE / 2;
@@ -122,33 +123,30 @@
for (size_t i = 0; i < TEST_CHUNK_3X_SIZE; i++) {
buffer.writeRawByte(i);
}
- auto iter = buffer.begin();
- EXPECT_EQ(iter.size(), TEST_CHUNK_3X_SIZE);
- EXPECT_EQ(iter.bytesRead(), 0);
+ sp<ProtoReader> reader1 = buffer.read();
+ EXPECT_EQ(reader1->size(), TEST_CHUNK_3X_SIZE);
+ EXPECT_EQ(reader1->bytesRead(), 0);
- expectPointer(iter.rp(), 0);
- while (iter.readBuffer() != NULL) {
- iter.rp()->move(iter.currentToRead());
+ while (reader1->readBuffer() != NULL) {
+ reader1->move(reader1->currentToRead());
}
- EXPECT_EQ(iter.bytesRead(), TEST_CHUNK_3X_SIZE);
- expectPointer(iter.rp(), TEST_CHUNK_3X_SIZE);
+ EXPECT_EQ(reader1->bytesRead(), TEST_CHUNK_3X_SIZE);
- iter.rp()->rewind();
- expectPointer(iter.rp(), 0);
+ sp<ProtoReader> reader2 = buffer.read();
uint8_t val = 0;
- while (iter.hasNext()) {
- EXPECT_EQ(iter.next(), val);
+ while (reader2->hasNext()) {
+ EXPECT_EQ(reader2->next(), val);
val++;
}
- EXPECT_EQ(iter.bytesRead(), TEST_CHUNK_3X_SIZE);
- expectPointer(iter.rp(), TEST_CHUNK_3X_SIZE);
+ EXPECT_EQ(reader2->bytesRead(), TEST_CHUNK_3X_SIZE);
+ EXPECT_EQ(reader1->bytesRead(), TEST_CHUNK_3X_SIZE);
}
TEST(EncodedBufferTest, ReadVarint) {
EncodedBuffer buffer;
uint64_t val = UINT64_C(1522865904593);
size_t len = buffer.writeRawVarint64(val);
- auto iter = buffer.begin();
- EXPECT_EQ(iter.size(), len);
- EXPECT_EQ(iter.readRawVarint(), val);
+ sp<ProtoReader> reader = buffer.read();
+ EXPECT_EQ(reader->size(), len);
+ EXPECT_EQ(reader->readRawVarint(), val);
}
diff --git a/libs/protoutil/tests/ProtoOutputStream_test.cpp b/libs/protoutil/tests/ProtoOutputStream_test.cpp
index 27ee13d..9d357f3 100644
--- a/libs/protoutil/tests/ProtoOutputStream_test.cpp
+++ b/libs/protoutil/tests/ProtoOutputStream_test.cpp
@@ -21,6 +21,7 @@
#include "frameworks/base/libs/protoutil/tests/test.pb.h"
+using android::sp;
using namespace android::base;
using namespace android::util;
using ::testing::StrEq;
@@ -38,9 +39,9 @@
static std::string iterateToString(ProtoOutputStream* proto) {
std::string content;
content.reserve(proto->size());
- auto iter = proto->data();
- while (iter.hasNext()) {
- content.push_back(iter.next());
+ sp<ProtoReader> reader = proto->data();
+ while (reader->hasNext()) {
+ content.push_back(reader->next());
}
return content;
}
@@ -198,7 +199,6 @@
// no proto.end called
EXPECT_NE(proto.bytesWritten(), 0);
EXPECT_EQ(proto.size(), 0);
- EXPECT_EQ(proto.data().size(), 0);
EXPECT_FALSE(proto.flush(STDOUT_FILENO));
}
@@ -211,7 +211,6 @@
proto.end(token);
EXPECT_NE(proto.bytesWritten(), 0);
EXPECT_EQ(proto.size(), 0);
- EXPECT_EQ(proto.data().size(), 0);
EXPECT_FALSE(proto.flush(STDOUT_FILENO));
}
@@ -223,6 +222,5 @@
proto.end(wrongToken);
EXPECT_NE(proto.bytesWritten(), 0);
EXPECT_EQ(proto.size(), 0);
- EXPECT_EQ(proto.data().size(), 0);
EXPECT_FALSE(proto.flush(STDOUT_FILENO));
}
diff --git a/libs/services/Android.bp b/libs/services/Android.bp
index 3d57fbd..1b9939d 100644
--- a/libs/services/Android.bp
+++ b/libs/services/Android.bp
@@ -18,6 +18,7 @@
name: "libservices",
srcs: [
":IDropBoxManagerService.aidl",
+ "src/content/ComponentName.cpp",
"src/os/DropBoxManager.cpp",
"src/os/StatsDimensionsValue.cpp",
"src/os/StatsLogEventWrapper.cpp",
diff --git a/libs/services/include/android/content/ComponentName.h b/libs/services/include/android/content/ComponentName.h
new file mode 100644
index 0000000..6bf46b4
--- /dev/null
+++ b/libs/services/include/android/content/ComponentName.h
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <binder/Parcel.h>
+#include <binder/Parcelable.h>
+#include <binder/Status.h>
+#include <string>
+#include <vector>
+
+namespace android {
+namespace content {
+
+using namespace std;
+
+class ComponentName: public android::Parcelable {
+ public:
+ ComponentName();
+ ComponentName(const ComponentName& that);
+ ComponentName(const string& pkg, const string& cls);
+ virtual ~ComponentName();
+
+ bool operator<(const ComponentName& that) const;
+
+ const string& getPackageName() const { return mPackage; }
+ const string& getClassName() const { return mClass; }
+
+ virtual android::status_t writeToParcel(android::Parcel* out) const override;
+ virtual android::status_t readFromParcel(const android::Parcel* in) override;
+
+private:
+ string mPackage;
+ string mClass;
+};
+
+
+
+} // namespace os
+} // namespace android
+
+
+
diff --git a/libs/services/src/content/ComponentName.cpp b/libs/services/src/content/ComponentName.cpp
new file mode 100644
index 0000000..adb67ee
--- /dev/null
+++ b/libs/services/src/content/ComponentName.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+#include <android/content/ComponentName.h>
+
+namespace android {
+namespace content {
+
+ComponentName::ComponentName()
+ :mPackage(),
+ mClass() {
+}
+
+ComponentName::ComponentName(const ComponentName& that)
+ :mPackage(that.mPackage),
+ mClass(that.mClass) {
+}
+
+ComponentName::ComponentName(const string& pkg, const string& cls)
+ :mPackage(pkg),
+ mClass(cls) {
+}
+
+ComponentName::~ComponentName() {
+}
+
+bool ComponentName::operator<(const ComponentName& that) const {
+ if (mPackage < that.mPackage) {
+ return true;
+ } else if (mPackage > that.mPackage) {
+ return false;
+ }
+ return mClass < that.mClass;
+}
+
+status_t ComponentName::readFromParcel(const Parcel* in) {
+ status_t err;
+
+ // Note: This is a subtle variation from the java version, which
+ // requires non-null strings, but does not require non-empty strings.
+ // This code implicitly requires non-null strings, because it's impossible,
+ // but reading null strings that were somehow written by the java
+ // code would turn them into empty strings.
+
+ err = in->readUtf8FromUtf16(&mPackage);
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ err = in->readUtf8FromUtf16(&mClass);
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ return NO_ERROR;
+}
+
+status_t ComponentName::writeToParcel(android::Parcel* out) const {
+ status_t err;
+
+ err = out->writeUtf8AsUtf16(mPackage);
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ err = out->writeUtf8AsUtf16(mClass);
+ if (err != NO_ERROR) {
+ return err;
+ }
+
+ return NO_ERROR;
+}
+
+}} // namespace android::content
+
diff --git a/libs/services/src/os/DropBoxManager.cpp b/libs/services/src/os/DropBoxManager.cpp
index 681d5f7..429f996 100644
--- a/libs/services/src/os/DropBoxManager.cpp
+++ b/libs/services/src/os/DropBoxManager.cpp
@@ -225,7 +225,10 @@
if (service == NULL) {
return Status::fromExceptionCode(Status::EX_NULL_POINTER, "can't find dropbox service");
}
- return service->add(entry);
+ ALOGD("About to call service->add()");
+ Status status = service->add(entry);
+ ALOGD("service->add returned %s", status.toString8().string());
+ return status;
}
}} // namespace android::os
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index 93dc6fa..97bc404 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -93,10 +93,10 @@
ProviderProperties getProviderProperties(String provider);
boolean isProviderPackage(String packageName);
- void setLocationControllerExtraPackage(String packageName);
- String getLocationControllerExtraPackage();
- void setLocationControllerExtraPackageEnabled(boolean enabled);
- boolean isLocationControllerExtraPackageEnabled();
+ void setExtraLocationControllerPackage(String packageName);
+ String getExtraLocationControllerPackage();
+ void setExtraLocationControllerPackageEnabled(boolean enabled);
+ boolean isExtraLocationControllerPackageEnabled();
boolean isProviderEnabledForUser(String provider, int userId);
boolean isLocationEnabledForUser(int userId);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index edf304c..af60e3c 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -2328,9 +2328,27 @@
*/
@SystemApi
@RequiresPermission(Manifest.permission.LOCATION_HARDWARE)
- public void setLocationControllerExtraPackage(@NonNull String packageName) {
+ public void setExtraLocationControllerPackage(@Nullable String packageName) {
try {
- mService.setLocationControllerExtraPackage(packageName);
+ mService.setExtraLocationControllerPackage(packageName);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Set the extra location controller package for location services on the device.
+ *
+ * @removed
+ * @deprecated Use {@link #setExtraLocationControllerPackage} instead.
+ * @hide
+ */
+ @Deprecated
+ @SystemApi
+ @RequiresPermission(Manifest.permission.LOCATION_HARDWARE)
+ public void setLocationControllerExtraPackage(String packageName) {
+ try {
+ mService.setExtraLocationControllerPackage(packageName);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
@@ -2342,9 +2360,9 @@
* @hide
*/
@SystemApi
- public @Nullable String getLocationControllerExtraPackage() {
+ public @Nullable String getExtraLocationControllerPackage() {
try {
- return mService.getLocationControllerExtraPackage();
+ return mService.getExtraLocationControllerPackage();
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return null;
@@ -2354,13 +2372,31 @@
/**
* Set whether the extra location controller package is currently enabled on the device.
*
+ * @removed
+ * @deprecated Use {@link #setExtraLocationControllerPackageEnabled} instead.
+ * @hide
+ */
+ @SystemApi
+ @Deprecated
+ @RequiresPermission(Manifest.permission.LOCATION_HARDWARE)
+ public void setLocationControllerExtraPackageEnabled(boolean enabled) {
+ try {
+ mService.setExtraLocationControllerPackageEnabled(enabled);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Set whether the extra location controller package is currently enabled on the device.
+ *
* @hide
*/
@SystemApi
@RequiresPermission(Manifest.permission.LOCATION_HARDWARE)
- public void setLocationControllerExtraPackageEnabled(boolean enabled) {
+ public void setExtraLocationControllerPackageEnabled(boolean enabled) {
try {
- mService.setLocationControllerExtraPackageEnabled(enabled);
+ mService.setExtraLocationControllerPackageEnabled(enabled);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
@@ -2372,9 +2408,9 @@
* @hide
*/
@SystemApi
- public boolean isLocationControllerExtraPackageEnabled() {
+ public boolean isExtraLocationControllerPackageEnabled() {
try {
- return mService.isLocationControllerExtraPackageEnabled();
+ return mService.isExtraLocationControllerPackageEnabled();
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return false;
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index c2f29bc..efb7f46 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -370,9 +370,10 @@
/**
* @hide
- * Flag specifying that the audio shall not be captured by other apps.
+ * Flag specifying that the audio shall not be captured by third-party apps
+ * with a MediaProjection.
*/
- public static final int FLAG_NO_CAPTURE = 0x1 << 10;
+ public static final int FLAG_NO_MEDIA_PROJECTION = 0x1 << 10;
/**
* @hide
@@ -380,12 +381,63 @@
*/
public static final int FLAG_MUTE_HAPTIC = 0x1 << 11;
+ /**
+ * @hide
+ * Flag specifying that the audio shall not be captured by any apps, not even system apps.
+ */
+ public static final int FLAG_NO_SYSTEM_CAPTURE = 0x1 << 12;
+
private final static int FLAG_ALL = FLAG_AUDIBILITY_ENFORCED | FLAG_SECURE | FLAG_SCO |
FLAG_BEACON | FLAG_HW_AV_SYNC | FLAG_HW_HOTWORD | FLAG_BYPASS_INTERRUPTION_POLICY |
FLAG_BYPASS_MUTE | FLAG_LOW_LATENCY | FLAG_DEEP_BUFFER | FLAG_MUTE_HAPTIC;
private final static int FLAG_ALL_PUBLIC = FLAG_AUDIBILITY_ENFORCED |
FLAG_HW_AV_SYNC | FLAG_LOW_LATENCY;
+ /**
+ * Indicates that the audio may be captured by any app.
+ *
+ * For privacy, the following usages can not be recorded: VOICE_COMMUNICATION*,
+ * USAGE_NOTIFICATION*, USAGE_ASSISTANCE* and USAGE_ASSISTANT.
+ *
+ * On {@link android.os.Build.VERSION_CODES#Q}, this means only {@link #USAGE_UNKNOWN},
+ * {@link #USAGE_MEDIA} and {@link #USAGE_GAME} may be captured.
+ *
+ * See {@link android.media.projection.MediaProjection} and
+ * {@link Builder#setAllowedCapturePolicy}.
+ */
+ public static final int ALLOW_CAPTURE_BY_ALL = 1;
+ /**
+ * Indicates that the audio may only be captured by system apps.
+ *
+ * System apps can capture for many purposes like accessibility, user guidance...
+ * but abide to the following restrictions:
+ * - the audio can not leave the device
+ * - the audio can not be passed to a third party app
+ * - the audio can not be recorded at a higher quality then 16kHz 16bit mono
+ *
+ * See {@link Builder#setAllowedCapturePolicy}.
+ */
+ public static final int ALLOW_CAPTURE_BY_SYSTEM = 2;
+ /**
+ * Indicates that the audio is not to be recorded by any app, even if it is a system app.
+ *
+ * It is encouraged to use {@link #ALLOW_CAPTURE_BY_SYSTEM} instead of this value as system apps
+ * provide significant and useful features for the user (such as live captioning
+ * and accessibility).
+ *
+ * See {@link Builder#setAllowedCapturePolicy}.
+ */
+ public static final int ALLOW_CAPTURE_BY_NONE = 3;
+
+ /** @hide */
+ @IntDef({
+ ALLOW_CAPTURE_BY_ALL,
+ ALLOW_CAPTURE_BY_SYSTEM,
+ ALLOW_CAPTURE_BY_NONE,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface CapturePolicy {}
+
@UnsupportedAppUsage
private int mUsage = USAGE_UNKNOWN;
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
@@ -593,10 +645,10 @@
case USAGE_GAME:
case USAGE_VIRTUAL_SOURCE:
case USAGE_ASSISTANT:
- mUsage = usage;
- break;
+ mUsage = usage;
+ break;
default:
- mUsage = USAGE_UNKNOWN;
+ mUsage = USAGE_UNKNOWN;
}
return this;
}
@@ -642,17 +694,34 @@
}
/**
- * Specifying if audio shall or shall not be captured by other apps.
- * By default, capture is allowed.
- * @param allowCapture false to forbid capture of the audio by any apps,
- * true to allow apps to capture the audio
+ * Specifying if audio may or may not be captured by other apps or the system.
+ *
+ * The default is {@link AudioAttributes#ALLOW_CAPTURE_BY_ALL}.
+ *
+ * Note that an application can also set its global policy, in which case the most
+ * restrictive policy is always applied.
+ *
+ * @param capturePolicy one of
+ * {@link #ALLOW_CAPTURE_BY_ALL},
+ * {@link #ALLOW_CAPTURE_BY_SYSTEM},
+ * {@link #ALLOW_CAPTURE_BY_NONE}.
* @return the same Builder instance
+ * @throws IllegalArgumentException if the argument is not a valid value.
*/
- public @NonNull Builder setAllowCapture(boolean allowCapture) {
- if (allowCapture) {
- mFlags &= ~FLAG_NO_CAPTURE;
- } else {
- mFlags |= FLAG_NO_CAPTURE;
+ public @NonNull Builder setAllowedCapturePolicy(@CapturePolicy int capturePolicy) {
+ switch (capturePolicy) {
+ case ALLOW_CAPTURE_BY_NONE:
+ mFlags |= FLAG_NO_MEDIA_PROJECTION | FLAG_NO_SYSTEM_CAPTURE;
+ break;
+ case ALLOW_CAPTURE_BY_SYSTEM:
+ mFlags |= FLAG_NO_MEDIA_PROJECTION;
+ mFlags &= ~FLAG_NO_SYSTEM_CAPTURE;
+ break;
+ case ALLOW_CAPTURE_BY_ALL:
+ mFlags &= ~FLAG_NO_SYSTEM_CAPTURE & ~FLAG_NO_MEDIA_PROJECTION;
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown allow playback capture policy");
}
return this;
}
diff --git a/media/java/android/media/AudioPlaybackCaptureConfiguration.java b/media/java/android/media/AudioPlaybackCaptureConfiguration.java
index 4aa0b90..9ee6f87 100644
--- a/media/java/android/media/AudioPlaybackCaptureConfiguration.java
+++ b/media/java/android/media/AudioPlaybackCaptureConfiguration.java
@@ -28,7 +28,7 @@
/**
* Configuration for capturing audio played by other apps.
*
- * For privacy and copyright reason, only the following audio can be captured:
+ * Only the following audio can be captured:
* - usage MUST be UNKNOWN or GAME or MEDIA. All other usages CAN NOT be capturable.
* - audio attributes MUST NOT have the FLAG_NO_CAPTURE
* - played by apps that MUST be in the same user profile as the capturing app
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index a22c8d0..4d63cc8 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -1060,7 +1060,7 @@
* that no B frames are allowed. Note that non-zero value does not guarantee
* B frames; it's up to the encoder to decide.
*/
- public static final String KEY_MAX_BFRAMES = "max-bframes";
+ public static final String KEY_MAX_B_FRAMES = "max-bframes";
/* package private */ MediaFormat(@NonNull Map<String, Object> map) {
mMap = map;
diff --git a/media/java/android/media/audiopolicy/AudioMix.java b/media/java/android/media/audiopolicy/AudioMix.java
index 6fd6298..09f17c0 100644
--- a/media/java/android/media/audiopolicy/AudioMix.java
+++ b/media/java/android/media/audiopolicy/AudioMix.java
@@ -142,7 +142,8 @@
return mFormat;
}
- AudioMixingRule getRule() {
+ /** @hide */
+ public AudioMixingRule getRule() {
return mRule;
}
diff --git a/media/java/android/media/audiopolicy/AudioMixingRule.java b/media/java/android/media/audiopolicy/AudioMixingRule.java
index d41f416..947b06c 100644
--- a/media/java/android/media/audiopolicy/AudioMixingRule.java
+++ b/media/java/android/media/audiopolicy/AudioMixingRule.java
@@ -16,6 +16,7 @@
package android.media.audiopolicy;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.media.AudioAttributes;
@@ -43,9 +44,11 @@
@SystemApi
public class AudioMixingRule {
- private AudioMixingRule(int mixType, ArrayList<AudioMixMatchCriterion> criteria) {
+ private AudioMixingRule(int mixType, ArrayList<AudioMixMatchCriterion> criteria,
+ boolean allowPrivilegedPlaybackCapture) {
mCriteria = criteria;
mTargetMixType = mixType;
+ mAllowPrivilegedPlaybackCapture = allowPrivilegedPlaybackCapture;
}
/**
@@ -161,6 +164,13 @@
@UnsupportedAppUsage
private final ArrayList<AudioMixMatchCriterion> mCriteria;
ArrayList<AudioMixMatchCriterion> getCriteria() { return mCriteria; }
+ @UnsupportedAppUsage
+ private boolean mAllowPrivilegedPlaybackCapture = false;
+
+ /** @hide */
+ public boolean allowPrivilegedPlaybackCapture() {
+ return mAllowPrivilegedPlaybackCapture;
+ }
/** @hide */
@Override
@@ -170,12 +180,13 @@
final AudioMixingRule that = (AudioMixingRule) o;
return (this.mTargetMixType == that.mTargetMixType)
- && (areCriteriaEquivalent(this.mCriteria, that.mCriteria));
+ && (areCriteriaEquivalent(this.mCriteria, that.mCriteria)
+ && this.mAllowPrivilegedPlaybackCapture == that.mAllowPrivilegedPlaybackCapture);
}
@Override
public int hashCode() {
- return Objects.hash(mTargetMixType, mCriteria);
+ return Objects.hash(mTargetMixType, mCriteria, mAllowPrivilegedPlaybackCapture);
}
private static boolean isValidSystemApiRule(int rule) {
@@ -239,6 +250,7 @@
public static class Builder {
private ArrayList<AudioMixMatchCriterion> mCriteria;
private int mTargetMixType = AudioMix.MIX_TYPE_INVALID;
+ private boolean mAllowPrivilegedPlaybackCapture = false;
/**
* Constructs a new Builder with no rules.
@@ -343,6 +355,21 @@
}
/**
+ * Set if the audio of app that opted out of audio playback capture should be captured.
+ *
+ * The permission {@link CAPTURE_AUDIO_OUTPUT} or {@link CAPTURE_MEDIA_OUTPUT} is needed
+ * to ignore the opt-out.
+ *
+ * Only affects LOOPBACK|RENDER mix.
+ *
+ * @return the same Builder instance.
+ */
+ public @NonNull Builder allowPrivilegedPlaybackCapture(boolean allow) {
+ mAllowPrivilegedPlaybackCapture = allow;
+ return this;
+ }
+
+ /**
* Add or exclude a rule for the selection of which streams are mixed together.
* Does error checking on the parameters.
* @param rule
@@ -507,7 +534,7 @@
* @return a new {@link AudioMixingRule} object
*/
public AudioMixingRule build() {
- return new AudioMixingRule(mTargetMixType, mCriteria);
+ return new AudioMixingRule(mTargetMixType, mCriteria, mAllowPrivilegedPlaybackCapture);
}
}
}
diff --git a/media/java/android/media/audiopolicy/AudioPolicyConfig.java b/media/java/android/media/audiopolicy/AudioPolicyConfig.java
index a6e63c7..c4ba0c1 100644
--- a/media/java/android/media/audiopolicy/AudioPolicyConfig.java
+++ b/media/java/android/media/audiopolicy/AudioPolicyConfig.java
@@ -96,6 +96,8 @@
dest.writeInt(mix.getFormat().getSampleRate());
dest.writeInt(mix.getFormat().getEncoding());
dest.writeInt(mix.getFormat().getChannelMask());
+ // write opt-out respect
+ dest.writeBoolean(mix.getRule().allowPrivilegedPlaybackCapture());
// write mix rules
final ArrayList<AudioMixMatchCriterion> criteria = mix.getRule().getCriteria();
dest.writeInt(criteria.size());
@@ -124,9 +126,12 @@
final AudioFormat format = new AudioFormat.Builder().setSampleRate(sampleRate)
.setChannelMask(channelMask).setEncoding(encoding).build();
mixBuilder.setFormat(format);
+
+ AudioMixingRule.Builder ruleBuilder = new AudioMixingRule.Builder();
+ // write opt-out respect
+ ruleBuilder.allowPrivilegedPlaybackCapture(in.readBoolean());
// read mix rules
int nbRules = in.readInt();
- AudioMixingRule.Builder ruleBuilder = new AudioMixingRule.Builder();
for (int j = 0 ; j < nbRules ; j++) {
// read the matching rules
ruleBuilder.addRuleFromParcel(in);
@@ -161,7 +166,9 @@
textDump += " rate=" + mix.getFormat().getSampleRate() + "Hz\n";
textDump += " encoding=" + mix.getFormat().getEncoding() + "\n";
textDump += " channels=0x";
- textDump += Integer.toHexString(mix.getFormat().getChannelMask()).toUpperCase() +"\n";
+ textDump += Integer.toHexString(mix.getFormat().getChannelMask()).toUpperCase() + "\n";
+ textDump += " ignore playback capture opt out="
+ + mix.getRule().allowPrivilegedPlaybackCapture() + "\n";
// write mix rules
final ArrayList<AudioMixMatchCriterion> criteria = mix.getRule().getCriteria();
for (AudioMixMatchCriterion criterion : criteria) {
diff --git a/packages/DynamicSystemInstallationService/AndroidManifest.xml b/packages/DynamicSystemInstallationService/AndroidManifest.xml
index 2911117..d718eae 100644
--- a/packages/DynamicSystemInstallationService/AndroidManifest.xml
+++ b/packages/DynamicSystemInstallationService/AndroidManifest.xml
@@ -16,7 +16,7 @@
android:name=".DynamicSystemInstallationService"
android:enabled="true"
android:exported="true"
- android:permission="android.permission.MANAGE_DYNAMIC_SYSTEM"
+ android:permission="android.permission.INSTALL_DYNAMIC_SYSTEM"
android:process=":dynsystem">
<intent-filter>
<action android:name="android.os.image.action.NOTIFY_IF_IN_USE" />
@@ -26,7 +26,7 @@
<activity android:name=".VerificationActivity"
android:exported="true"
- android:permission="android.permission.MANAGE_DYNAMIC_SYSTEM"
+ android:permission="android.permission.INSTALL_DYNAMIC_SYSTEM"
android:theme="@android:style/Theme.Material.Light.Dialog.NoActionBar"
android:process=":dynsystem">
<intent-filter>
diff --git a/packages/DynamicSystemInstallationService/src/com/android/dynandroid/DynamicSystemInstallationService.java b/packages/DynamicSystemInstallationService/src/com/android/dynandroid/DynamicSystemInstallationService.java
index e479e38..2ad72eb 100644
--- a/packages/DynamicSystemInstallationService/src/com/android/dynandroid/DynamicSystemInstallationService.java
+++ b/packages/DynamicSystemInstallationService/src/com/android/dynandroid/DynamicSystemInstallationService.java
@@ -221,12 +221,12 @@
return;
}
- String url = intent.getStringExtra(DynamicSystemClient.KEY_SYSTEM_URL);
+ String url = intent.getDataString();
mSystemSize = intent.getLongExtra(DynamicSystemClient.KEY_SYSTEM_SIZE, 0);
mUserdataSize = intent.getLongExtra(DynamicSystemClient.KEY_USERDATA_SIZE, 0);
mInstallTask = new InstallationAsyncTask(
- url, mSystemSize, mUserdataSize, mDynSystem, this);
+ url, mSystemSize, mUserdataSize, this, mDynSystem, this);
mInstallTask.execute();
@@ -410,7 +410,7 @@
}
private boolean verifyRequest(Intent intent) {
- String url = intent.getStringExtra(DynamicSystemClient.KEY_SYSTEM_URL);
+ String url = intent.getDataString();
return VerificationActivity.isVerified(url);
}
diff --git a/packages/DynamicSystemInstallationService/src/com/android/dynandroid/InstallationAsyncTask.java b/packages/DynamicSystemInstallationService/src/com/android/dynandroid/InstallationAsyncTask.java
index aee5de5..b0e28a0 100644
--- a/packages/DynamicSystemInstallationService/src/com/android/dynandroid/InstallationAsyncTask.java
+++ b/packages/DynamicSystemInstallationService/src/com/android/dynandroid/InstallationAsyncTask.java
@@ -16,7 +16,9 @@
package com.android.dynsystem;
+import android.content.Context;
import android.gsi.GsiProgress;
+import android.net.Uri;
import android.os.AsyncTask;
import android.os.image.DynamicSystemManager;
import android.util.Log;
@@ -59,6 +61,7 @@
private final String mUrl;
private final long mSystemSize;
private final long mUserdataSize;
+ private final Context mContext;
private final DynamicSystemManager mDynSystem;
private final InstallStatusListener mListener;
private DynamicSystemManager.Session mInstallationSession;
@@ -68,11 +71,12 @@
private InputStream mStream;
- InstallationAsyncTask(String url, long systemSize, long userdataSize,
+ InstallationAsyncTask(String url, long systemSize, long userdataSize, Context context,
DynamicSystemManager dynSystem, InstallStatusListener listener) {
mUrl = url;
mSystemSize = systemSize;
mUserdataSize = userdataSize;
+ mContext = context;
mDynSystem = dynSystem;
mListener = listener;
}
@@ -197,6 +201,10 @@
private void initInputStream() throws IOException, InvalidImageUrlException {
if (URLUtil.isNetworkUrl(mUrl) || URLUtil.isFileUrl(mUrl)) {
mStream = new BufferedInputStream(new GZIPInputStream(new URL(mUrl).openStream()));
+ } else if (URLUtil.isContentUrl(mUrl)) {
+ Uri uri = Uri.parse(mUrl);
+ mStream = new BufferedInputStream(new GZIPInputStream(
+ mContext.getContentResolver().openInputStream(uri)));
} else {
throw new InvalidImageUrlException(
String.format(Locale.US, "Unsupported file source: %s", mUrl));
diff --git a/packages/DynamicSystemInstallationService/src/com/android/dynandroid/VerificationActivity.java b/packages/DynamicSystemInstallationService/src/com/android/dynandroid/VerificationActivity.java
index f05930f..269645d 100644
--- a/packages/DynamicSystemInstallationService/src/com/android/dynandroid/VerificationActivity.java
+++ b/packages/DynamicSystemInstallationService/src/com/android/dynandroid/VerificationActivity.java
@@ -17,13 +17,13 @@
package com.android.dynsystem;
import static android.os.image.DynamicSystemClient.KEY_SYSTEM_SIZE;
-import static android.os.image.DynamicSystemClient.KEY_SYSTEM_URL;
import static android.os.image.DynamicSystemClient.KEY_USERDATA_SIZE;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.image.DynamicSystemClient;
@@ -81,16 +81,16 @@
// retrieve data from calling intent
Intent callingIntent = getIntent();
- String url = callingIntent.getStringExtra(KEY_SYSTEM_URL);
+ Uri url = callingIntent.getData();
long systemSize = callingIntent.getLongExtra(KEY_SYSTEM_SIZE, 0);
long userdataSize = callingIntent.getLongExtra(KEY_USERDATA_SIZE, 0);
- sVerifiedUrl = url;
+ sVerifiedUrl = url.toString();
// start service
Intent intent = new Intent(this, DynamicSystemInstallationService.class);
+ intent.setData(url);
intent.setAction(DynamicSystemClient.ACTION_START_INSTALL);
- intent.putExtra(KEY_SYSTEM_URL, url);
intent.putExtra(KEY_SYSTEM_SIZE, systemSize);
intent.putExtra(KEY_USERDATA_SIZE, userdataSize);
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java
index 0b7809e..c6dd0117 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java
@@ -102,9 +102,9 @@
private static final String TAG = "DhcpClient";
private static final boolean DBG = true;
- private static final boolean STATE_DBG = false;
- private static final boolean MSG_DBG = false;
- private static final boolean PACKET_DBG = false;
+ private static final boolean STATE_DBG = Log.isLoggable(TAG, Log.DEBUG);
+ private static final boolean MSG_DBG = Log.isLoggable(TAG, Log.DEBUG);
+ private static final boolean PACKET_DBG = Log.isLoggable(TAG, Log.DEBUG);
// Metrics events: must be kept in sync with server-side aggregation code.
/** Represents transitions from DhcpInitState to DhcpBoundState */
diff --git a/packages/NetworkStack/src/android/net/ip/IpReachabilityMonitor.java b/packages/NetworkStack/src/android/net/ip/IpReachabilityMonitor.java
index 3aa6933..c19a24e 100644
--- a/packages/NetworkStack/src/android/net/ip/IpReachabilityMonitor.java
+++ b/packages/NetworkStack/src/android/net/ip/IpReachabilityMonitor.java
@@ -129,8 +129,8 @@
*/
public class IpReachabilityMonitor {
private static final String TAG = "IpReachabilityMonitor";
- private static final boolean DBG = false;
- private static final boolean VDBG = false;
+ private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
+ private static final boolean VDBG = Log.isLoggable(TAG, Log.VERBOSE);
public interface Callback {
// This callback function must execute as quickly as possible as it is
diff --git a/packages/SettingsLib/AppPreference/res/layout/preference_app.xml b/packages/SettingsLib/AppPreference/res/layout/preference_app.xml
index 711dad4..dbc51958 100644
--- a/packages/SettingsLib/AppPreference/res/layout/preference_app.xml
+++ b/packages/SettingsLib/AppPreference/res/layout/preference_app.xml
@@ -88,7 +88,7 @@
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:gravity="center"
+ android:gravity="center_vertical|end"
android:minWidth="64dp"
android:orientation="vertical"/>
diff --git a/packages/SettingsLib/BarChartPreference/res/layout/settings_bar_chart.xml b/packages/SettingsLib/BarChartPreference/res/layout/settings_bar_chart.xml
index 814246f..9b3d1df 100644
--- a/packages/SettingsLib/BarChartPreference/res/layout/settings_bar_chart.xml
+++ b/packages/SettingsLib/BarChartPreference/res/layout/settings_bar_chart.xml
@@ -20,8 +20,8 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginEnd="16dp"
+ android:layout_marginStart="10dp"
+ android:layout_marginEnd="10dp"
android:gravity="center"
android:orientation="vertical">
@@ -47,19 +47,19 @@
<com.android.settingslib.widget.BarView
android:id="@+id/bar_view1"
style="@style/BarViewStyle"
- settings:barColor="#FA7B17"/>
+ settings:barColor="#A142F4"/>
<com.android.settingslib.widget.BarView
android:id="@+id/bar_view2"
style="@style/BarViewStyle"
- settings:barColor="#F439A0"/>
+ settings:barColor="#24C1E0"/>
<com.android.settingslib.widget.BarView
android:id="@+id/bar_view3"
style="@style/BarViewStyle"
- settings:barColor="#A142F4"/>
+ settings:barColor="#4285F4"/>
<com.android.settingslib.widget.BarView
android:id="@+id/bar_view4"
style="@style/BarViewStyle"
- settings:barColor="#24C1E0"/>
+ settings:barColor="#009688"/>
</LinearLayout>
<Button
diff --git a/packages/SettingsLib/BarChartPreference/res/layout/settings_bar_view.xml b/packages/SettingsLib/BarChartPreference/res/layout/settings_bar_view.xml
index 4bc68b3..093c5de 100644
--- a/packages/SettingsLib/BarChartPreference/res/layout/settings_bar_view.xml
+++ b/packages/SettingsLib/BarChartPreference/res/layout/settings_bar_view.xml
@@ -32,15 +32,13 @@
android:layout_width="@dimen/settings_bar_view_icon_size"
android:layout_height="@dimen/settings_bar_view_icon_size"
android:scaleType="fitCenter"
- android:layout_marginTop="12dp"
- android:layout_marginBottom="12dp"/>
+ android:layout_marginTop="12dp"/>
<TextView
android:id="@+id/bar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="10dp"
- android:layout_marginBottom="2dp"
+ android:layout_marginTop="12dp"
android:singleLine="true"
android:ellipsize="marquee"
android:textAppearance="@style/BarChart.Text.Title"/>
@@ -49,6 +47,7 @@
android:id="@+id/bar_summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
android:layout_marginBottom="12dp"
android:singleLine="true"
android:ellipsize="marquee"
diff --git a/packages/SettingsLib/BarChartPreference/res/values/styles.xml b/packages/SettingsLib/BarChartPreference/res/values/styles.xml
index 5587928..094f8aa 100644
--- a/packages/SettingsLib/BarChartPreference/res/values/styles.xml
+++ b/packages/SettingsLib/BarChartPreference/res/values/styles.xml
@@ -35,12 +35,12 @@
</style>
<style name="BarChart.Text.Title">
- <item name="android:textSize">22sp</item>
+ <item name="android:textSize">14sp</item>
</style>
<style name="BarChart.Text.Summary"
- parent="@android:style/TextAppearance.Material.Body1">
+ parent="@*android:style/TextAppearance.DeviceDefault.Body1">
<item name="android:textColor">?android:attr/textColorSecondary</item>
- <item name="android:textSize">14sp</item>
+ <item name="android:textSize">12sp</item>
</style>
</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarView.java b/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarView.java
index 03dfd3e..fccb719 100644
--- a/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarView.java
+++ b/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarView.java
@@ -71,8 +71,7 @@
//Set height of bar view
mBarView.getLayoutParams().height = barViewInfo.getNormalizedHeight();
mIcon.setImageDrawable(barViewInfo.getIcon());
- // For now, we use the bar number as title.
- mBarTitle.setText(Integer.toString(barViewInfo.getHeight()));
+ mBarTitle.setText(barViewInfo.getTitle());
mBarSummary.setText(barViewInfo.getSummary());
mIcon.setContentDescription(barViewInfo.getContentDescription());
}
diff --git a/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarViewInfo.java b/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarViewInfo.java
index 1ef36a2..922337a 100644
--- a/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarViewInfo.java
+++ b/packages/SettingsLib/BarChartPreference/src/com/android/settingslib/widget/BarViewInfo.java
@@ -21,7 +21,6 @@
import androidx.annotation.IntRange;
import androidx.annotation.Nullable;
-import androidx.annotation.StringRes;
import java.util.Comparator;
@@ -32,8 +31,8 @@
private final Drawable mIcon;
private View.OnClickListener mClickListener;
- @StringRes
- private int mSummary;
+ private CharSequence mTitle;
+ private CharSequence mSummary;
private @Nullable CharSequence mContentDescription;
// A number indicates this bar's height. The larger number shows a higher bar view.
private int mHeight;
@@ -45,13 +44,16 @@
*
* @param icon The icon of bar view.
* @param barHeight The height of bar view. Larger number shows a higher bar view.
- * @param summary The string resource id for summary.
+ * @param title The string for title. If this is null, use the height of the bar.
+ * @param summary The string for summary.
* @param contentDescription Optional text that briefly describes the contents of the icon.
*/
- public BarViewInfo(Drawable icon, @IntRange(from = 0) int barHeight, @StringRes int summary,
+ public BarViewInfo(Drawable icon, @IntRange(from = 0) int barHeight,
+ @Nullable CharSequence title, CharSequence summary,
@Nullable CharSequence contentDescription) {
mIcon = icon;
mHeight = barHeight;
+ mTitle = title;
mSummary = summary;
mContentDescription = contentDescription;
}
@@ -74,8 +76,12 @@
mHeight = height;
}
- void setSummary(@StringRes int resId) {
- mSummary = resId;
+ void setTitle(CharSequence title) {
+ mTitle = title;
+ }
+
+ void setSummary(CharSequence summary) {
+ mSummary = summary;
}
Drawable getIcon() {
@@ -90,8 +96,12 @@
return mClickListener;
}
- @StringRes
- int getSummary() {
+ @Nullable
+ CharSequence getTitle() {
+ return mTitle;
+ }
+
+ CharSequence getSummary() {
return mSummary;
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAccessesTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAccessesTest.java
index c1c5fa9..5d2a0d1d 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAccessesTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAccessesTest.java
@@ -16,9 +16,10 @@
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
-
import android.util.LongSparseLongArray;
+
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -83,6 +84,7 @@
}
@Test
+ @Ignore
public void testGetAppList_shouldFilterRecentAccesses() {
List<RecentLocationAccesses.Access> requests = mRecentLocationAccesses.getAppList();
// Only two of the apps have requested location within 15 min.
@@ -95,6 +97,7 @@
}
@Test
+ @Ignore
public void testGetAppList_shouldNotShowAndroidOS() throws NameNotFoundException {
// Add android OS to the list of apps.
PackageOps androidSystemPackageOps =
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartInfoTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartInfoTest.java
index 2b27248..7faac7a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartInfoTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartInfoTest.java
@@ -39,6 +39,8 @@
private final int mDetails = 0x22222222;
@StringRes
private final int mEmptyText = 0x33333333;
+ private final CharSequence mTitleStr = "title";
+ private final CharSequence mSummaryStr = "summary";
private final View.OnClickListener mClickListener = v -> {
};
@@ -72,7 +74,8 @@
final BarViewInfo barViewInfo = new BarViewInfo(
null /* icon */,
50,
- mTitle,
+ mTitleStr,
+ mSummaryStr,
null);
final BarChartInfo mBarChartInfo = new BarChartInfo.Builder()
@@ -92,7 +95,8 @@
final BarViewInfo barViewInfo = new BarViewInfo(
null /* icon */,
50,
- mTitle,
+ mTitleStr,
+ mSummaryStr,
null);
final BarChartInfo mBarChartInfo = new BarChartInfo.Builder()
.setTitle(mTitle)
@@ -115,7 +119,8 @@
final BarViewInfo barViewInfo = new BarViewInfo(
null /* icon */,
50,
- mTitle,
+ mTitleStr,
+ mSummaryStr,
null);
new BarChartInfo.Builder()
.setTitle(mTitle)
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartPreferenceTest.java
index 266554b..567d90f 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartPreferenceTest.java
@@ -39,6 +39,8 @@
@Rule
public final ExpectedException thrown = ExpectedException.none();
+ private final CharSequence mTitleStr = "title";
+ private final CharSequence mSummaryStr = "summary";
private Context mContext;
private View mBarChartView;
@@ -114,7 +116,9 @@
.setTitle(R.string.debug_app)
.setDetails(R.string.debug_app)
.addBarViewInfo(
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null))
+ new BarViewInfo(mIcon, 10, null /* title */,
+ mContext.getText(R.string.debug_app) /* summary */,
+ null /* contentDescription */))
.build();
mPreference.initializeBarChart(barChartInfo);
@@ -130,7 +134,9 @@
final BarChartInfo barChartInfo = new BarChartInfo.Builder()
.setTitle(R.string.debug_app)
.addBarViewInfo(
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null))
+ new BarViewInfo(mIcon, 10, null /* title */,
+ mContext.getText(R.string.debug_app) /* summary */,
+ null /* contentDescription */))
.build();
mPreference.initializeBarChart(barChartInfo);
@@ -147,7 +153,9 @@
.setDetailsOnClickListener(v -> {
})
.addBarViewInfo(
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null))
+ new BarViewInfo(mIcon, 10, null /* title */,
+ mContext.getText(R.string.debug_app) /* summary */,
+ null /* contentDescription */))
.build();
mPreference.initializeBarChart(barChartInfo);
@@ -160,7 +168,7 @@
@Test
public void setBarViewInfos_oneBarViewInfoSet_shouldShowOneBarView() {
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null)
+ new BarViewInfo(mIcon, 10, mTitleStr, mSummaryStr, null /* contentDescription */)
};
mPreference.initializeBarChart(mBarChartInfo);
@@ -168,7 +176,7 @@
mPreference.onBindViewHolder(mHolder);
assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView1.getTitle()).isEqualTo("10");
+ assertThat(mBarView1.getTitle()).isEqualTo(mTitleStr);
assertThat(mBarView2.getVisibility()).isEqualTo(View.GONE);
assertThat(mBarView3.getVisibility()).isEqualTo(View.GONE);
@@ -178,8 +186,8 @@
@Test
public void setBarViewInfos_twoBarViewInfosSet_shouldShowTwoBarViews() {
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
- new BarViewInfo(mIcon, 20 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null)
+ new BarViewInfo(mIcon, 20, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 10, mTitleStr, mSummaryStr, null /* contentDescription */),
};
mPreference.initializeBarChart(mBarChartInfo);
@@ -187,9 +195,9 @@
mPreference.onBindViewHolder(mHolder);
assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView1.getTitle()).isEqualTo("20");
+ assertThat(mBarView1.getTitle()).isEqualTo(mTitleStr);
assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView2.getTitle()).isEqualTo("10");
+ assertThat(mBarView2.getTitle()).isEqualTo(mTitleStr);
assertThat(mBarView3.getVisibility()).isEqualTo(View.GONE);
assertThat(mBarView4.getVisibility()).isEqualTo(View.GONE);
@@ -198,9 +206,9 @@
@Test
public void setBarViewInfos_threeBarViewInfosSet_shouldShowThreeBarViews() {
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
- new BarViewInfo(mIcon, 20 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app, null)
+ new BarViewInfo(mIcon, 20, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 10, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 5, mTitleStr, mSummaryStr, null /* contentDescription */)
};
mPreference.initializeBarChart(mBarChartInfo);
@@ -208,11 +216,11 @@
mPreference.onBindViewHolder(mHolder);
assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView1.getTitle()).isEqualTo("20");
+ assertThat(mBarView1.getTitle()).isEqualTo(mTitleStr);
assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView2.getTitle()).isEqualTo("10");
+ assertThat(mBarView2.getTitle()).isEqualTo(mTitleStr);
assertThat(mBarView3.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView3.getTitle()).isEqualTo("5");
+ assertThat(mBarView3.getTitle()).isEqualTo(mTitleStr);
assertThat(mBarView4.getVisibility()).isEqualTo(View.GONE);
}
@@ -220,10 +228,10 @@
@Test
public void setBarViewInfos_fourBarViewInfosSet_shouldShowFourBarViews() {
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
- new BarViewInfo(mIcon, 20 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 2 /* barNumber */, R.string.debug_app, null),
+ new BarViewInfo(mIcon, 20, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 10, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 5, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 2, mTitleStr, mSummaryStr, null /* contentDescription */)
};
mPreference.initializeBarChart(mBarChartInfo);
@@ -231,13 +239,13 @@
mPreference.onBindViewHolder(mHolder);
assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView1.getTitle()).isEqualTo("20");
+ assertThat(mBarView1.getTitle()).isEqualTo(mTitleStr);
assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView2.getTitle()).isEqualTo("10");
+ assertThat(mBarView2.getTitle()).isEqualTo(mTitleStr);
assertThat(mBarView3.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView3.getTitle()).isEqualTo("5");
+ assertThat(mBarView3.getTitle()).isEqualTo(mTitleStr);
assertThat(mBarView4.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView4.getTitle()).isEqualTo("2");
+ assertThat(mBarView4.getTitle()).isEqualTo(mTitleStr);
}
@Test
@@ -245,11 +253,11 @@
thrown.expect(IllegalStateException.class);
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
- new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 50 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 70 /* barNumber */, R.string.debug_app, null),
+ new BarViewInfo(mIcon, 30, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 50, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 5, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 10, mTitleStr, mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 70, mTitleStr, mSummaryStr, null /* contentDescription */),
};
mPreference.setBarViewInfos(barViewsInfo);
@@ -258,10 +266,10 @@
@Test
public void setBarViewInfos_barViewInfosSet_shouldBeSortedInDescending() {
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
- new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 50 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app, null),
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
+ new BarViewInfo(mIcon, 30, "30", mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 50, "50", mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 5, "5", mSummaryStr, null /* contentDescription */),
+ new BarViewInfo(mIcon, 10, "10", mSummaryStr, null /* contentDescription */)
};
mPreference.initializeBarChart(mBarChartInfo);
@@ -281,7 +289,7 @@
@Test
public void setBarViewInfos_validBarViewSummarySet_barViewShouldShowSummary() {
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
- new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
+ new BarViewInfo(mIcon, 10, mTitleStr, mSummaryStr, null /* contentDescription */)
};
mPreference.initializeBarChart(mBarChartInfo);
@@ -289,13 +297,27 @@
mPreference.onBindViewHolder(mHolder);
assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
- assertThat(mBarView1.getSummary()).isEqualTo(mContext.getText(R.string.debug_app));
+ assertThat(mBarView1.getSummary()).isEqualTo(mSummaryStr);
+ }
+
+ @Test
+ public void setBarViewInfos_validBarViewTitleSet_barViewShouldShowTitle() {
+ final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
+ new BarViewInfo(mIcon, 10, mTitleStr, mSummaryStr, null /* contentDescription */)
+ };
+
+ mPreference.initializeBarChart(mBarChartInfo);
+ mPreference.setBarViewInfos(barViewsInfo);
+ mPreference.onBindViewHolder(mHolder);
+
+ assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mBarView1.getTitle()).isEqualTo(mTitleStr);
}
@Test
public void setBarViewInfos_clickListenerForBarViewSet_barViewShouldHaveClickListener() {
- final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app,
- null);
+ final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30, mTitleStr, mSummaryStr,
+ null /* contentDescription */);
viewInfo.setClickListener(v -> {
});
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{viewInfo};
@@ -310,8 +332,8 @@
@Test
public void onBindViewHolder_loadingStateIsTrue_shouldHideAllViews() {
- final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app,
- null);
+ final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30, mTitleStr, mSummaryStr,
+ null /* contentDescription */);
viewInfo.setClickListener(v -> {
});
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{viewInfo};
@@ -327,8 +349,8 @@
@Test
public void onBindViewHolder_loadingStateIsFalse_shouldInitAnyView() {
- final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app,
- null);
+ final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30, mTitleStr, mSummaryStr,
+ null /* contentDescription */);
viewInfo.setClickListener(v -> {
});
final BarViewInfo[] barViewsInfo = new BarViewInfo[]{viewInfo};
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_left_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_left_animation.xml
deleted file mode 100644
index d6054c4..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_left_animation.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyName="scaleX"
- android:valueFrom="1.0"
- android:valueTo="1.8"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_mask_1_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_mask_1_animation.xml
deleted file mode 100644
index 282170c..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_mask_1_animation.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="83"
- android:propertyName="pathData"
- android:valueFrom="M 366.5,-269.5 c 0.0,0.0 -578.0,2.0 -578.0,2.0 c 0.0,0.0 65.7498321533,68.2501220703 65.7498321533,68.2501220703 c 0.0,0.0 -20.7500457764,20.7500610352 -20.7500457764,20.7500610352 c 0.0,0.0 -65.749786377,-68.2501983643 -65.749786377,-68.2501983643 c 0.0,0.0 -7.25,539.250015259 -7.25,539.250015259 c 0.0,0.0 606.0,0.0 606.0,0.0 c 0.0,0.0 0.0,-562.0 0.0,-562.0 Z"
- android:valueTo="M 366.5,-269.5 c 0.0,0.0 -578.0,2.0 -578.0,2.0 c 0.0,0.0 65.7498321533,68.2501220703 65.7498321533,68.2501220703 c 0.0,0.0 -20.7500457764,20.7500610352 -20.7500457764,20.7500610352 c 0.0,0.0 -65.749786377,-68.2501983643 -65.749786377,-68.2501983643 c 0.0,0.0 -7.25,539.250015259 -7.25,539.250015259 c 0.0,0.0 606.0,0.0 606.0,0.0 c 0.0,0.0 0.0,-562.0 0.0,-562.0 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="250"
- android:propertyName="pathData"
- android:valueFrom="M 366.5,-269.5 c 0.0,0.0 -578.0,2.0 -578.0,2.0 c 0.0,0.0 65.7498321533,68.2501220703 65.7498321533,68.2501220703 c 0.0,0.0 -20.7500457764,20.7500610352 -20.7500457764,20.7500610352 c 0.0,0.0 -65.749786377,-68.2501983643 -65.749786377,-68.2501983643 c 0.0,0.0 -7.25,539.250015259 -7.25,539.250015259 c 0.0,0.0 606.0,0.0 606.0,0.0 c 0.0,0.0 0.0,-562.0 0.0,-562.0 Z"
- android:valueTo="M 366.5,-269.5 c 0.0,0.0 -578.0,2.0 -578.0,2.0 c 0.0,0.0 480.0,480.0 480.0,480.0 c 0.0,0.0 -20.7500915527,20.75 -20.7500915527,20.75 c 0.0,0.0 -479.999908447,-480.000015259 -479.999908447,-480.000015259 c 0.0,0.0 -7.25,539.250015259 -7.25,539.250015259 c 0.0,0.0 606.0,0.0 606.0,0.0 c 0.0,0.0 0.0,-562.0 0.0,-562.0 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_workmode_disable_animation_interpolator_2" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_3_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_3_animation.xml
deleted file mode 100644
index b59c664..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_3_animation.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="133"
- android:propertyName="pathData"
- android:valueFrom="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueTo="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="116"
- android:propertyName="pathData"
- android:valueFrom="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueTo="M -143.0,-65.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,66.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-66.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_3_position_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_3_position_animation.xml
deleted file mode 100644
index 60d2396..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_3_position_animation.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,0.0 c 0.0,4.16667 0.0,20.83333 0.0,25.0"
- android:interpolator="@interpolator/ic_signal_workmode_disable_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_4_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_4_animation.xml
deleted file mode 100644
index ef442e9..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_4_animation.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="33"
- android:propertyName="pathData"
- android:valueFrom="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueTo="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueTo="M -143.0,-65.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,66.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-66.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_4_position_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_4_position_animation.xml
deleted file mode 100644
index 97782be..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_rectangle_path_4_position_animation.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="233"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,0.0 c 0.0,-4.16667 0.0,-20.83333 0.0,-25.0"
- android:interpolator="@interpolator/ic_signal_workmode_disable_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_right_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_right_animation.xml
deleted file mode 100644
index d6054c4..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_right_animation.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyName="scaleX"
- android:valueFrom="1.0"
- android:valueTo="1.8"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_stick_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_stick_animation.xml
deleted file mode 100644
index 573205f..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_stick_animation.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyName="scaleY"
- android:valueFrom="0.0"
- android:valueTo="1.0"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_disable_animation_interpolator_3" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_stickito_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_stickito_animation.xml
deleted file mode 100644
index 4b038b9..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_stickito_animation.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="333"
- android:propertyName="alpha"
- android:valueFrom="1.0"
- android:valueTo="0.54"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_disable_animation_interpolator_4" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_whole_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_whole_animation.xml
deleted file mode 100644
index 562985a8..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_disable_whole_animation.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="83"
- android:propertyName="scaleX"
- android:valueFrom="1.0"
- android:valueTo="1.15667"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_disable_animation_interpolator_5" />
- <objectAnimator
- android:duration="166"
- android:propertyName="scaleX"
- android:valueFrom="1.15667"
- android:valueTo="0.0"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_disable_animation_interpolator_5" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="83"
- android:propertyName="scaleY"
- android:valueFrom="1.0"
- android:valueTo="1.15667"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_disable_animation_interpolator_5" />
- <objectAnimator
- android:duration="166"
- android:propertyName="scaleY"
- android:valueFrom="1.15667"
- android:valueTo="0.0"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_disable_animation_interpolator_5" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_cross_1.xml
deleted file mode 100644
index 6c7e751..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_cross_1.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
- android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_workmode_enable_cross_1_pathdata_interpolator" />
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="333"
- android:propertyName="strokeAlpha"
- android:valueFrom="1"
- android:valueTo="1"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="17"
- android:propertyName="strokeAlpha"
- android:valueFrom="1"
- android:valueTo="0"
- android:interpolator="@android:interpolator/linear" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_ic_signal_briefcase.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_ic_signal_briefcase.xml
deleted file mode 100644
index c699fe2..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_ic_signal_briefcase.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="alpha"
- android:valueFrom="0.5"
- android:valueTo="0.5"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="350"
- android:propertyName="alpha"
- android:valueFrom="0.5"
- android:valueTo="1"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_mask.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_mask.xml
deleted file mode 100644
index 5595e5c..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_mask.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_workmode_enable_mask_pathdata_interpolator" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_left_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_left_animation.xml
deleted file mode 100644
index 4614bfc..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_left_animation.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="83"
- android:propertyName="scaleX"
- android:valueFrom="1.8"
- android:valueTo="1.8"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="250"
- android:propertyName="scaleX"
- android:valueFrom="1.8"
- android:valueTo="1.0"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_mask_1_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_mask_1_animation.xml
deleted file mode 100644
index f5cfcf9..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_mask_1_animation.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="250"
- android:propertyName="pathData"
- android:valueFrom="M 366.5,-269.5 c 0.0,0.0 -578.0,2.0 -578.0,2.0 c 0.0,0.0 480.0,480.0 480.0,480.0 c 0.0,0.0 -20.7500915527,20.75 -20.7500915527,20.75 c 0.0,0.0 -479.999908447,-480.000015259 -479.999908447,-480.000015259 c 0.0,0.0 -7.25,539.250015259 -7.25,539.250015259 c 0.0,0.0 606.0,0.0 606.0,0.0 c 0.0,0.0 0.0,-562.0 0.0,-562.0 Z"
- android:valueTo="M 366.5,-269.5 c 0.0,0.0 -578.0,2.0 -578.0,2.0 c 0.0,0.0 65.7498321533,68.2501220703 65.7498321533,68.2501220703 c 0.0,0.0 -20.7500457764,20.7500610352 -20.7500457764,20.7500610352 c 0.0,0.0 -65.749786377,-68.2501983643 -65.749786377,-68.2501983643 c 0.0,0.0 -7.25,539.250015259 -7.25,539.250015259 c 0.0,0.0 606.0,0.0 606.0,0.0 c 0.0,0.0 0.0,-562.0 0.0,-562.0 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_workmode_enable_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_3_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_3_animation.xml
deleted file mode 100644
index 0b74b3a..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_3_animation.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="83"
- android:propertyName="pathData"
- android:valueFrom="M -143.0,-65.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,66.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-66.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueTo="M -143.0,-65.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,66.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-66.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="133"
- android:propertyName="pathData"
- android:valueFrom="M -143.0,-65.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,66.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-66.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueTo="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_3_position_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_3_position_animation.xml
deleted file mode 100644
index ba10224..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_3_position_animation.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="216"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,25.0 c 0.0,-4.16667 0.0,-20.83333 0.0,-25.0"
- android:interpolator="@interpolator/ic_signal_workmode_enable_animation_interpolator_2" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_4_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_4_animation.xml
deleted file mode 100644
index 395bbf4..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_4_animation.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="100"
- android:propertyName="pathData"
- android:valueFrom="M -143.0,-65.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,66.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-66.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueTo="M -143.0,-65.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,66.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-66.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="199"
- android:propertyName="pathData"
- android:valueFrom="M -143.0,-65.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,66.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-66.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueTo="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_4_position_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_4_position_animation.xml
deleted file mode 100644
index 0115759..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_rectangle_path_4_position_animation.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="300"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:pathData="M 0.0,-25.0 c 0.0,4.16667 0.0,20.83333 0.0,25.0"
- android:interpolator="@interpolator/ic_signal_workmode_enable_animation_interpolator_4" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_right_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_right_animation.xml
deleted file mode 100644
index 4614bfc..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_right_animation.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="83"
- android:propertyName="scaleX"
- android:valueFrom="1.8"
- android:valueTo="1.8"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="250"
- android:propertyName="scaleX"
- android:valueFrom="1.8"
- android:valueTo="1.0"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_stick_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_stick_animation.xml
deleted file mode 100644
index 6b182be..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_stick_animation.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="83"
- android:propertyName="scaleY"
- android:valueFrom="1.0"
- android:valueTo="1.0"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="250"
- android:propertyName="scaleY"
- android:valueFrom="1.0"
- android:valueTo="0.0"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_stickito_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_stickito_animation.xml
deleted file mode 100644
index 828f7a2..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_stickito_animation.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="333"
- android:propertyName="alpha"
- android:valueFrom="0.54"
- android:valueTo="1.0"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_enable_animation_interpolator_3" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_whole_animation.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_whole_animation.xml
deleted file mode 100644
index 89ab580..0000000
--- a/packages/SystemUI/res/anim/ic_signal_workmode_enable_whole_animation.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set
- xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="66"
- android:propertyName="scaleX"
- android:valueFrom="0.0"
- android:valueTo="0.0"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="166"
- android:propertyName="scaleX"
- android:valueFrom="0.0"
- android:valueTo="1.15667"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_enable_animation_interpolator_5" />
- <objectAnimator
- android:duration="83"
- android:propertyName="scaleX"
- android:valueFrom="1.15667"
- android:valueTo="1.0"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_enable_animation_interpolator_0" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="66"
- android:propertyName="scaleY"
- android:valueFrom="0.0"
- android:valueTo="0.0"
- android:valueType="floatType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="166"
- android:propertyName="scaleY"
- android:valueFrom="0.0"
- android:valueTo="1.15667"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_enable_animation_interpolator_5" />
- <objectAnimator
- android:duration="83"
- android:propertyName="scaleY"
- android:valueFrom="1.15667"
- android:valueTo="1.0"
- android:valueType="floatType"
- android:interpolator="@interpolator/ic_signal_workmode_enable_animation_interpolator_0" />
- </set>
-</set>
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off_alpha.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off_alpha.png
deleted file mode 100644
index 0a29157..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off_alpha.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on_alpha.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on_alpha.png
deleted file mode 100644
index 9c1d8ef..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on_alpha.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off_alpha.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off_alpha.png
deleted file mode 100644
index 74df151..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off_alpha.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on_alpha.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on_alpha.png
deleted file mode 100644
index 56add92..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on_alpha.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off_alpha.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off_alpha.png
deleted file mode 100644
index 37d7ac7..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off_alpha.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on_alpha.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on_alpha.png
deleted file mode 100644
index 626e283..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on_alpha.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_brightness_auto_off_alpha.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_brightness_auto_off_alpha.png
deleted file mode 100644
index 2697b5a..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_brightness_auto_off_alpha.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_brightness_auto_on_alpha.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_brightness_auto_on_alpha.png
deleted file mode 100644
index b6443fa..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_brightness_auto_on_alpha.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/ic_qs_brightness_auto_off.xml b/packages/SystemUI/res/drawable/ic_qs_brightness_auto_off.xml
deleted file mode 100644
index aaebc77..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_brightness_auto_off.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2017 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.
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/ic_qs_brightness_auto_off_alpha"
- android:tint="?android:attr/colorControlNormal" />
diff --git a/packages/SystemUI/res/drawable/ic_qs_brightness_auto_on.xml b/packages/SystemUI/res/drawable/ic_qs_brightness_auto_on.xml
deleted file mode 100644
index e17b533..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_brightness_auto_on.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/ic_qs_brightness_auto_on_alpha"
- android:tint="?android:attr/colorControlNormal" />
diff --git a/packages/SystemUI/res/drawable/ic_signal_workmode_disable.xml b/packages/SystemUI/res/drawable/ic_signal_workmode_disable.xml
deleted file mode 100644
index 96d8484..0000000
--- a/packages/SystemUI/res/drawable/ic_signal_workmode_disable.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:name="ic_signal_workmode_disable"
- android:width="42dp"
- android:viewportWidth="42"
- android:height="42dp"
- android:viewportHeight="42" >
- <group
- android:name="suitcase"
- android:translateX="21"
- android:translateY="36.9375"
- android:scaleX="0.1"
- android:scaleY="0.1" >
- <group
- android:name="suitcase_pivot"
- android:translateY="-158" >
- <clip-path
- android:name="mask_1"
- android:pathData="M 366.5,-269.5 c 0.0,0.0 -578.0,2.0 -578.0,2.0 c 0.0,0.0 65.7498321533,68.2501220703 65.7498321533,68.2501220703 c 0.0,0.0 -20.7500457764,20.7500610352 -20.7500457764,20.7500610352 c 0.0,0.0 -65.749786377,-68.2501983643 -65.749786377,-68.2501983643 c 0.0,0.0 -7.25,539.250015259 -7.25,539.250015259 c 0.0,0.0 606.0,0.0 606.0,0.0 c 0.0,0.0 0.0,-562.0 0.0,-562.0 Z" />
- <group
- android:name="whole"
- android:translateX="-1.11523"
- android:translateY="32.0918" >
- <path
- android:name="rectangle_path_1"
- android:strokeColor="#FFFFFFFF"
- android:strokeWidth="65"
- android:pathData="M 0.0,-66.5 l 0.0,0.0 c 36.7269358617,0.0 66.5,29.7730641383 66.5,66.5 l 0.0,0.0 c 0.0,36.7269358617 -29.7730641383,66.5 -66.5,66.5 l 0.0,0.0 c -36.7269358617,0.0 -66.5,-29.7730641383 -66.5,-66.5 l 0.0,0.0 c 0.0,-36.7269358617 29.7730641383,-66.5 66.5,-66.5 Z" />
- </group>
- <group
- android:name="handle"
- android:translateY="-100" >
- <path
- android:name="rectangle_path_2"
- android:strokeColor="#FFFFFFFF"
- android:strokeWidth="35"
- android:pathData="M -34.0,-50.0 l 68.0,0.0 c 8.8365559968,0.0 16.0,7.1634440032 16.0,16.0 l 0.0,68.0 c 0.0,8.8365559968 -7.1634440032,16.0 -16.0,16.0 l -68.0,0.0 c -8.8365559968,0.0 -16.0,-7.1634440032 -16.0,-16.0 l 0.0,-68.0 c 0.0,-8.8365559968 7.1634440032,-16.0 16.0,-16.0 Z" />
- </group>
- <group
- android:name="case"
- android:translateY="32.68518" >
- <group
- android:name="case_pivot"
- android:translateY="-32.68518" >
- <group
- android:name="bottom"
- android:translateY="-97.62964" >
- <group
- android:name="bottom_pivot"
- android:translateY="40" >
- <group
- android:name="rectangle_path_3_position" >
- <path
- android:name="rectangle_path_3"
- android:fillColor="#FFFFFFFF"
- android:pathData="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="top"
- android:translateY="163" >
- <group
- android:name="top_pivot"
- android:translateY="-40" >
- <group
- android:name="rectangle_path_4_position" >
- <path
- android:name="rectangle_path_4"
- android:fillColor="#FFFFFFFF"
- android:pathData="M -143.0,-40.0 l 286.0,0.0 c 17.6731119936,0.0 32.0,14.3268880064 32.0,32.0 l 0.0,16.0 c 0.0,17.6731119936 -14.3268880064,32.0 -32.0,32.0 l -286.0,0.0 c -17.6731119936,0.0 -32.0,-14.3268880064 -32.0,-32.0 l 0.0,-16.0 c 0.0,-17.6731119936 14.3268880064,-32.0 32.0,-32.0 Z" />
- </group>
- </group>
- </group>
- <group
- android:name="left"
- android:translateX="-175.00635"
- android:translateY="30" >
- <group
- android:name="left_pivot"
- android:translateX="50.00635" >
- <path
- android:name="rectangle_path_5"
- android:fillColor="#FFFFFFFF"
- android:pathData="M -50.0,-88.0 l 100.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,176.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -100.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-176.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- <group
- android:name="right"
- android:translateX="174.97778"
- android:translateY="30" >
- <group
- android:name="right_pivot"
- android:translateX="-49.97778" >
- <path
- android:name="rectangle_path_6"
- android:fillColor="#FFFFFFFF"
- android:pathData="M -50.0,-88.0 l 100.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,176.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -100.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-176.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- </group>
- <group
- android:name="stick"
- android:translateX="-166.59082"
- android:translateY="-156.51367"
- android:scaleY="0"
- android:rotation="-45" >
- <group
- android:name="stick_pivot"
- android:translateX="0.18161"
- android:translateY="243.8158" >
- <path
- android:name="stickito"
- android:fillColor="#FFFFFFFF"
- android:pathData="M -16.5,-243.999885 l 33.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,487.99977 c 0.0,0.0 0.0,0.0 0.0,0.0 l -33.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-487.99977 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
- </group>
- </group>
- </group>
- </group>
-</vector>
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_0.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_0.xml
deleted file mode 100644
index 5009c6b..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_0.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 l 0.144628099174,0.0 l 0.855371900826,1.0 L 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_1.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_1.xml
deleted file mode 100644
index 678b90b..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_1.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 l 0.534759358289,0.0 l 0.465240641711,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_2.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_2.xml
deleted file mode 100644
index 6c6df60..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_2.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 c 0.313385868073,0.330828523695 0.125984191895,0.661170632677 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_3.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_3.xml
deleted file mode 100644
index b1eec48..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_3.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 c 0.4,0.0 0.2,0.2 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_4.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_4.xml
deleted file mode 100644
index 17ff65a..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_4.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 c 0.4,0.4 0.2,0.2 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_5.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_5.xml
deleted file mode 100644
index aee48dc..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_animation_interpolator_5.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 c 0.33333333,0.0 0.66666667,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_cross_1_pathdata_interpolator.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_cross_1_pathdata_interpolator.xml
deleted file mode 100644
index 66cfaff..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_cross_1_pathdata_interpolator.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0,0 c 0.166666667,0 0.2,1 1,1" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_0.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_0.xml
deleted file mode 100644
index 4a5fde9..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_0.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 c 0.33333333,0.0 0.83333333333,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_1.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_1.xml
deleted file mode 100644
index 0f35e5d..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_1.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 c 0.714960628748,0.0 0.678740215302,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_2.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_2.xml
deleted file mode 100644
index 626f9ef..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_2.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 l 0.392038600724,0.0 l 0.607961399276,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_3.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_3.xml
deleted file mode 100644
index 17ff65a..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_3.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 c 0.4,0.4 0.2,0.2 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_4.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_4.xml
deleted file mode 100644
index 96bdb48..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_4.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 l 0.337078651685,0.0 l 0.662921348315,1.0 L 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_5.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_5.xml
deleted file mode 100644
index a91610d..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_animation_interpolator_5.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<pathInterpolator
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0.0,0.0 c 0.16666666667,0.0 0.66666667,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_cross_1_pathdata_interpolator.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_cross_1_pathdata_interpolator.xml
deleted file mode 100644
index a0118d70..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_cross_1_pathdata_interpolator.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0,0 c 0.8,0 0.833333333,1 1,1" />
diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_mask_pathdata_interpolator.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_mask_pathdata_interpolator.xml
deleted file mode 100644
index 1820bab..0000000
--- a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_mask_pathdata_interpolator.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0,0 c 0.8,0 0.6,1 1,1" />
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index 2efae71..2867224 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -22,16 +22,6 @@
android:paddingRight="16dp"
style="@style/BrightnessDialogContainer">
- <ImageView
- android:id="@+id/brightness_icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginEnd="8dp"
- android:src="@drawable/ic_qs_brightness_auto_off"
- android:contentDescription="@null"
- android:visibility="gone" />
-
<com.android.systemui.settings.ToggleSliderView
android:id="@+id/brightness_slider"
android:layout_width="0dp"
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index baa2055..039eca6 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -37,7 +37,13 @@
<dimen name="navigation_handle_radius">1dp</dimen>
<dimen name="navigation_handle_bottom">6dp</dimen>
<dimen name="navigation_handle_horizontal_margin">30dp</dimen>
- <dimen name="navigation_home_handle_width">280dp</dimen>
+ <dimen name="navigation_handle_sample_horizontal_margin">10dp</dimen>
+ <dimen name="navigation_home_handle_width">72dp</dimen>
+
+ <!-- Luminance threshold to determine black/white contrast for the navigation affordances -->
+ <item name="navigation_luminance_threshold" type="dimen" format="float">0.5</item>
+ <!-- Luminance change threshold that allows applying new value if difference was exceeded -->
+ <item name="navigation_luminance_change_threshold" type="dimen" format="float">0.05</item>
<!-- Height of notification icons in the status bar -->
<dimen name="status_bar_icon_size">@*android:dimen/status_bar_icon_size</dimen>
diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
index ace086f..3fc6689 100644
--- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
@@ -204,24 +204,59 @@
}
/**
- * Does the app-op item refer to a user sensitive permission. Only user sensitive permission
- * should be shown to the user by default.
+ * Does the app-op code refer to a user sensitive permission for the specified user id
+ * and package. Only user sensitive permission should be shown to the user by default.
*
- * @param item The item
+ * @param appOpCode The code of the app-op.
+ * @param uid The uid of the user.
+ * @param packageName The name of the package.
*
* @return {@code true} iff the app-op item is user sensitive
*/
- private boolean isUserSensitive(AppOpItem item) {
- String permission = AppOpsManager.opToPermission(item.getCode());
+ private boolean isUserSensitive(int appOpCode, int uid, String packageName) {
+ String permission = AppOpsManager.opToPermission(appOpCode);
if (permission == null) {
return false;
}
int permFlags = mContext.getPackageManager().getPermissionFlags(permission,
- item.getPackageName(), UserHandle.getUserHandleForUid(item.getUid()));
+ packageName, UserHandle.getUserHandleForUid(uid));
return (permFlags & PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED) != 0;
}
/**
+ * Does the app-op item refer to an operation that should be shown to the user.
+ * Only specficic ops (like SYSTEM_ALERT_WINDOW) or ops that refer to user sensitive
+ * permission should be shown to the user by default.
+ *
+ * @param item The item
+ *
+ * @return {@code true} iff the app-op item should be shown to the user
+ */
+ private boolean isUserVisible(AppOpItem item) {
+ return isUserVisible(item.getCode(), item.getUid(), item.getPackageName());
+ }
+
+
+ /**
+ * Does the app-op, uid and package name, refer to an operation that should be shown to the
+ * user. Only specficic ops (like {@link AppOpsManager.OP_SYSTEM_ALERT_WINDOW}) or
+ * ops that refer to user sensitive permission should be shown to the user by default.
+ *
+ * @param item The item
+ *
+ * @return {@code true} iff the app-op for should be shown to the user
+ */
+ private boolean isUserVisible(int appOpCode, int uid, String packageName) {
+ // currently OP_SYSTEM_ALERT_WINDOW does not correspond to a platform permission
+ // which may be user senstive, so for now always show it to the user.
+ if (appOpCode == AppOpsManager.OP_SYSTEM_ALERT_WINDOW) {
+ return true;
+ }
+
+ return isUserSensitive(appOpCode, uid, packageName);
+ }
+
+ /**
* Returns a copy of the list containing all the active AppOps that the controller tracks.
*
* @return List of active AppOps information
@@ -245,7 +280,7 @@
for (int i = 0; i < numActiveItems; i++) {
AppOpItem item = mActiveItems.get(i);
if ((userId == UserHandle.USER_ALL || UserHandle.getUserId(item.getUid()) == userId)
- && isUserSensitive(item)) {
+ && isUserVisible(item)) {
list.add(item);
}
}
@@ -255,7 +290,7 @@
for (int i = 0; i < numNotedItems; i++) {
AppOpItem item = mNotedItems.get(i);
if ((userId == UserHandle.USER_ALL || UserHandle.getUserId(item.getUid()) == userId)
- && isUserSensitive(item)) {
+ && isUserVisible(item)) {
list.add(item);
}
}
@@ -281,7 +316,8 @@
}
private void notifySuscribers(int code, int uid, String packageName, boolean active) {
- if (mCallbacksByCode.containsKey(code)) {
+ if (mCallbacksByCode.containsKey(code)
+ && isUserVisible(code, uid, packageName)) {
for (Callback cb: mCallbacksByCode.get(code)) {
cb.onActiveStateChanged(code, uid, packageName, active);
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java
index 1154515..98f446d 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java
@@ -18,8 +18,6 @@
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Path;
import android.graphics.Point;
import android.graphics.Rect;
import android.util.AttributeSet;
@@ -36,11 +34,9 @@
private int mIconSize;
private Rect mTempBounds = new Rect();
private Point mTempPoint = new Point();
- private Path mClipPath = new Path();
private float mDotScale = 0f;
private int mUpdateDotColor;
- private int mBubbleDefaultBgColor;
private boolean mShowUpdateDot;
private boolean mOnLeft;
@@ -59,32 +55,17 @@
public BadgedImageView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- setScaleType(ScaleType.CENTER_CROP);
mIconSize = getResources().getDimensionPixelSize(R.dimen.individual_bubble_size);
mDotRenderer = new BadgeRenderer(mIconSize);
TypedArray ta = context.obtainStyledAttributes(
new int[] {android.R.attr.colorBackgroundFloating});
- mBubbleDefaultBgColor = ta.getColor(0, Color.WHITE);
ta.recycle();
}
- // TODO: Clipping oval path isn't great: rerender image into a separate, rounded bitmap and
- // then draw would be better
@Override
public void onDraw(Canvas canvas) {
- canvas.save();
- // Circle crop
- mClipPath.addOval(getPaddingStart(), getPaddingTop(),
- getWidth() - getPaddingEnd(), getHeight() - getPaddingBottom(), Path.Direction.CW);
- canvas.clipPath(mClipPath);
- canvas.drawColor(mBubbleDefaultBgColor);
super.onDraw(canvas);
-
- // After we've circle cropped what we're showing, restore so we don't clip the badge
- canvas.restore();
-
- // Draw the badge
if (mShowUpdateDot) {
getDrawingRect(mTempBounds);
mTempPoint.set((getWidth() - mIconSize) / 2, getPaddingTop());
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
index 0e691fb..e84c648 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
@@ -26,6 +26,7 @@
import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.annotation.Nullable;
+import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityTaskManager;
import android.app.IActivityTaskManager;
@@ -64,6 +65,7 @@
import com.android.systemui.statusbar.policy.ConfigurationController;
import java.lang.annotation.Retention;
+import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -340,6 +342,9 @@
// It's new
mStackView.addBubble(notif);
}
+ if (shouldAutoExpand(notif)) {
+ mStackView.setExpandedBubble(notif);
+ }
updateVisibility();
}
@@ -379,9 +384,11 @@
}
if (shouldAutoBubbleForFlags(mContext, entry) || shouldBubble(entry)) {
// TODO: handle group summaries
- // It's a new notif, it shows in the shade and as a bubble
entry.setIsBubble(true);
- entry.setShowInShadeWhenBubble(true);
+ boolean suppressNotification = entry.getBubbleMetadata() != null
+ && entry.getBubbleMetadata().getSuppressInitialNotification()
+ && isForegroundApp(entry.notification.getPackageName());
+ entry.setShowInShadeWhenBubble(!suppressNotification);
}
}
@@ -522,6 +529,23 @@
|| autoBubbleAll;
}
+ private boolean shouldAutoExpand(NotificationEntry entry) {
+ Notification.BubbleMetadata metadata = entry.getBubbleMetadata();
+ return metadata != null && metadata.getAutoExpandBubble()
+ && isForegroundApp(entry.notification.getPackageName());
+ }
+
+ /**
+ * Return true if the applications with the package name is running in foreground.
+ *
+ * @param pkgName application package name.
+ */
+ private boolean isForegroundApp(String pkgName) {
+ ActivityManager am = mContext.getSystemService(ActivityManager.class);
+ List<RunningTaskInfo> tasks = am.getRunningTasks(1 /* maxNum */);
+ return !tasks.isEmpty() && pkgName.equals(tasks.get(0).topActivity.getPackageName());
+ }
+
/**
* This task stack listener is responsible for responding to tasks moved to the front
* which are on the default (main) display. When this happens, expanded bubbles must be
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
index ec6ea55..559c9f6 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
@@ -413,7 +413,7 @@
((TextView) mPermissionView.findViewById(R.id.pkgname)).setText(mAppName);
((TextView) mPermissionView.findViewById(R.id.prompt)).setText(
getResources().getString(R.string.bubbles_prompt, mAppName));
- logBubbleClickEvent(mEntry.notification,
+ logBubbleClickEvent(mEntry,
StatsLog.BUBBLE_UICHANGED__ACTION__PERMISSION_DIALOG_SHOWN);
}
}
@@ -509,7 +509,7 @@
mStackView.collapseStack(() -> {
try {
n.contentIntent.send();
- logBubbleClickEvent(mEntry.notification,
+ logBubbleClickEvent(mEntry,
StatsLog.BUBBLE_UICHANGED__ACTION__HEADER_GO_TO_APP);
} catch (PendingIntent.CanceledException e) {
Log.w(TAG, "Failed to send intent for bubble with key: "
@@ -521,7 +521,7 @@
mEntry.notification.getUid());
mStackView.collapseStack(() -> {
mContext.startActivity(intent);
- logBubbleClickEvent(mEntry.notification,
+ logBubbleClickEvent(mEntry,
StatsLog.BUBBLE_UICHANGED__ACTION__HEADER_GO_TO_SETTINGS);
});
} else if (id == R.id.no_bubbles_button) {
@@ -544,7 +544,7 @@
mOnBubbleBlockedListener.onBubbleBlocked(mEntry);
}
mStackView.onExpandedHeightChanged();
- logBubbleClickEvent(mEntry.notification,
+ logBubbleClickEvent(mEntry,
allowed ? StatsLog.BUBBLE_UICHANGED__ACTION__PERMISSION_OPT_IN :
StatsLog.BUBBLE_UICHANGED__ACTION__PERMISSION_OPT_OUT);
} catch (RemoteException e) {
@@ -707,10 +707,11 @@
/**
* Logs bubble UI click event.
*
- * @param notification the bubble notification that user is interacting with.
+ * @param entry the bubble notification entry that user is interacting with.
* @param action the user interaction enum.
*/
- private void logBubbleClickEvent(StatusBarNotification notification, int action) {
+ private void logBubbleClickEvent(NotificationEntry entry, int action) {
+ StatusBarNotification notification = entry.notification;
StatsLog.write(StatsLog.BUBBLE_UI_CHANGED,
notification.getPackageName(),
notification.getNotification().getChannelId(),
@@ -719,7 +720,8 @@
mStackView.getBubbleCount(),
action,
mStackView.getNormalizedXPosition(),
- mStackView.getNormalizedYPosition());
+ mStackView.getNormalizedYPosition(),
+ entry.showInShadeWhenBubble());
}
private int getDimenForPackageUser(int resId, String pkg, int userId) {
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
index b92b982..617090a 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
@@ -135,7 +135,7 @@
private BubbleExpandedView.OnBubbleBlockedListener mBlockedListener;
private boolean mViewUpdatedRequested = false;
- private boolean mIsAnimating = false;
+ private boolean mIsExpansionAnimating = false;
private LayoutInflater mInflater;
@@ -233,6 +233,11 @@
new SpringForce()
.setStiffness(SpringForce.STIFFNESS_LOW)
.setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY));
+ mExpandedViewYAnim.addEndListener((anim, cancelled, value, velocity) -> {
+ if (mIsExpanded && mExpandedBubble != null) {
+ mExpandedBubble.expandedView.updateView();
+ }
+ });
setClipChildren(false);
setFocusable(true);
@@ -241,7 +246,7 @@
setOnApplyWindowInsetsListener((View view, WindowInsets insets) -> {
final int keyboardHeight = insets.getSystemWindowInsetBottom()
- insets.getStableInsetBottom();
- if (!mIsExpanded) {
+ if (!mIsExpanded || mIsExpansionAnimating) {
return view.onApplyWindowInsets(insets);
}
mImeVisible = keyboardHeight != 0;
@@ -620,24 +625,23 @@
updateExpandedBubble();
applyCurrentState();
- mIsAnimating = true;
+ mIsExpansionAnimating = true;
Runnable updateAfter = () -> {
applyCurrentState();
- mIsAnimating = false;
+ mIsExpansionAnimating = false;
requestUpdate();
};
if (shouldExpand) {
mBubbleContainer.setController(mExpandedAnimationController);
mExpandedAnimationController.expandFromStack(
- /* collapseTo */
- mStackAnimationController.getStackPositionAlongNearestHorizontalEdge(),
- /* after */
+ mStackAnimationController.getStackPositionAlongNearestHorizontalEdge()
+ /* collapseTo */,
() -> {
updatePointerPosition();
updateAfter.run();
- });
+ } /* after */);
} else {
mBubbleContainer.cancelAllAnimations();
mExpandedAnimationController.collapseBackToStack(
@@ -702,7 +706,7 @@
/** Called with the coordinates to which an individual bubble has been dragged. */
public void onBubbleDragged(View bubble, float x, float y) {
- if (!mIsExpanded || mIsAnimating) {
+ if (!mIsExpanded || mIsExpansionAnimating) {
return;
}
@@ -712,7 +716,7 @@
/** Called when a drag operation on an individual bubble has finished. */
public void onBubbleDragFinish(
View bubble, float x, float y, float velX, float velY, boolean dismissed) {
- if (!mIsExpanded || mIsAnimating) {
+ if (!mIsExpanded || mIsExpansionAnimating) {
return;
}
@@ -724,7 +728,7 @@
}
void onDragStart() {
- if (mIsExpanded || mIsAnimating) {
+ if (mIsExpanded || mIsExpansionAnimating) {
return;
}
@@ -733,7 +737,7 @@
}
void onDragged(float x, float y) {
- if (mIsExpanded || mIsAnimating) {
+ if (mIsExpanded || mIsExpansionAnimating) {
return;
}
@@ -743,7 +747,7 @@
void onDragFinish(float x, float y, float velX, float velY) {
// TODO: Add fling to bottom to dismiss.
- if (mIsExpanded || mIsAnimating) {
+ if (mIsExpanded || mIsExpansionAnimating) {
return;
}
@@ -832,7 +836,7 @@
}
private void requestUpdate() {
- if (mViewUpdatedRequested || mIsAnimating) {
+ if (mViewUpdatedRequested || mIsExpansionAnimating) {
return;
}
mViewUpdatedRequested = true;
@@ -862,11 +866,12 @@
if (!mExpandedViewYAnim.isRunning()) {
// We're not animating so set the value
mExpandedViewContainer.setTranslationY(y);
+ mExpandedBubble.expandedView.updateView();
} else {
- // We are animating so update the value
+ // We are animating so update the value; there is an end listener on the animator
+ // that will ensure expandedeView.updateView gets called.
mExpandedViewYAnim.animateToFinalPosition(y);
}
- mExpandedBubble.expandedView.updateView();
}
int bubbsCount = mBubbleContainer.getChildCount();
@@ -957,7 +962,8 @@
getBubbleCount(),
action,
getNormalizedXPosition(),
- getNormalizedYPosition());
+ getNormalizedYPosition(),
+ false /* unread notification */);
} else {
StatusBarNotification notification = bubble.entry.notification;
StatsLog.write(StatsLog.BUBBLE_UI_CHANGED,
@@ -968,7 +974,8 @@
getBubbleCount(),
action,
getNormalizedXPosition(),
- getNormalizedYPosition());
+ getNormalizedYPosition(),
+ bubble.entry.showInShadeWhenBubble());
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java
index 979d226..3b9164d 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java
@@ -20,11 +20,11 @@
import android.app.Notification;
import android.content.Context;
import android.graphics.Color;
+import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.graphics.drawable.InsetDrawable;
-import android.graphics.drawable.LayerDrawable;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import android.widget.TextView;
@@ -41,6 +41,9 @@
public class BubbleView extends FrameLayout {
private static final String TAG = "BubbleView";
+ private static final int DARK_ICON_ALPHA = 180;
+ private static final double ICON_MIN_CONTRAST = 4.1;
+ private static final int DEFAULT_BACKGROUND_COLOR = Color.LTGRAY;
// Same value as Launcher3 badge code
private static final float WHITE_SCRIM_ALPHA = 0.54f;
private Context mContext;
@@ -205,12 +208,7 @@
}
Drawable iconDrawable = ic.loadDrawable(mContext);
if (needsTint) {
- // Center icon on coloured background
- iconDrawable.setTint(Color.WHITE); // TODO: dark mode
- Drawable bg = new ColorDrawable(n.color);
- InsetDrawable d = new InsetDrawable(iconDrawable, mIconInset);
- Drawable[] layers = {bg, d};
- mBadgedImageView.setImageDrawable(new LayerDrawable(layers));
+ mBadgedImageView.setImageDrawable(buildIconWithTint(iconDrawable, n.color));
} else {
mBadgedImageView.setImageDrawable(iconDrawable);
}
@@ -219,6 +217,23 @@
animateDot(mEntry.showInShadeWhenBubble() /* showDot */);
}
+ private Drawable buildIconWithTint(Drawable iconDrawable, int backgroundColor) {
+ backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 255 /* alpha */);
+ if (backgroundColor == Color.TRANSPARENT) {
+ // ColorUtils throws exception when background is translucent.
+ backgroundColor = DEFAULT_BACKGROUND_COLOR;
+ }
+ iconDrawable.setTint(Color.WHITE);
+ double contrastRatio = ColorUtils.calculateContrast(Color.WHITE, backgroundColor);
+ if (contrastRatio < ICON_MIN_CONTRAST) {
+ int dark = ColorUtils.setAlphaComponent(Color.BLACK, DARK_ICON_ALPHA);
+ iconDrawable.setTint(dark);
+ }
+ InsetDrawable foreground = new InsetDrawable(iconDrawable, mIconInset);
+ ColorDrawable background = new ColorDrawable(backgroundColor);
+ return new AdaptiveIconDrawable(background, foreground);
+ }
+
private int determineDominateColor(Drawable d, int defaultTint) {
// XXX: should we pull from the drawable, app icon, notif tint?
return ColorUtils.blendARGB(defaultTint, Color.WHITE, WHITE_SCRIM_ALPHA);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index b93f8d04..d6e0306 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -118,7 +118,6 @@
updateResources();
mBrightnessController = new BrightnessController(getContext(),
- findViewById(R.id.brightness_icon),
findViewById(R.id.brightness_slider));
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index 608f646..8ed5424 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -113,6 +113,7 @@
public void saveSpecs(QSTileHost host) {
List<String> newSpecs = new ArrayList<>();
+ clearAccessibilityState();
for (int i = 1; i < mTiles.size() && mTiles.get(i) != null; i++) {
newSpecs.add(mTiles.get(i).spec);
}
@@ -120,6 +121,17 @@
mCurrentSpecs = newSpecs;
}
+ private void clearAccessibilityState() {
+ if (mAccessibilityAction == ACTION_ADD) {
+ // Remove blank tile from last spot
+ mTiles.remove(--mEditIndex);
+ // Update the tile divider position
+ mTileDividerIndex--;
+ notifyDataSetChanged();
+ }
+ mAccessibilityAction = ACTION_NONE;
+ }
+
public void resetTileSpecs(QSTileHost host, List<String> specs) {
// Notify the host so the tiles get removed callbacks.
host.changeTiles(mCurrentSpecs, specs);
@@ -333,8 +345,6 @@
// Remove the placeholder.
mTiles.remove(mEditIndex--);
notifyItemRemoved(mEditIndex);
- // Don't remove items when the last position is selected.
- if (position == mEditIndex - 1) position--;
}
mAccessibilityAction = ACTION_NONE;
move(mAccessibilityFromIndex, position, v);
@@ -372,6 +382,8 @@
mAccessibilityAction = ACTION_ADD;
// Add placeholder for last slot.
mTiles.add(mEditIndex++, null);
+ // Update the tile divider position
+ mTileDividerIndex++;
mNeedsFocus = true;
notifyDataSetChanged();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index db79e4d7..38962eb 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -45,7 +45,6 @@
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.phone.SystemUIDialog;
-import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
@@ -62,15 +61,13 @@
private final CellSignalCallback mSignalCallback = new CellSignalCallback();
private final ActivityStarter mActivityStarter;
- private final KeyguardMonitor mKeyguardMonitor;
@Inject
public CellularTile(QSHost host, NetworkController networkController,
- ActivityStarter activityStarter, KeyguardMonitor keyguardMonitor) {
+ ActivityStarter activityStarter) {
super(host);
mController = networkController;
mActivityStarter = activityStarter;
- mKeyguardMonitor = keyguardMonitor;
mDataController = mController.getMobileDataController();
mDetailAdapter = new CellularDetailAdapter();
mController.observe(getLifecycle(), mSignalCallback);
@@ -106,11 +103,7 @@
return;
}
if (mDataController.isMobileDataEnabled()) {
- if (mKeyguardMonitor.isSecure() && !mKeyguardMonitor.canSkipBouncer()) {
- mActivityStarter.postQSRunnableDismissingKeyguard(this::maybeShowDisableDialog);
- } else {
- mUiHandler.post(this::maybeShowDisableDialog);
- }
+ maybeShowDisableDialog();
} else {
mDataController.setMobileDataEnabled(true);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
index f921eb9..7853dc3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
@@ -33,7 +33,7 @@
/** Quick settings tile: Work profile on/off */
public class WorkModeTile extends QSTileImpl<BooleanState> implements
ManagedProfileController.Callback {
- private final Icon mIcon = ResourceIcon.get(R.drawable.ic_signal_workmode_disable);
+ private final Icon mIcon = ResourceIcon.get(R.drawable.stat_sys_managed_profile_status);
private final ManagedProfileController mProfileController;
diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
index 79228b9..1e0a9f1 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
@@ -39,7 +39,6 @@
import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
import android.util.Log;
-import android.widget.ImageView;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -50,11 +49,8 @@
public class BrightnessController implements ToggleSlider.Listener {
private static final String TAG = "StatusBar.BrightnessController";
- private static final boolean SHOW_AUTOMATIC_ICON = false;
-
private static final int SLIDER_ANIMATION_DURATION = 3000;
- private static final int MSG_UPDATE_ICON = 0;
private static final int MSG_UPDATE_SLIDER = 1;
private static final int MSG_SET_CHECKED = 2;
private static final int MSG_ATTACH_LISTENER = 3;
@@ -69,7 +65,6 @@
private final int mDefaultBacklightForVr;
private final Context mContext;
- private final ImageView mIcon;
private final ToggleSlider mControl;
private final boolean mAutomaticAvailable;
private final DisplayManager mDisplayManager;
@@ -193,10 +188,8 @@
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
UserHandle.USER_CURRENT);
mAutomatic = automatic != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
- mHandler.obtainMessage(MSG_UPDATE_ICON, mAutomatic ? 1 : 0).sendToTarget();
} else {
mHandler.obtainMessage(MSG_SET_CHECKED, 0).sendToTarget();
- mHandler.obtainMessage(MSG_UPDATE_ICON, 0 /* automatic */).sendToTarget();
}
}
};
@@ -237,9 +230,6 @@
mExternalChange = true;
try {
switch (msg.what) {
- case MSG_UPDATE_ICON:
- updateIcon(msg.arg1 != 0);
- break;
case MSG_UPDATE_SLIDER:
updateSlider(msg.arg1, msg.arg2 != 0);
break;
@@ -264,9 +254,8 @@
}
};
- public BrightnessController(Context context, ImageView icon, ToggleSlider control) {
+ public BrightnessController(Context context, ToggleSlider control) {
mContext = context;
- mIcon = icon;
mControl = control;
mControl.setMax(GAMMA_SPACE_MAX);
mBackgroundHandler = new Handler((Looper) Dependency.get(Dependency.BG_LOOPER));
@@ -347,7 +336,6 @@
@Override
public void onChanged(ToggleSlider toggleSlider, boolean tracking, boolean automatic,
int value, boolean stopTracking) {
- updateIcon(mAutomatic);
if (mExternalChange) return;
if (mSliderAnimator != null) {
@@ -416,18 +404,6 @@
mDisplayManager.setTemporaryBrightness(brightness);
}
- private void setBrightnessAdj(float adj) {
- mDisplayManager.setTemporaryAutoBrightnessAdjustment(adj);
- }
-
- private void updateIcon(boolean automatic) {
- if (mIcon != null) {
- mIcon.setImageResource(automatic && SHOW_AUTOMATIC_ICON ?
- com.android.systemui.R.drawable.ic_qs_brightness_auto_on :
- com.android.systemui.R.drawable.ic_qs_brightness_auto_off);
- }
- }
-
private void updateVrMode(boolean isEnabled) {
if (mIsVrModeEnabled != isEnabled) {
mIsVrModeEnabled = isEnabled;
diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java
index 0374a01..d8b4df5 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java
@@ -24,7 +24,6 @@
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
-import android.widget.ImageView;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -49,9 +48,8 @@
R.layout.quick_settings_brightness_dialog, null);
setContentView(v);
- final ImageView icon = findViewById(R.id.brightness_icon);
final ToggleSliderView slider = findViewById(R.id.brightness_slider);
- mBrightnessController = new BrightnessController(this, icon, slider);
+ mBrightnessController = new BrightnessController(this, slider);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavBarTintController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavBarTintController.java
index 9cfb1aa..bf5b60a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavBarTintController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavBarTintController.java
@@ -19,11 +19,14 @@
import static android.view.Display.DEFAULT_DISPLAY;
import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler;
import android.view.CompositionSamplingListener;
import android.view.View;
+import com.android.systemui.R;
import com.android.systemui.shared.system.QuickStepContract;
import java.io.PrintWriter;
@@ -37,9 +40,6 @@
public static final int MIN_COLOR_ADAPT_TRANSITION_TIME = 400;
public static final int DEFAULT_COLOR_ADAPT_TRANSITION_TIME = 1700;
- // Passing the threshold of this luminance value will make the button black otherwise white
- private static final float LUMINANCE_THRESHOLD = 0.3f;
-
private final Handler mHandler = new Handler();
private final NavigationBarView mNavigationBarView;
private final LightBarTransitionsController mLightBarController;
@@ -50,9 +50,17 @@
private boolean mSamplingEnabled = false;
private boolean mSamplingListenerRegistered = false;
- private float mLastMediaLuma;
+ private float mLastMedianLuma;
+ private float mCurrentMedianLuma;
private boolean mUpdateOnNextDraw;
+ private final int mNavBarHeight;
+ private final int mNavColorSampleMargin;
+
+ // Passing the threshold of this luminance value will make the button black otherwise white
+ private final float mLuminanceThreshold;
+ private final float mLuminanceChangeThreshold;
+
public NavBarTintController(NavigationBarView navigationBarView,
LightBarTransitionsController lightBarController) {
mSamplingListener = new CompositionSamplingListener(
@@ -66,6 +74,13 @@
mNavigationBarView.addOnAttachStateChangeListener(this);
mNavigationBarView.addOnLayoutChangeListener(this);
mLightBarController = lightBarController;
+
+ final Resources res = navigationBarView.getResources();
+ mNavBarHeight = res.getDimensionPixelSize(R.dimen.navigation_bar_height);
+ mNavColorSampleMargin =
+ res.getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
+ mLuminanceThreshold = res.getFloat(R.dimen.navigation_luminance_threshold);
+ mLuminanceChangeThreshold = res.getFloat(R.dimen.navigation_luminance_change_threshold);
}
void onDraw() {
@@ -109,8 +124,11 @@
if (view != null) {
int[] pos = new int[2];
view.getLocationOnScreen(pos);
- final Rect samplingBounds = new Rect(pos[0], pos[1],
- pos[0] + view.getWidth(), pos[1] + view.getHeight());
+ Point displaySize = new Point();
+ view.getContext().getDisplay().getRealSize(displaySize);
+ final Rect samplingBounds = new Rect(pos[0] - mNavColorSampleMargin,
+ displaySize.y - mNavBarHeight, pos[0] + view.getWidth() + mNavColorSampleMargin,
+ displaySize.y);
if (!samplingBounds.equals(mSamplingBounds)) {
mSamplingBounds.set(samplingBounds);
requestUpdateSamplingListener();
@@ -144,13 +162,19 @@
}
private void updateTint(float medianLuma) {
- mLastMediaLuma = medianLuma;
- if (medianLuma > LUMINANCE_THRESHOLD) {
- // Black
- mLightBarController.setIconsDark(true /* dark */, true /* animate */);
- } else {
- // White
- mLightBarController.setIconsDark(false /* dark */, true /* animate */);
+ mLastMedianLuma = medianLuma;
+
+ // If the difference between the new luma and the current luma is larger than threshold
+ // then apply the current luma, this is to prevent small changes causing colors to flicker
+ if (Math.abs(mCurrentMedianLuma - mLastMedianLuma) > mLuminanceChangeThreshold) {
+ if (medianLuma > mLuminanceThreshold) {
+ // Black
+ mLightBarController.setIconsDark(true /* dark */, true /* animate */);
+ } else {
+ // White
+ mLightBarController.setIconsDark(false /* dark */, true /* animate */);
+ }
+ mCurrentMedianLuma = medianLuma;
}
}
@@ -162,7 +186,8 @@
: "false"));
pw.println(" mSamplingListenerRegistered: " + mSamplingListenerRegistered);
pw.println(" mSamplingBounds: " + mSamplingBounds);
- pw.println(" mLastMediaLuma: " + mLastMediaLuma);
+ pw.println(" mLastMedianLuma: " + mLastMedianLuma);
+ pw.println(" mCurrentMedianLuma: " + mCurrentMedianLuma);
}
public static boolean isEnabled(Context context) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java
index 968074c..81a425c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java
@@ -68,7 +68,7 @@
int height = mRadius * 2;
int width = getWidth();
int y = (navHeight - mBottom - height);
- canvas.drawRoundRect(mRadius, y, width - mRadius, y + height, mRadius, mRadius, mPaint);
+ canvas.drawRoundRect(0, y, width, y + height, mRadius, mRadius, mPaint);
}
@Override
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 fca07dc..02bad73 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -3081,7 +3081,7 @@
private static float getCommonTop(View view) {
float y = view.getTop();
ViewGroup parent = (ViewGroup) view.getParent();
- while (!(parent instanceof StatusBarWindowView)) {
+ while (!(parent instanceof StatusBarWindowView) && parent != null) {
y += parent.getY();
parent = (ViewGroup) parent.getParent();
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index bd7824d..e5f709a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -95,6 +95,7 @@
import com.android.systemui.plugins.VolumeDialogController.State;
import com.android.systemui.plugins.VolumeDialogController.StreamState;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
+import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import java.io.PrintWriter;
@@ -108,7 +109,8 @@
*
* Methods ending in "H" must be called on the (ui) handler.
*/
-public class VolumeDialogImpl implements VolumeDialog {
+public class VolumeDialogImpl implements VolumeDialog,
+ ConfigurationController.ConfigurationListener {
private static final String TAG = Util.logTag(VolumeDialogImpl.class);
private static final long USER_ATTEMPT_GRACE_PERIOD = 1000;
@@ -175,6 +177,11 @@
Prefs.getBoolean(context, Prefs.Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, false);
}
+ @Override
+ public void onUiModeChanged() {
+ mContext.getTheme().applyStyle(mContext.getThemeResId(), true);
+ }
+
public void init(int windowType, Callback callback) {
initDialog();
@@ -182,12 +189,15 @@
mController.addCallback(mControllerCallbackH, mHandler);
mController.getState();
+
+ Dependency.get(ConfigurationController.class).addCallback(this);
}
@Override
public void destroy() {
mController.removeCallback(mControllerCallbackH);
mHandler.removeCallbacksAndMessages(null);
+ Dependency.get(ConfigurationController.class).removeCallback(this);
}
private void initDialog() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
index c9b550c..14bc71b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
@@ -16,6 +16,8 @@
package com.android.systemui.bubbles;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -26,8 +28,13 @@
import static org.mockito.Mockito.when;
import android.app.IActivityManager;
+import android.app.Notification;
import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.drawable.Icon;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.WindowManager;
@@ -36,6 +43,7 @@
import androidx.test.filters.SmallTest;
import com.android.internal.statusbar.NotificationVisibility;
+import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
@@ -55,11 +63,17 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
public class BubbleControllerTest extends SysuiTestCase {
+ // Some APIs rely on the app being foreground, check is via pkg name
+ private static final String FOREGROUND_TEST_PKG_NAME = "com.android.systemui.tests";
+
@Mock
private NotificationEntryManager mNotificationEntryManager;
@Mock
@@ -83,6 +97,8 @@
private ExpandableNotificationRow mRow;
private ExpandableNotificationRow mRow2;
private ExpandableNotificationRow mNoChannelRow;
+ private ExpandableNotificationRow mAutoExpandRow;
+ private ExpandableNotificationRow mSuppressNotifRow;
@Mock
private NotificationData mNotificationData;
@@ -104,7 +120,6 @@
mStatusBarView = new FrameLayout(mContext);
mDependency.injectTestDependency(NotificationEntryManager.class, mNotificationEntryManager);
-
// Bubbles get added to status bar window view
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,
mActivityManager, mDozeParameters);
@@ -116,6 +131,18 @@
mRow2 = mNotificationTestHelper.createBubble(mDeleteIntent);
mNoChannelRow = mNotificationTestHelper.createBubble(mDeleteIntent);
+ // Some bubbles want to auto expand
+ Notification.BubbleMetadata autoExpandMetadata =
+ getBuilder().setAutoExpandBubble(true).build();
+ mAutoExpandRow = mNotificationTestHelper.createBubble(autoExpandMetadata,
+ FOREGROUND_TEST_PKG_NAME);
+
+ // Some bubbles want to suppress notifs
+ Notification.BubbleMetadata suppressNotifMetadata =
+ getBuilder().setSuppressInitialNotification(true).build();
+ mSuppressNotifRow = mNotificationTestHelper.createBubble(suppressNotifMetadata,
+ FOREGROUND_TEST_PKG_NAME);
+
// Return non-null notification data from the NEM
when(mNotificationEntryManager.getNotificationData()).thenReturn(mNotificationData);
when(mNotificationData.getChannel(mRow.getEntry().key)).thenReturn(mRow.getEntry().channel);
@@ -303,6 +330,114 @@
}
@Test
+ public void testAutoExpand_FailsNotForeground() {
+ assertFalse(mBubbleController.isStackExpanded());
+
+ // Add the auto expand bubble
+ mEntryListener.onPendingEntryAdded(mAutoExpandRow.getEntry());
+ mBubbleController.updateBubble(mAutoExpandRow.getEntry(), true /* updatePosition */);
+
+ // Expansion shouldn't change
+ verify(mBubbleExpandListener, never()).onBubbleExpandChanged(false /* expanded */,
+ mAutoExpandRow.getEntry().key);
+ assertFalse(mBubbleController.isStackExpanded());
+
+ // # of bubbles should change
+ verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */);
+ }
+
+ @Test
+ public void testAutoExpand_SucceedsForeground() {
+ final CountDownLatch latch = new CountDownLatch(1);
+ BroadcastReceiver receiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ latch.countDown();
+ }
+ };
+ IntentFilter filter = new IntentFilter(BubblesTestActivity.BUBBLE_ACTIVITY_OPENED);
+ mContext.registerReceiver(receiver, filter);
+
+ assertFalse(mBubbleController.isStackExpanded());
+
+ // Make ourselves foreground
+ Intent i = new Intent(mContext, BubblesTestActivity.class);
+ i.setFlags(FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(i);
+
+ try {
+ latch.await(100, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ // Add the auto expand bubble
+ mEntryListener.onPendingEntryAdded(mAutoExpandRow.getEntry());
+ mBubbleController.updateBubble(mAutoExpandRow.getEntry(), true /* updatePosition */);
+
+ // Expansion should change
+ verify(mBubbleExpandListener).onBubbleExpandChanged(true /* expanded */,
+ mAutoExpandRow.getEntry().key);
+ assertTrue(mBubbleController.isStackExpanded());
+
+ // # of bubbles should change
+ verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */);
+ mContext.unregisterReceiver(receiver);
+ }
+
+ @Test
+ public void testSuppressNotif_FailsNotForeground() {
+ // Add the suppress notif bubble
+ mEntryListener.onPendingEntryAdded(mSuppressNotifRow.getEntry());
+ mBubbleController.updateBubble(mSuppressNotifRow.getEntry(), true /* updatePosition */);
+
+ // Should be a bubble & should show in shade because we weren't forground
+ assertTrue(mSuppressNotifRow.getEntry().isBubble());
+ assertTrue(mSuppressNotifRow.getEntry().showInShadeWhenBubble());
+
+ // # of bubbles should change
+ verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */);
+ }
+
+ @Test
+ public void testSuppressNotif_SucceedsForeground() {
+ final CountDownLatch latch = new CountDownLatch(1);
+ BroadcastReceiver receiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ latch.countDown();
+ }
+ };
+ IntentFilter filter = new IntentFilter(BubblesTestActivity.BUBBLE_ACTIVITY_OPENED);
+ mContext.registerReceiver(receiver, filter);
+
+ assertFalse(mBubbleController.isStackExpanded());
+
+ // Make ourselves foreground
+ Intent i = new Intent(mContext, BubblesTestActivity.class);
+ i.setFlags(FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(i);
+
+ try {
+ latch.await(100, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ // Add the suppress notif bubble
+ mEntryListener.onPendingEntryAdded(mSuppressNotifRow.getEntry());
+ mBubbleController.updateBubble(mSuppressNotifRow.getEntry(), true /* updatePosition */);
+
+ // Should be a bubble & should NOT show in shade because we were foreground
+ assertTrue(mSuppressNotifRow.getEntry().isBubble());
+ assertFalse(mSuppressNotifRow.getEntry().showInShadeWhenBubble());
+
+ // # of bubbles should change
+ verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */);
+ mContext.unregisterReceiver(receiver);
+ }
+
+ @Test
public void testMarkNewNotificationAsBubble() {
mEntryListener.onPendingEntryAdded(mRow.getEntry());
assertTrue(mRow.getEntry().isBubble());
@@ -349,4 +484,15 @@
return entry.notification.getNotification().getBubbleMetadata() != null;
}
}
+
+ /**
+ * @return basic {@link android.app.Notification.BubbleMetadata.Builder}
+ */
+ private Notification.BubbleMetadata.Builder getBuilder() {
+ Intent target = new Intent(mContext, BubblesTestActivity.class);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, 0);
+ return new Notification.BubbleMetadata.Builder()
+ .setIntent(bubbleIntent)
+ .setIcon(Icon.createWithResource(mContext, R.drawable.android));
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubblesTestActivity.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubblesTestActivity.java
index ea472da..43d2ad1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubblesTestActivity.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubblesTestActivity.java
@@ -17,6 +17,7 @@
package com.android.systemui.bubbles;
import android.app.Activity;
+import android.content.Intent;
import android.os.Bundle;
import com.android.systemui.R;
@@ -26,9 +27,15 @@
*/
public class BubblesTestActivity extends Activity {
+ public static final String BUBBLE_ACTIVITY_OPENED =
+ "com.android.systemui.bubbles.BUBBLE_ACTIVITY_OPENED";
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
+
+ Intent i = new Intent(BUBBLE_ACTIVITY_OPENED);
+ sendBroadcast(i);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
index 1bcf880..8c5f6f2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
@@ -151,24 +151,41 @@
/**
* Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
- */
- public ExpandableNotificationRow createBubble() throws Exception {
- return createBubble(null);
- }
-
- /**
- * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
*
* @param deleteIntent the intent to assign to {@link BubbleMetadata#deleteIntent}
*/
public ExpandableNotificationRow createBubble(@Nullable PendingIntent deleteIntent)
throws Exception {
Notification n = createNotification(false /* isGroupSummary */,
- null /* groupKey */, true /* isBubble */, deleteIntent);
+ null /* groupKey */, makeBubbleMetadata(deleteIntent));
return generateRow(n, PKG, UID, USER_HANDLE, 0 /* extraInflationFlags */, IMPORTANCE_HIGH);
}
/**
+ * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
+ *
+ * @param bubbleMetadata the {@link BubbleMetadata} to use
+ */
+ public ExpandableNotificationRow createBubble(BubbleMetadata bubbleMetadata)
+ throws Exception {
+ Notification n = createNotification(false /* isGroupSummary */,
+ null /* groupKey */, bubbleMetadata);
+ return generateRow(n, PKG, UID, USER_HANDLE, 0 /* extraInflationFlags */, IMPORTANCE_HIGH);
+ }
+
+ /**
+ * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
+ *
+ * @param bubbleMetadata the {@link BubbleMetadata} to use
+ */
+ public ExpandableNotificationRow createBubble(BubbleMetadata bubbleMetadata, String pkg)
+ throws Exception {
+ Notification n = createNotification(false /* isGroupSummary */,
+ null /* groupKey */, bubbleMetadata);
+ return generateRow(n, pkg, UID, USER_HANDLE, 0 /* extraInflationFlags */, IMPORTANCE_HIGH);
+ }
+
+ /**
* Creates a notification row with the given details.
*
* @param pkg package used for creating a {@link StatusBarNotification}
@@ -207,8 +224,7 @@
* @return a notification that is in the group specified or standalone if unspecified
*/
private Notification createNotification(boolean isGroupSummary, @Nullable String groupKey) {
- return createNotification(isGroupSummary, groupKey, false /* isBubble */,
- null /* bubbleDeleteIntent */);
+ return createNotification(isGroupSummary, groupKey, null /* bubble metadata */);
}
/**
@@ -216,12 +232,11 @@
*
* @param isGroupSummary whether the notification is a group summary
* @param groupKey the group key for the notification group used across notifications
- * @param isBubble whether this notification should bubble
+ * @param bubbleMetadata the bubble metadata to use for this notification if it exists.
* @return a notification that is in the group specified or standalone if unspecified
*/
private Notification createNotification(boolean isGroupSummary,
- @Nullable String groupKey, boolean isBubble,
- @Nullable PendingIntent bubbleDeleteIntent) {
+ @Nullable String groupKey, @Nullable BubbleMetadata bubbleMetadata) {
Notification publicVersion = new Notification.Builder(mContext).setSmallIcon(
R.drawable.ic_person)
.setCustomContentView(new RemoteViews(mContext.getPackageName(),
@@ -239,9 +254,8 @@
if (!TextUtils.isEmpty(groupKey)) {
notificationBuilder.setGroup(groupKey);
}
- if (isBubble) {
- BubbleMetadata metadata = makeBubbleMetadata(bubbleDeleteIntent);
- notificationBuilder.setBubbleMetadata(metadata);
+ if (bubbleMetadata != null) {
+ notificationBuilder.setBubbleMetadata(bubbleMetadata);
}
return notificationBuilder.build();
}
diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_empty_recents.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_empty_recents.xml
deleted file mode 100644
index 7e363f6..0000000
--- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_empty_recents.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2019 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:fillColor="#000000"
- android:pathData="M17,18V6c0-1.1-0.9-2-2-2H9C7.9,4,7,4.9,7,6v12c0,1.1,0.9,2,2,2h6C16.1,20,17,19.1,17,18z M8.5,18V6 c0-0.28,0.22-0.5,0.5-0.5h6c0.28,0,0.5,0.22,0.5,0.5v12c0,0.28-0.22,0.5-0.5,0.5H9C8.72,18.5,8.5,18.28,8.5,18z" />
- <path
- android:fillColor="#000000"
- android:pathData="M21,7h-2c-0.55,0-1,0.45-1,1v8c0,0.55,0.45,1,1,1h2c0.55,0,1-0.45,1-1V8C22,7.45,21.55,7,21,7z M20.5,15.5h-1v-7h1V15.5z" />
- <path
- android:fillColor="#000000"
- android:pathData="M5,17c0.55,0,1-0.45,1-1V8c0-0.55-0.45-1-1-1H3C2.45,7,2,7.45,2,8v8c0,0.55,0.45,1,1,1H5z M3.5,8.5h1v7h-1V8.5z" />
-</vector>
\ No newline at end of file
diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_empty_recents.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_empty_recents.xml
deleted file mode 100644
index 1d4c8d7..0000000
--- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_empty_recents.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2019 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:fillColor="#000000"
- android:pathData="M17,18V6c0-1.1-0.9-2-2-2H9C7.9,4,7,4.9,7,6v12c0,1.1,0.9,2,2,2h6C16.1,20,17,19.1,17,18z M8.5,18V6 c0-0.28,0.22-0.5,0.5-0.5h6c0.28,0,0.5,0.22,0.5,0.5v12c0,0.28-0.22,0.5-0.5,0.5H9C8.72,18.5,8.5,18.28,8.5,18z" />
- <path
- android:fillColor="#000000"
- android:pathData="M21,17c0.55,0,1-0.45,1-1V8c0-0.55-0.45-1-1-1h-2c-0.55,0-1,0.45-1,1v8c0,0.55,0.45,1,1,1H21z M19.5,8.5h1v7h-1V8.5z" />
- <path
- android:fillColor="#000000"
- android:pathData="M5,7H3C2.45,7,2,7.45,2,8v8c0,0.55,0.45,1,1,1h2c0.55,0,1-0.45,1-1V8C6,7.45,5.55,7,5,7z M4.5,15.5h-1v-7h1V15.5z" />
-</vector>
\ No newline at end of file
diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_empty_recents.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_empty_recents.xml
deleted file mode 100644
index 76f8831..0000000
--- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_empty_recents.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2019 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:fillColor="#000000"
- android:pathData="M3,6h2c0.55,0,1,0.45,1,1v9c0,0.55-0.45,1-1,1H3c-0.55,0-1-0.45-1-1V7C2,6.45,2.45,6,3,6z" />
- <path
- android:fillColor="#000000"
- android:pathData="M8,19h8c0.55,0,1-0.45,1-1V5c0-0.55-0.45-1-1-1H8C7.45,4,7,4.45,7,5v13C7,18.55,7.45,19,8,19z" />
- <path
- android:fillColor="#000000"
- android:pathData="M19,6h2c0.55,0,1,0.45,1,1v9c0,0.55-0.45,1-1,1h-2c-0.55,0-1-0.45-1-1V7C18,6.45,18.45,6,19,6z" />
-</vector>
\ No newline at end of file
diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto
index f629cf6..f52b94f 100644
--- a/proto/src/metrics_constants/metrics_constants.proto
+++ b/proto/src/metrics_constants/metrics_constants.proto
@@ -7156,6 +7156,8 @@
// Settings > app > bubble settings
APP_BUBBLE_SETTINGS = 1700;
+ // OPEN: Settings > System > Aware > Info dialog
+ DIALOG_AWARE_STATUS = 1701;
// ---- End Q Constants, all Q constants go above this line ----
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index d3cd48a..fe540bf 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -1149,6 +1149,7 @@
mRemoteAugmentedAutofillService.destroy();
mRemoteAugmentedAutofillService = null;
mRemoteAugmentedAutofillServiceInfo = null;
+ resetAugmentedAutofillWhitelistLocked();
}
final boolean available = isAugmentedAutofillServiceAvailableLocked();
@@ -1180,6 +1181,7 @@
*
* @return whether caller UID is the augmented autofill service for the user
*/
+ @GuardedBy("mLock")
boolean setAugmentedAutofillWhitelistLocked(List<String> packages,
List<ComponentName> activities, int callingUid) {
@@ -1267,10 +1269,20 @@
Slog.v(TAG, "whitelisting packages: " + packages + "and activities: " + components);
}
mAugmentedWhitelistHelper.setWhitelist(packages, components);
- mRemoteAugmentedAutofillService = getRemoteAugmentedAutofillServiceLocked();
}
}
+ /**
+ * Resets the augmented autofill whitelist.
+ */
+ @GuardedBy("mLock")
+ void resetAugmentedAutofillWhitelistLocked() {
+ if (mMaster.verbose) {
+ Slog.v(TAG, "resetting augmented autofill whitelist");
+ }
+ whitelistForAugmentedAutofillPackages(null, null);
+ }
+
private void sendStateToClients(boolean resetClient) {
final RemoteCallbackList<IAutoFillManagerClient> clients;
final int userClientCount;
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
index d909736..f0c6f7e 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
@@ -126,6 +126,7 @@
if (mMaster.debug) Slog.d(TAG, "updateRemoteService(): destroying old remote service");
mRemoteService.destroy();
mRemoteService = null;
+ resetContentCaptureWhitelistLocked();
}
// Updates the component name
@@ -551,6 +552,17 @@
return null;
}
+ /**
+ * Resets the content capture whitelist.
+ */
+ @GuardedBy("mLock")
+ private void resetContentCaptureWhitelistLocked() {
+ if (mMaster.verbose) {
+ Slog.v(TAG, "resetting content capture whitelist");
+ }
+ mWhitelistHelper.setWhitelist((List) null, null);
+ }
+
private final class ContentCaptureServiceRemoteCallback extends
IContentCaptureServiceCallback.Stub {
@@ -567,7 +579,6 @@
synchronized (mLock) {
mWhitelistHelper.setWhitelist(packages, activities);
}
- // TODO(b/119613670): log metrics
}
@Override
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 259aa50..c154240 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -21,6 +21,7 @@
":gsiservice_aidl",
"java/com/android/server/EventLogTags.logtags",
"java/com/android/server/am/EventLogTags.logtags",
+ "java/com/android/server/policy/EventLogTags.logtags",
],
libs: [
diff --git a/services/core/java/com/android/server/DropBoxManagerService.java b/services/core/java/com/android/server/DropBoxManagerService.java
index b393d87..f0f8adbb 100644
--- a/services/core/java/com/android/server/DropBoxManagerService.java
+++ b/services/core/java/com/android/server/DropBoxManagerService.java
@@ -231,6 +231,8 @@
final String tag = entry.getTag();
try {
int flags = entry.getFlags();
+ Slog.i(TAG, "add tag=" + tag + " isTagEnabled=" + isTagEnabled(tag)
+ + " flags=0x" + Integer.toHexString(flags));
if ((flags & DropBoxManager.IS_EMPTY) != 0) throw new IllegalArgumentException();
init();
@@ -285,7 +287,8 @@
long len = temp.length();
if (len > max) {
- Slog.w(TAG, "Dropping: " + tag + " (" + temp.length() + " > " + max + " bytes)");
+ Slog.w(TAG, "Dropping: " + tag + " (" + temp.length() + " > "
+ + max + " bytes)");
temp.delete();
temp = null; // Pass temp = null to createEntry() to leave a tombstone
break;
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index f0244c3..2ded1e5 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -200,8 +200,8 @@
private GnssMeasurementCorrectionsProvider mGnssMeasurementCorrectionsProvider;
private GnssNavigationMessageProvider mGnssNavigationMessageProvider;
@GuardedBy("mLock")
- private String mLocationControllerExtraPackage;
- private boolean mLocationControllerExtraPackageEnabled;
+ private String mExtraLocationControllerPackage;
+ private boolean mExtraLocationControllerPackageEnabled;
private IGpsGeofenceHardware mGpsGeofenceProxy;
// list of currently active providers
@@ -3045,35 +3045,35 @@
}
@Override
- public void setLocationControllerExtraPackage(String packageName) {
+ public void setExtraLocationControllerPackage(String packageName) {
mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
Manifest.permission.LOCATION_HARDWARE + " permission required");
synchronized (mLock) {
- mLocationControllerExtraPackage = packageName;
+ mExtraLocationControllerPackage = packageName;
}
}
@Override
- public String getLocationControllerExtraPackage() {
+ public String getExtraLocationControllerPackage() {
synchronized (mLock) {
- return mLocationControllerExtraPackage;
+ return mExtraLocationControllerPackage;
}
}
@Override
- public void setLocationControllerExtraPackageEnabled(boolean enabled) {
+ public void setExtraLocationControllerPackageEnabled(boolean enabled) {
mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
Manifest.permission.LOCATION_HARDWARE + " permission required");
synchronized (mLock) {
- mLocationControllerExtraPackageEnabled = enabled;
+ mExtraLocationControllerPackageEnabled = enabled;
}
}
@Override
- public boolean isLocationControllerExtraPackageEnabled() {
+ public boolean isExtraLocationControllerPackageEnabled() {
synchronized (mLock) {
- return mLocationControllerExtraPackageEnabled
- && (mLocationControllerExtraPackage != null);
+ return mExtraLocationControllerPackageEnabled
+ && (mExtraLocationControllerPackage != null);
}
}
@@ -3610,9 +3610,9 @@
pw.println(" mBlacklist=null");
}
- if (mLocationControllerExtraPackage != null) {
- pw.println(" Location controller extra package: " + mLocationControllerExtraPackage
- + " enabled: " + mLocationControllerExtraPackageEnabled);
+ if (mExtraLocationControllerPackage != null) {
+ pw.println(" Location controller extra package: " + mExtraLocationControllerPackage
+ + " enabled: " + mExtraLocationControllerPackageEnabled);
}
if (!mBackgroundThrottlePackageWhitelist.isEmpty()) {
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 5b9c1f8..1a842f7 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -17,10 +17,14 @@
package com.android.server;
import static android.Manifest.permission.INSTALL_PACKAGES;
+import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
+import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_MEDIA_STORAGE;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.OP_LEGACY_STORAGE;
+import static android.app.AppOpsManager.OP_READ_EXTERNAL_STORAGE;
import static android.app.AppOpsManager.OP_REQUEST_INSTALL_PACKAGES;
+import static android.app.AppOpsManager.OP_WRITE_EXTERNAL_STORAGE;
import static android.content.pm.PackageManager.FLAG_PERMISSION_HIDDEN;
import static android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
@@ -280,6 +284,7 @@
private static final boolean EMULATE_FBE_SUPPORTED = true;
private static final String TAG = "StorageManagerService";
+ private static final boolean LOCAL_LOGV = Log.isLoggable(TAG, Log.VERBOSE);
private static final String TAG_STORAGE_BENCHMARK = "storage_benchmark";
private static final String TAG_STORAGE_TRIM = "storage_trim";
@@ -3863,44 +3868,57 @@
}
private int getMountMode(int uid, String packageName) {
+ final int mode = getMountModeInternal(uid, packageName);
+ if (LOCAL_LOGV) {
+ Slog.v(TAG, "Resolved mode " + mode + " for " + packageName + "/"
+ + UserHandle.formatUid(uid));
+ }
+ return mode;
+ }
+
+ private int getMountModeInternal(int uid, String packageName) {
try {
+ // Get some easy cases out of the way first
if (Process.isIsolated(uid)) {
return Zygote.MOUNT_EXTERNAL_NONE;
}
- if (mIPackageManager.checkUidPermission(WRITE_MEDIA_STORAGE, uid)
- == PERMISSION_GRANTED) {
- return Zygote.MOUNT_EXTERNAL_FULL;
- } else if (mIAppOpsService.checkOperation(OP_LEGACY_STORAGE, uid,
- packageName) == MODE_ALLOWED) {
- return Zygote.MOUNT_EXTERNAL_LEGACY;
- } else if (mIPackageManager.checkUidPermission(INSTALL_PACKAGES, uid)
- == PERMISSION_GRANTED || mIAppOpsService.checkOperation(
- OP_REQUEST_INSTALL_PACKAGES, uid, packageName) == MODE_ALLOWED) {
- return Zygote.MOUNT_EXTERNAL_INSTALLER;
- } else if (mPmInternal.isInstantApp(packageName, UserHandle.getUserId(uid))) {
+ if (mPmInternal.isInstantApp(packageName, UserHandle.getUserId(uid))) {
return Zygote.MOUNT_EXTERNAL_NONE;
+ }
+
+ // Determine if caller is holding runtime permission
+ final boolean hasRead = StorageManager.checkPermissionAndAppOp(mContext, false, 0,
+ uid, packageName, READ_EXTERNAL_STORAGE, OP_READ_EXTERNAL_STORAGE);
+ final boolean hasWrite = StorageManager.checkPermissionAndAppOp(mContext, false, 0,
+ uid, packageName, WRITE_EXTERNAL_STORAGE, OP_WRITE_EXTERNAL_STORAGE);
+ final boolean hasStorage = hasRead || hasWrite;
+
+ // We're only willing to give out broad access if they also hold
+ // runtime permission; this is a firm CDD requirement
+ final boolean hasFull = mIPackageManager.checkUidPermission(WRITE_MEDIA_STORAGE,
+ uid) == PERMISSION_GRANTED;
+ if (hasFull && hasStorage) {
+ return Zygote.MOUNT_EXTERNAL_FULL;
+ }
+
+ // We're only willing to give out installer access if they also hold
+ // runtime permission; this is a firm CDD requirement
+ final boolean hasInstall = mIPackageManager.checkUidPermission(INSTALL_PACKAGES,
+ uid) == PERMISSION_GRANTED;
+ final boolean hasInstallOp = mIAppOpsService.checkOperation(OP_REQUEST_INSTALL_PACKAGES,
+ uid, packageName) == MODE_ALLOWED;
+ if ((hasInstall || hasInstallOp) && hasStorage) {
+ return Zygote.MOUNT_EXTERNAL_INSTALLER;
+ }
+
+ // Otherwise we're willing to give out sandboxed or non-sandboxed if
+ // they hold the runtime permission
+ final boolean hasLegacy = mIAppOpsService.checkOperation(OP_LEGACY_STORAGE,
+ uid, packageName) == MODE_ALLOWED;
+ final boolean hasGreylist = isLegacyGreylisted(packageName);
+ if ((hasLegacy || hasGreylist) && hasStorage) {
+ return Zygote.MOUNT_EXTERNAL_LEGACY;
} else {
- if (ENABLE_LEGACY_GREYLIST) {
- // STOPSHIP: remove this temporary workaround once developers
- // fix bugs where they're opening _data paths in native code
- switch (packageName) {
- case "com.facebook.katana": // b/123996076
- case "jp.naver.line.android": // b/124767356
- case "com.mxtech.videoplayer.ad": // b/124531483
- case "com.whatsapp": // b/124766614
- case "com.maxmpz.audioplayer": // b/127886230
- case "com.estrongs.android.pop": // b/127926473
- case "com.roidapp.photogrid": // b/128269119
- case "com.cleanmaster.mguard": // b/128384413
- case "com.skype.raider": // b/128487044
- case "org.telegram.messenger": // b/128652960
- case "com.jrtstudio.AnotherMusicPlayer": // b/129084562
- case "ak.alizandro.smartaudiobookplayer": // b/129084042
- case "com.campmobile.snow": // b/128803870
- case "com.qnap.qfile": // b/126374406
- return Zygote.MOUNT_EXTERNAL_LEGACY;
- }
- }
return Zygote.MOUNT_EXTERNAL_WRITE;
}
} catch (RemoteException e) {
@@ -3909,6 +3927,32 @@
return Zygote.MOUNT_EXTERNAL_NONE;
}
+ private boolean isLegacyGreylisted(String packageName) {
+ // TODO: decide legacy defaults at install time based on signals
+ if (ENABLE_LEGACY_GREYLIST) {
+ // STOPSHIP: remove this temporary workaround once developers
+ // fix bugs where they're opening _data paths in native code
+ switch (packageName) {
+ case "com.facebook.katana": // b/123996076
+ case "jp.naver.line.android": // b/124767356
+ case "com.mxtech.videoplayer.ad": // b/124531483
+ case "com.whatsapp": // b/124766614
+ case "com.maxmpz.audioplayer": // b/127886230
+ case "com.estrongs.android.pop": // b/127926473
+ case "com.roidapp.photogrid": // b/128269119
+ case "com.cleanmaster.mguard": // b/128384413
+ case "com.skype.raider": // b/128487044
+ case "org.telegram.messenger": // b/128652960
+ case "com.jrtstudio.AnotherMusicPlayer": // b/129084562
+ case "ak.alizandro.smartaudiobookplayer": // b/129084042
+ case "com.campmobile.snow": // b/128803870
+ case "com.qnap.qfile": // b/126374406
+ return true;
+ }
+ }
+ return false;
+ }
+
private static class Callbacks extends Handler {
private static final int MSG_STORAGE_STATE_CHANGED = 1;
private static final int MSG_VOLUME_STATE_CHANGED = 2;
diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING
index 1870f8d..5522396 100644
--- a/services/core/java/com/android/server/TEST_MAPPING
+++ b/services/core/java/com/android/server/TEST_MAPPING
@@ -5,6 +5,9 @@
"file_patterns": ["AlarmManagerService\\.java"],
"options": [
{
+ "include-filter": "com.android.server."
+ },
+ {
"include-annotation": "android.platform.test.annotations.Presubmit"
},
{
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 1878d00..cef245b 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -1478,7 +1478,6 @@
if (sr.isForeground || sr.fgRequired) {
anyForeground = true;
fgServiceTypes |= sr.foregroundServiceType;
- break;
}
}
mAm.updateProcessForegroundLocked(proc, anyForeground, fgServiceTypes, oomAdj);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a1f2ac6..73393ed 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -271,6 +271,7 @@
import android.os.WorkSource;
import android.os.storage.IStorageManager;
import android.os.storage.StorageManager;
+import android.provider.DeviceConfig;
import android.provider.Settings;
import android.sysprop.VoldProperties;
import android.text.TextUtils;
@@ -1266,6 +1267,7 @@
String mMemWatchDumpFile;
int mMemWatchDumpPid;
int mMemWatchDumpUid;
+ private boolean mMemWatchIsUserInitiated;
String mTrackAllocationApp = null;
String mNativeDebuggingApp = null;
@@ -1712,9 +1714,14 @@
final int uid;
final long memLimit;
final String reportPackage;
+ final boolean isUserInitiated;
synchronized (ActivityManagerService.this) {
- procName = mMemWatchDumpProcName;
uid = mMemWatchDumpUid;
+ if (uid == SYSTEM_UID) {
+ procName = mContext.getString(R.string.android_system_label);
+ } else {
+ procName = mMemWatchDumpProcName;
+ }
Pair<Long, String> val = mMemWatchProcesses.get(procName, uid);
if (val == null) {
val = mMemWatchProcesses.get(procName, 0);
@@ -1726,6 +1733,7 @@
memLimit = 0;
reportPackage = null;
}
+ isUserInitiated = mMemWatchIsUserInitiated;
}
if (procName == null) {
return;
@@ -1739,8 +1747,9 @@
return;
}
- String text = mContext.getString(R.string.dump_heap_notification, procName);
-
+ final int titleId = isUserInitiated
+ ? R.string.dump_heap_ready_notification : R.string.dump_heap_notification;
+ String text = mContext.getString(titleId, procName);
Intent deleteIntent = new Intent();
deleteIntent.setAction(DumpHeapActivity.ACTION_DELETE_DUMPHEAP);
@@ -1748,6 +1757,8 @@
intent.setClassName("android", DumpHeapActivity.class.getName());
intent.putExtra(DumpHeapActivity.KEY_PROCESS, procName);
intent.putExtra(DumpHeapActivity.KEY_SIZE, memLimit);
+ intent.putExtra(DumpHeapActivity.KEY_IS_USER_INITIATED, isUserInitiated);
+ intent.putExtra(DumpHeapActivity.KEY_IS_SYSTEM_PROCESS, uid == SYSTEM_UID);
if (reportPackage != null) {
intent.putExtra(DumpHeapActivity.KEY_DIRECT_LAUNCH, reportPackage);
}
@@ -1755,8 +1766,6 @@
Notification notification =
new Notification.Builder(mContext, SystemNotificationChannels.DEVELOPER)
.setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
- .setWhen(0)
- .setOngoing(true)
.setAutoCancel(true)
.setTicker(text)
.setColor(mContext.getColor(
@@ -2143,7 +2152,8 @@
* Encapsulates global settings related to hidden API enforcement behaviour, including tracking
* the latest value via a content observer.
*/
- static class HiddenApiSettings extends ContentObserver {
+ static class HiddenApiSettings extends ContentObserver
+ implements DeviceConfig.OnPropertiesChangedListener {
private final Context mContext;
private boolean mBlacklistDisabled;
@@ -2153,6 +2163,45 @@
private int mStatslogSampleRate = -1;
@HiddenApiEnforcementPolicy private int mPolicy = HIDDEN_API_ENFORCEMENT_DEFAULT;
+ /**
+ * Sampling rate for hidden API access event logs with libmetricslogger, as an integer in
+ * the range 0 to 0x10000 inclusive.
+ *
+ * @hide
+ */
+ public static final String HIDDEN_API_ACCESS_LOG_SAMPLING_RATE =
+ "hidden_api_access_log_sampling_rate";
+
+ /**
+ * Sampling rate for hidden API access event logging with statslog, as an integer in the
+ * range 0 to 0x10000 inclusive.
+ *
+ * @hide
+ */
+ public static final String HIDDEN_API_ACCESS_STATSLOG_SAMPLING_RATE =
+ "hidden_api_access_statslog_sampling_rate";
+
+ public void onPropertiesChanged(DeviceConfig.Properties properties) {
+ int logSampleRate = properties.getInt(HIDDEN_API_ACCESS_LOG_SAMPLING_RATE, 0x0);
+ if (logSampleRate < 0 || logSampleRate > 0x10000) {
+ logSampleRate = -1;
+ }
+ if (logSampleRate != -1 && logSampleRate != mLogSampleRate) {
+ mLogSampleRate = logSampleRate;
+ ZYGOTE_PROCESS.setHiddenApiAccessLogSampleRate(mLogSampleRate);
+ }
+
+ int statslogSampleRate =
+ properties.getInt(HIDDEN_API_ACCESS_STATSLOG_SAMPLING_RATE, 0);
+ if (statslogSampleRate < 0 || statslogSampleRate > 0x10000) {
+ statslogSampleRate = -1;
+ }
+ if (statslogSampleRate != -1 && statslogSampleRate != mStatslogSampleRate) {
+ mStatslogSampleRate = statslogSampleRate;
+ ZYGOTE_PROCESS.setHiddenApiAccessStatslogSampleRate(mStatslogSampleRate);
+ }
+ }
+
public HiddenApiSettings(Handler handler, Context context) {
super(handler);
mContext = context;
@@ -2164,18 +2213,11 @@
false,
this);
mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.HIDDEN_API_ACCESS_LOG_SAMPLING_RATE),
- false,
- this);
- mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(
- Settings.Global.HIDDEN_API_ACCESS_STATSLOG_SAMPLING_RATE),
- false,
- this);
- mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.HIDDEN_API_POLICY),
false,
this);
+ DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_APP_COMPAT,
+ mContext.getMainExecutor(), this);
update();
}
@@ -2199,24 +2241,6 @@
mExemptions = Collections.emptyList();
}
}
- int logSampleRate = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.HIDDEN_API_ACCESS_LOG_SAMPLING_RATE, 0x200);
- if (logSampleRate < 0 || logSampleRate > 0x10000) {
- logSampleRate = -1;
- }
- if (logSampleRate != -1 && logSampleRate != mLogSampleRate) {
- mLogSampleRate = logSampleRate;
- ZYGOTE_PROCESS.setHiddenApiAccessLogSampleRate(mLogSampleRate);
- }
- int statslogSampleRate = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.HIDDEN_API_ACCESS_STATSLOG_SAMPLING_RATE, 0);
- if (statslogSampleRate < 0 || statslogSampleRate > 0x10000) {
- statslogSampleRate = -1;
- }
- if (statslogSampleRate != -1 && statslogSampleRate != mStatslogSampleRate) {
- mStatslogSampleRate = statslogSampleRate;
- ZYGOTE_PROCESS.setHiddenApiAccessStatslogSampleRate(mStatslogSampleRate);
- }
mPolicy = getValidEnforcementPolicy(Settings.Global.HIDDEN_API_POLICY);
}
@@ -5066,11 +5090,9 @@
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (intent.getBooleanExtra(DumpHeapActivity.EXTRA_DELAY_DELETE, false)) {
- mHandler.sendEmptyMessageDelayed(POST_DUMP_HEAP_NOTIFICATION_MSG, 5*60*1000);
- } else {
- mHandler.sendEmptyMessage(POST_DUMP_HEAP_NOTIFICATION_MSG);
- }
+ final long delay = intent.getBooleanExtra(
+ DumpHeapActivity.EXTRA_DELAY_DELETE, false) ? 5 * 60 * 1000 : 0;
+ mHandler.sendEmptyMessageDelayed(DELETE_DUMPHEAP_MSG, delay);
}
}, dumpheapFilter);
@@ -7940,6 +7962,30 @@
}
}
+ @Override
+ public void requestSystemServerHeapDump() {
+ if (!Build.IS_DEBUGGABLE) {
+ Slog.wtf(TAG, "requestSystemServerHeapDump called on a user build");
+ return;
+ }
+ if (Binder.getCallingUid() != SYSTEM_UID) {
+ // This also intentionally excludes secondary profiles from calling this.
+ throw new SecurityException(
+ "Only the system process is allowed to request a system heap dump");
+ }
+ ProcessRecord pr;
+ synchronized (mPidsSelfLocked) {
+ pr = mPidsSelfLocked.get(myPid());
+ }
+ if (pr == null) {
+ Slog.w(TAG, "system process not in mPidsSelfLocked: " + myPid());
+ return;
+ }
+ synchronized (this) {
+ startHeapDumpLocked(pr, true);
+ }
+ }
+
/**
* @deprecated This method is only used by a few internal components and it will soon be
* replaced by a proper bug report API (which will be restricted to a few, pre-defined apps).
@@ -10524,8 +10570,9 @@
}
pw.print(" mMemWatchDumpProcName="); pw.println(mMemWatchDumpProcName);
pw.print(" mMemWatchDumpFile="); pw.println(mMemWatchDumpFile);
- pw.print(" mMemWatchDumpPid="); pw.print(mMemWatchDumpPid);
- pw.print(" mMemWatchDumpUid="); pw.println(mMemWatchDumpUid);
+ pw.print(" mMemWatchDumpPid="); pw.println(mMemWatchDumpPid);
+ pw.print(" mMemWatchDumpUid="); pw.println(mMemWatchDumpUid);
+ pw.print(" mMemWatchIsUserInitiated="); pw.println(mMemWatchIsUserInitiated);
}
if (mTrackAllocationApp != null) {
if (dumpPackage == null || dumpPackage.equals(mTrackAllocationApp)) {
@@ -10823,6 +10870,9 @@
proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.FILE, mMemWatchDumpFile);
proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.PID, mMemWatchDumpPid);
proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.UID, mMemWatchDumpUid);
+ proto.write(
+ ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.IS_USER_INITIATED,
+ mMemWatchIsUserInitiated);
proto.end(dtoken);
proto.end(token);
@@ -15920,14 +15970,7 @@
}
if (isDebuggable) {
Slog.w(TAG, "Process " + proc + " exceeded pss limit " + check + "; reporting");
- final ProcessRecord myProc = proc;
- final File heapdumpFile = DumpHeapProvider.getJavaFile();
- mMemWatchDumpProcName = proc.processName;
- mMemWatchDumpFile = heapdumpFile.toString();
- mMemWatchDumpPid = proc.pid;
- mMemWatchDumpUid = proc.uid;
- BackgroundThread.getHandler().post(
- new RecordPssRunnable(this, myProc, DumpHeapProvider.getJavaFile()));
+ startHeapDumpLocked(proc, false);
} else {
Slog.w(TAG, "Process " + proc + " exceeded pss limit " + check
+ ", but debugging not enabled");
@@ -15936,6 +15979,16 @@
}
}
+ private void startHeapDumpLocked(ProcessRecord proc, boolean isUserInitiated) {
+ final File heapdumpFile = DumpHeapProvider.getJavaFile();
+ mMemWatchDumpProcName = proc.processName;
+ mMemWatchDumpFile = heapdumpFile.toString();
+ mMemWatchDumpPid = proc.pid;
+ mMemWatchDumpUid = proc.uid;
+ mMemWatchIsUserInitiated = isUserInitiated;
+ BackgroundThread.getHandler().post(new RecordPssRunnable(this, proc, heapdumpFile));
+ }
+
/**
* Schedule PSS collection of a process.
*/
@@ -16331,12 +16384,10 @@
@GuardedBy("this")
final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground,
int fgServiceTypes, boolean oomAdj) {
- proc.setHasForegroundServices(isForeground, fgServiceTypes);
- final boolean hasFgServiceLocationType =
- (fgServiceTypes & ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION) != 0;
if (isForeground != proc.hasForegroundServices()
- || proc.hasLocationForegroundServices() != hasFgServiceLocationType) {
+ || proc.getForegroundServiceTypes() != fgServiceTypes) {
+ proc.setHasForegroundServices(isForeground, fgServiceTypes);
ArrayList<ProcessRecord> curProcs = mForegroundPackages.get(proc.info.packageName,
proc.info.uid);
if (isForeground) {
@@ -16361,16 +16412,15 @@
}
}
}
- if (oomAdj) {
- updateOomAdjLocked();
- }
- }
- if (proc.getForegroundServiceTypes() != fgServiceTypes) {
proc.setReportedForegroundServiceTypes(fgServiceTypes);
ProcessChangeItem item = enqueueProcessChangeItemLocked(proc.info.uid, proc.pid);
item.changes = ProcessChangeItem.CHANGE_FOREGROUND_SERVICES;
item.foregroundServiceTypes = fgServiceTypes;
+
+ if (oomAdj) {
+ updateOomAdjLocked();
+ }
}
}
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index ea23081..4bfbb78 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -460,10 +460,9 @@
// that request - we don't want the token to be swept from under our feet...
mHandler.removeCallbacksAndMessages(msgToken);
// ...then schedule the removal of the token after the extended timeout
+ final ProcessRecord app = r.curApp;
mHandler.postAtTime(() -> {
- if (r.curApp != null) {
- r.curApp.removeAllowBackgroundActivityStartsToken(r);
- }
+ app.removeAllowBackgroundActivityStartsToken(r);
}, msgToken, (r.receiverTime + mConstants.ALLOW_BG_ACTIVITY_START_TIMEOUT));
}
}
diff --git a/services/core/java/com/android/server/am/TEST_MAPPING b/services/core/java/com/android/server/am/TEST_MAPPING
index 117174a..f198464 100644
--- a/services/core/java/com/android/server/am/TEST_MAPPING
+++ b/services/core/java/com/android/server/am/TEST_MAPPING
@@ -27,6 +27,21 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
+ },
+ {
+ "name": "FrameworksMockingServicesTests",
+ "file_patterns": ["AppCompactor\\.java"],
+ "options": [
+ {
+ "include-filter": "com.android.server.am."
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ]
}
],
"postsubmit": [
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 93f7831..82a4f1df 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -6360,9 +6360,20 @@
boolean isLoopbackRenderPolicy = policyConfig.getMixes().stream().allMatch(
mix -> mix.getRouteFlags() == (mix.ROUTE_FLAG_RENDER | mix.ROUTE_FLAG_LOOP_BACK));
- // Policy that do not modify the audio routing only need an audio projection
- if (isLoopbackRenderPolicy && canProjectAudio(projection)) {
- return true;
+ if (isLoopbackRenderPolicy) {
+ boolean allowPrivilegedPlaybackCapture = policyConfig.getMixes().stream().anyMatch(
+ mix -> mix.getRule().allowPrivilegedPlaybackCapture());
+ if (allowPrivilegedPlaybackCapture
+ && !(hasPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT)
+ || hasPermission(android.Manifest.permission.CAPTURE_MEDIA_OUTPUT))) {
+ // Opt-out can not be bypassed without a system permission
+ return false;
+ }
+
+ if (canProjectAudio(projection)) {
+ // Policy that do not modify the audio routing only need an audio projection
+ return true;
+ }
}
boolean hasPermissionModifyAudioRouting =
@@ -6373,6 +6384,9 @@
}
return false;
}
+ private boolean hasPermission(String permission) {
+ return PackageManager.PERMISSION_GRANTED == mContext.checkCallingPermission(permission);
+ }
/** @return true if projection is a valid MediaProjection that can project audio. */
private boolean canProjectAudio(IMediaProjection projection) {
diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
index 123564e..0c55934 100644
--- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java
+++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
@@ -22,6 +22,7 @@
import static android.Manifest.permission.INTERNET;
import static android.Manifest.permission.NETWORK_STACK;
import static android.Manifest.permission.UPDATE_DEVICE_STATS;
+import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
import static android.content.pm.PackageManager.MATCH_ANY_USER;
import static android.os.Process.INVALID_UID;
@@ -42,13 +43,15 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.ArraySet;
import android.util.Log;
-import android.util.Slog;
+import android.util.SparseArray;
import android.util.SparseIntArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.server.LocalServices;
+import com.android.server.SystemConfig;
import java.util.ArrayList;
import java.util.HashMap;
@@ -83,41 +86,32 @@
private final Map<Integer, Boolean> mApps = new HashMap<>();
private class PackageListObserver implements PackageManagerInternal.PackageListObserver {
- @Override
- public void onPackageAdded(String packageName, int uid) {
- final PackageInfo app = getPackageInfo(packageName);
- if (app == null) {
- Slog.wtf(TAG, "Failed to get information of installed package: " + packageName);
- return;
- }
- if (uid == INVALID_UID) {
- Slog.wtf(TAG, "Failed to get the uid of installed package: " + packageName
- + "uid: " + uid);
- return;
- }
- if (app.requestedPermissions == null) {
- return;
- }
- sendPackagePermissionsForUid(uid,
- getNetdPermissionMask(app.requestedPermissions));
- }
- @Override
- public void onPackageRemoved(String packageName, int uid) {
+ private int getPermissionForUid(int uid) {
int permission = 0;
- // If there are still packages remain under the same uid, check the permission of the
- // remaining packages. We only remove the permission for a given uid when all packages
- // for that uid no longer have that permission.
+ // Check all the packages for this UID. The UID has the permission if any of the
+ // packages in it has the permission.
String[] packages = mPackageManager.getPackagesForUid(uid);
if (packages != null && packages.length > 0) {
for (String name : packages) {
final PackageInfo app = getPackageInfo(name);
if (app != null && app.requestedPermissions != null) {
- permission |= getNetdPermissionMask(app.requestedPermissions);
+ permission |= getNetdPermissionMask(app.requestedPermissions,
+ app.requestedPermissionsFlags);
}
}
}
- sendPackagePermissionsForUid(uid, permission);
+ return permission;
+ }
+
+ @Override
+ public void onPackageAdded(String packageName, int uid) {
+ sendPackagePermissionsForUid(uid, getPermissionForUid(uid));
+ }
+
+ @Override
+ public void onPackageRemoved(String packageName, int uid) {
+ sendPackagePermissionsForUid(uid, getPermissionForUid(uid));
}
}
@@ -167,12 +161,9 @@
}
//TODO: unify the management of the permissions into one codepath.
- if (app.requestedPermissions != null) {
- int otherNetdPerms = getNetdPermissionMask(app.requestedPermissions);
- if (otherNetdPerms != 0) {
- netdPermsUids.put(uid, netdPermsUids.get(uid) | otherNetdPerms);
- }
- }
+ int otherNetdPerms = getNetdPermissionMask(app.requestedPermissions,
+ app.requestedPermissionsFlags);
+ netdPermsUids.put(uid, netdPermsUids.get(uid) | otherNetdPerms);
}
List<UserInfo> users = mUserManager.getUsers(true); // exclude dying users
@@ -182,6 +173,23 @@
}
}
+ final SparseArray<ArraySet<String>> systemPermission =
+ SystemConfig.getInstance().getSystemPermissions();
+ for (int i = 0; i < systemPermission.size(); i++) {
+ ArraySet<String> perms = systemPermission.valueAt(i);
+ int uid = systemPermission.keyAt(i);
+ int netdPermission = 0;
+ // Get the uids of native services that have UPDATE_DEVICE_STATS permission.
+ if (perms != null) {
+ netdPermission |= perms.contains(UPDATE_DEVICE_STATS)
+ ? INetd.PERMISSION_UPDATE_DEVICE_STATS : 0;
+ }
+ // For internet permission, the native services have their own selinux domains and
+ // sepolicy will control the socket creation during run time. netd cannot block the
+ // socket creation based on the permission information here.
+ netdPermission |= INetd.PERMISSION_INTERNET;
+ netdPermsUids.put(uid, netdPermsUids.get(uid) | netdPermission);
+ }
log("Users: " + mUsers.size() + ", Apps: " + mApps.size());
update(mUsers, mApps, true);
sendPackagePermissionsToNetd(netdPermsUids);
@@ -403,13 +411,17 @@
}
}
- private static int getNetdPermissionMask(String[] requestedPermissions) {
+ private static int getNetdPermissionMask(String[] requestedPermissions,
+ int[] requestedPermissionsFlags) {
int permissions = 0;
- for (String permissionName : requestedPermissions) {
- if (permissionName.equals(INTERNET)) {
+ if (requestedPermissions == null || requestedPermissionsFlags == null) return permissions;
+ for (int i = 0; i < requestedPermissions.length; i++) {
+ if (requestedPermissions[i].equals(INTERNET)
+ && ((requestedPermissionsFlags[i] & REQUESTED_PERMISSION_GRANTED) != 0)) {
permissions |= INetd.PERMISSION_INTERNET;
}
- if (permissionName.equals(UPDATE_DEVICE_STATS)) {
+ if (requestedPermissions[i].equals(UPDATE_DEVICE_STATS)
+ && ((requestedPermissionsFlags[i] & REQUESTED_PERMISSION_GRANTED) != 0)) {
permissions |= INetd.PERMISSION_UPDATE_DEVICE_STATS;
}
}
diff --git a/services/core/java/com/android/server/incident/IncidentCompanionService.java b/services/core/java/com/android/server/incident/IncidentCompanionService.java
index 6f2bfc3..55e054b 100644
--- a/services/core/java/com/android/server/incident/IncidentCompanionService.java
+++ b/services/core/java/com/android/server/incident/IncidentCompanionService.java
@@ -16,10 +16,23 @@
package com.android.server.incident;
+import android.app.ActivityManager;
+import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
import android.os.Binder;
import android.os.IIncidentAuthListener;
import android.os.IIncidentCompanion;
+import android.os.IIncidentManager;
+import android.os.IncidentManager;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
import com.android.internal.util.DumpUtils;
import com.android.server.SystemService;
@@ -36,6 +49,14 @@
static final String TAG = "IncidentCompanionService";
/**
+ * The two permissions, for sendBroadcastAsUserMultiplePermissions.
+ */
+ private static final String[] DUMP_AND_USAGE_STATS_PERMISSIONS = new String[] {
+ android.Manifest.permission.DUMP,
+ android.Manifest.permission.PACKAGE_USAGE_STATS
+ };
+
+ /**
* Tracker for reports pending approval.
*/
private PendingReports mPendingReports;
@@ -45,16 +66,21 @@
*/
private final class BinderService extends IIncidentCompanion.Stub {
/**
- * ONEWAY binder call to initiate authorizing the report.
+ * ONEWAY binder call to initiate authorizing the report. If you don't need
+ * IncidentCompanionService to check whether the calling UID matches then
+ * pass 0 for callingUid. Either way, the caller must have DUMP and USAGE_STATS
+ * permissions to retrieve the data, so it ends up being about the same.
*/
@Override
- public void authorizeReport(int callingUid, final String callingPackage, int flags,
- final IIncidentAuthListener listener) {
+ public void authorizeReport(int callingUid, final String callingPackage,
+ final String receiverClass, final String reportId,
+ final int flags, final IIncidentAuthListener listener) {
enforceRequestAuthorizationPermission();
final long ident = Binder.clearCallingIdentity();
try {
- mPendingReports.authorizeReport(callingUid, callingPackage, flags, listener);
+ mPendingReports.authorizeReport(callingUid, callingPackage,
+ receiverClass, reportId, flags, listener);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -82,6 +108,38 @@
}
/**
+ * ONEWAY implementation to send broadcast from incidentd, which is native.
+ */
+ @Override
+ public void sendReportReadyBroadcast(String pkg, String cls) {
+ enforceRequestAuthorizationPermission();
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ final Context context = getContext();
+
+ final int primaryUser = getAndValidateUser(context);
+ if (primaryUser == UserHandle.USER_NULL) {
+ return;
+ }
+
+ final Intent intent = new Intent(Intent.ACTION_INCIDENT_REPORT_READY);
+ intent.setComponent(new ComponentName(pkg, cls));
+
+ Log.d(TAG, "sendReportReadyBroadcast sending primaryUser=" + primaryUser
+ + " userHandle=" + UserHandle.getUserHandleForUid(primaryUser)
+ + " intent=" + intent);
+
+ // Send it to the primary user. Only they can do incident reports.
+ context.sendBroadcastAsUserMultiplePermissions(intent,
+ UserHandle.getUserHandleForUid(primaryUser),
+ DUMP_AND_USAGE_STATS_PERMISSIONS);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
* SYNCHRONOUS binder call to get the list of reports that are pending confirmation
* by the user.
*/
@@ -122,7 +180,80 @@
}
/**
- * Implementation of adb shell dumpsys debugreportcompanion.
+ * SYNCHRONOUS binder call to get the list of incident reports waiting for a receiver.
+ */
+ @Override
+ public List<String> getIncidentReportList(String pkg, String cls) throws RemoteException {
+ enforceAccessReportsPermissions(null);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return getIIncidentManager().getIncidentReportList(pkg, cls);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * SYNCHRONOUS binder call to commit an incident report
+ */
+ @Override
+ public void deleteIncidentReports(String pkg, String cls, String id)
+ throws RemoteException {
+ if (pkg == null || cls == null || id == null
+ || pkg.length() == 0 || cls.length() == 0 || id.length() == 0) {
+ throw new RuntimeException("Invalid pkg, cls or id");
+ }
+ enforceAccessReportsPermissions(pkg);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ getIIncidentManager().deleteIncidentReports(pkg, cls, id);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * SYNCHRONOUS binder call to delete all incident reports for a package.
+ */
+ @Override
+ public void deleteAllIncidentReports(String pkg) throws RemoteException {
+ if (pkg == null || pkg.length() == 0) {
+ throw new RuntimeException("Invalid pkg");
+ }
+ enforceAccessReportsPermissions(pkg);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ getIIncidentManager().deleteAllIncidentReports(pkg);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * SYNCHRONOUS binder call to get the IncidentReport object.
+ */
+ @Override
+ public IncidentManager.IncidentReport getIncidentReport(String pkg, String cls, String id)
+ throws RemoteException {
+ if (pkg == null || cls == null || id == null
+ || pkg.length() == 0 || cls.length() == 0 || id.length() == 0) {
+ throw new RuntimeException("Invalid pkg, cls or id");
+ }
+ enforceAccessReportsPermissions(pkg);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return getIIncidentManager().getIncidentReport(pkg, cls, id);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * SYNCHRONOUS implementation of adb shell dumpsys debugreportcompanion.
*/
@Override
protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
@@ -150,6 +281,51 @@
android.Manifest.permission.APPROVE_INCIDENT_REPORTS, null);
}
+ /**
+ * Enforce that the calling process either has APPROVE_INCIDENT_REPORTS or
+ * (DUMP and PACKAGE_USAGE_STATS). This lets the approver get, because showing
+ * information about the report is a prerequisite for letting the user decide.
+ *
+ * If pkg is null, it is not checked, so make sure that you check it for null first
+ * if you do need the packages to match.
+ *
+ * Inside the binder interface class because we want to do all of the authorization
+ * here, before calling out to the helper objects.
+ */
+ private void enforceAccessReportsPermissions(String pkg) {
+ if (getContext().checkCallingPermission(
+ android.Manifest.permission.APPROVE_INCIDENT_REPORTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ getContext().enforceCallingOrSelfPermission(
+ android.Manifest.permission.DUMP, null);
+ getContext().enforceCallingOrSelfPermission(
+ android.Manifest.permission.PACKAGE_USAGE_STATS, null);
+ if (pkg == null) {
+ enforceCallerIsSameApp(pkg);
+ }
+ }
+ }
+
+ /**
+ * Throw a SecurityException if the incoming binder call is not from pkg.
+ */
+ private void enforceCallerIsSameApp(String pkg) throws SecurityException {
+ try {
+ final int uid = Binder.getCallingUid();
+ final int userId = UserHandle.getCallingUserId();
+ final ApplicationInfo ai = getContext().getPackageManager()
+ .getApplicationInfoAsUser(pkg, 0, userId);
+ if (ai == null) {
+ throw new SecurityException("Unknown package " + pkg);
+ }
+ if (!UserHandle.isSameApp(ai.uid, uid)) {
+ throw new SecurityException("Calling uid " + uid + " gave package "
+ + pkg + " which is owned by uid " + ai.uid);
+ }
+ } catch (PackageManager.NameNotFoundException re) {
+ throw new SecurityException("Unknown package " + pkg + "\n" + re);
+ }
+ }
}
/**
@@ -182,5 +358,52 @@
break;
}
}
+
+ /**
+ * Looks up incidentd every time, so we don't need a complex handshake between
+ * incidentd and IncidentCompanionService.
+ */
+ private IIncidentManager getIIncidentManager() throws RemoteException {
+ return IIncidentManager.Stub.asInterface(
+ ServiceManager.getService(Context.INCIDENT_SERVICE));
+ }
+
+ /**
+ * Check whether the current user is the primary user, and return the user id if they are.
+ * Returns UserHandle.USER_NULL if not valid.
+ */
+ public static int getAndValidateUser(Context context) {
+ // Current user
+ UserInfo currentUser;
+ try {
+ currentUser = ActivityManager.getService().getCurrentUser();
+ } catch (RemoteException ex) {
+ // We're already inside the system process.
+ throw new RuntimeException(ex);
+ }
+
+ // Primary user
+ final UserManager um = UserManager.get(context);
+ final UserInfo primaryUser = um.getPrimaryUser();
+
+ // Check that we're using the right user.
+ if (currentUser == null) {
+ Log.w(TAG, "No current user. Nobody to approve the report."
+ + " The report will be denied.");
+ return UserHandle.USER_NULL;
+ }
+ if (primaryUser == null) {
+ Log.w(TAG, "No primary user. Nobody to approve the report."
+ + " The report will be denied.");
+ return UserHandle.USER_NULL;
+ }
+ if (primaryUser.id != currentUser.id) {
+ Log.w(TAG, "Only the primary user can approve bugreports, but they are not"
+ + " the current user. The report will be denied.");
+ return UserHandle.USER_NULL;
+ }
+
+ return primaryUser.id;
+ }
}
diff --git a/services/core/java/com/android/server/incident/PendingReports.java b/services/core/java/com/android/server/incident/PendingReports.java
index 519ed41..a749d26 100644
--- a/services/core/java/com/android/server/incident/PendingReports.java
+++ b/services/core/java/com/android/server/incident/PendingReports.java
@@ -16,14 +16,12 @@
package com.android.server.incident;
-import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.content.pm.UserInfo;
import android.net.Uri;
import android.os.Handler;
import android.os.IIncidentAuthListener;
@@ -31,7 +29,6 @@
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.os.UserManager;
import android.util.Log;
import java.io.FileDescriptor;
@@ -76,24 +73,29 @@
public IIncidentAuthListener listener;
public long addedRealtime;
public long addedWalltime;
+ public String receiverClass;
+ public String reportId;
/**
* Construct a PendingReportRec, with an auto-incremented id.
*/
- PendingReportRec(String callingPackage, int flags, IIncidentAuthListener listener) {
+ PendingReportRec(String callingPackage, String receiverClass, String reportId, int flags,
+ IIncidentAuthListener listener) {
this.id = mNextPendingId++;
this.callingPackage = callingPackage;
this.flags = flags;
this.listener = listener;
this.addedRealtime = SystemClock.elapsedRealtime();
this.addedWalltime = System.currentTimeMillis();
+ this.receiverClass = receiverClass;
+ this.reportId = reportId;
}
/**
* Get the Uri that contains the flattened data.
*/
Uri getUri() {
- return (new Uri.Builder())
+ final Uri.Builder builder = (new Uri.Builder())
.scheme(IncidentManager.URI_SCHEME)
.authority(IncidentManager.URI_AUTHORITY)
.path(IncidentManager.URI_PATH)
@@ -101,8 +103,15 @@
.appendQueryParameter(IncidentManager.URI_PARAM_CALLING_PACKAGE, callingPackage)
.appendQueryParameter(IncidentManager.URI_PARAM_FLAGS, Integer.toString(flags))
.appendQueryParameter(IncidentManager.URI_PARAM_TIMESTAMP,
- Long.toString(addedWalltime))
- .build();
+ Long.toString(addedWalltime));
+ if (receiverClass != null && receiverClass.length() > 0) {
+ builder.appendQueryParameter(IncidentManager.URI_PARAM_RECEIVER_CLASS,
+ receiverClass);
+ }
+ if (reportId != null && reportId.length() > 0) {
+ builder.appendQueryParameter(IncidentManager.URI_PARAM_REPORT_ID, reportId);
+ }
+ return builder.build();
}
}
@@ -121,13 +130,15 @@
* <p>
* The security checks are handled by IncidentCompanionService.
*/
- public void authorizeReport(int callingUid, final String callingPackage, final int flags,
+ public void authorizeReport(int callingUid, final String callingPackage,
+ final String receiverClass, final String reportId, final int flags,
final IIncidentAuthListener listener) {
// Starting the system server is complicated, and rather than try to
// have a complicated lifecycle that we share with dumpstated and incidentd,
// we will accept the request, and then display it whenever it becomes possible to.
mRequestQueue.enqueue(listener.asBinder(), true, () -> {
- authorizeReportImpl(callingUid, callingPackage, flags, listener);
+ authorizeReportImpl(callingUid, callingPackage, receiverClass, reportId,
+ flags, listener);
});
}
@@ -248,10 +259,11 @@
/**
* Start the confirmation process.
*/
- private void authorizeReportImpl(int callingUid, final String callingPackage, int flags,
- final IIncidentAuthListener listener) {
+ private void authorizeReportImpl(int callingUid, final String callingPackage,
+ final String receiverClass, final String reportId,
+ int flags, final IIncidentAuthListener listener) {
// Enforce that the calling package pertains to the callingUid.
- if (!isPackageInUid(callingUid, callingPackage)) {
+ if (callingUid != 0 && !isPackageInUid(callingUid, callingPackage)) {
Log.w(TAG, "Calling uid " + callingUid + " doesn't match package "
+ callingPackage);
denyReportBeforeAddingRec(listener, callingPackage);
@@ -277,7 +289,7 @@
// Save the record for when the PermissionController comes back to authorize it.
PendingReportRec rec = null;
synchronized (mLock) {
- rec = new PendingReportRec(callingPackage, flags, listener);
+ rec = new PendingReportRec(callingPackage, receiverClass, reportId, flags, listener);
mPending.add(rec);
}
@@ -406,37 +418,7 @@
* Returns UserHandle.USER_NULL if not valid.
*/
private int getAndValidateUser() {
- // Current user
- UserInfo currentUser;
- try {
- currentUser = ActivityManager.getService().getCurrentUser();
- } catch (RemoteException ex) {
- // We're already inside the system process.
- throw new RuntimeException(ex);
- }
-
- // Primary user
- final UserManager um = UserManager.get(mContext);
- final UserInfo primaryUser = um.getPrimaryUser();
-
- // Check that we're using the right user.
- if (currentUser == null) {
- Log.w(TAG, "No current user. Nobody to approve the report."
- + " The report will be denied.");
- return UserHandle.USER_NULL;
- }
- if (primaryUser == null) {
- Log.w(TAG, "No primary user. Nobody to approve the report."
- + " The report will be denied.");
- return UserHandle.USER_NULL;
- }
- if (primaryUser.id != currentUser.id) {
- Log.w(TAG, "Only the primary user can approve bugreports, but they are not"
- + " the current user. The report will be denied.");
- return UserHandle.USER_NULL;
- }
-
- return primaryUser.id;
+ return IncidentCompanionService.getAndValidateUser(mContext);
}
/**
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index dddb7ef..20b8987 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -2406,6 +2406,11 @@
@Override
public boolean areNotificationsEnabledForPackage(String pkg, int uid) {
checkCallerIsSystemOrSameApp(pkg);
+ if (UserHandle.getCallingUserId() != UserHandle.getUserId(uid)) {
+ getContext().enforceCallingPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS,
+ "canNotifyAsPackage for uid " + uid);
+ }
return mPreferencesHelper.getImportance(pkg, uid) != IMPORTANCE_NONE;
}
@@ -2419,6 +2424,13 @@
public boolean areBubblesAllowedForPackage(String pkg, int uid) {
enforceSystemOrSystemUIOrSamePackage(pkg,
"Caller not system or systemui or same package");
+
+ if (UserHandle.getCallingUserId() != UserHandle.getUserId(uid)) {
+ getContext().enforceCallingPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS,
+ "canNotifyAsPackage for uid " + uid);
+ }
+
return mPreferencesHelper.areBubblesAllowed(pkg, uid);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 81448b7..eec1e53 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1315,8 +1315,11 @@
static final int WRITE_SETTINGS_DELAY = 10*1000; // 10 seconds
- // Delay time in millisecs
- static final int BROADCAST_DELAY = 10 * 1000;
+ private static final long BROADCAST_DELAY_DURING_STARTUP = 10 * 1000L; // 10 seconds (in millis)
+ private static final long BROADCAST_DELAY = 1 * 1000L; // 1 second (in millis)
+
+ // When the service constructor finished plus a delay (used for broadcast delay computation)
+ private long mServiceStartWithDelay;
private static final long DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD =
2 * 60 * 60 * 1000L; /* two hours */
@@ -3217,6 +3220,8 @@
// once we have a booted system.
mInstaller.setWarnIfHeld(mPackages);
+ mServiceStartWithDelay = SystemClock.uptimeMillis() + (60 * 1000L);
+
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
@@ -20603,8 +20608,14 @@
mPendingBroadcasts.put(userId, packageName, components);
}
if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) {
- // Schedule a message
- mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY);
+ // Schedule a message - if it has been a "reasonably long time" since the
+ // service started, send the broadcast with a delay of one second to avoid
+ // delayed reactions from the receiver, else keep the default ten second delay
+ // to avoid extreme thrashing on service startup.
+ final long broadcastDelay = SystemClock.uptimeMillis() > mServiceStartWithDelay
+ ? BROADCAST_DELAY
+ : BROADCAST_DELAY_DURING_STARTUP;
+ mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, broadcastDelay);
}
}
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 459de1a..096335e 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -32,6 +32,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
@@ -916,13 +917,13 @@
}
/*
- * Update the shared user setting when a package using
- * specifying the shared user id is removed. The gids
- * associated with each permission of the deleted package
- * are removed from the shared user's gid list only if its
- * not in use by other permissions of packages in the
- * shared user setting.
+ * Update the shared user setting when a package with a shared user id is removed. The gids
+ * associated with each permission of the deleted package are removed from the shared user'
+ * gid list only if its not in use by other permissions of packages in the shared user setting.
+ *
+ * @return the affected user id
*/
+ @UserIdInt
int updateSharedUserPermsLPw(PackageSetting deletedPs, int userId) {
if ((deletedPs == null) || (deletedPs.pkg == null)) {
Slog.i(PackageManagerService.TAG,
@@ -937,6 +938,7 @@
SharedUserSetting sus = deletedPs.sharedUser;
+ int affectedUserId = UserHandle.USER_NULL;
// Update permissions
for (String eachPerm : deletedPs.pkg.requestedPermissions) {
BasePermission bp = mPermissions.getPermission(eachPerm);
@@ -983,17 +985,22 @@
if (permissionsState.revokeInstallPermission(bp) ==
PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) {
- return UserHandle.USER_ALL;
+ affectedUserId = UserHandle.USER_ALL;
}
// Try to revoke as an install permission which is per user.
if (permissionsState.revokeRuntimePermission(bp, userId) ==
PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) {
- return userId;
+ if (affectedUserId == UserHandle.USER_NULL) {
+ affectedUserId = userId;
+ } else if (affectedUserId != userId) {
+ // Multiple users affected.
+ affectedUserId = UserHandle.USER_ALL;
+ }
}
}
- return UserHandle.USER_NULL;
+ return affectedUserId;
}
int removePackageLPw(String name) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 316a9c0..204f186 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -3372,15 +3372,15 @@
@Override
public int getUserSerialNumber(int userHandle) {
synchronized (mUsersLock) {
- if (!exists(userHandle)) return -1;
- return getUserInfoLU(userHandle).serialNumber;
+ final UserInfo userInfo = getUserInfoLU(userHandle);
+ return userInfo != null ? userInfo.serialNumber : -1;
}
}
@Override
public boolean isUserNameSet(int userHandle) {
synchronized (mUsersLock) {
- UserInfo userInfo = getUserInfoLU(userHandle);
+ final UserInfo userInfo = getUserInfoLU(userHandle);
return userInfo != null && userInfo.name != null;
}
}
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 212df43..e6e2c76 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -1089,6 +1089,8 @@
private void grantRuntimePermissions(PackageInfo pkg,
Set<String> permissionsWithoutSplits, boolean systemFixed, boolean ignoreSystemPackage,
int userId) {
+ UserHandle user = UserHandle.of(userId);
+
if (pkg == null) {
return;
}
@@ -1109,7 +1111,14 @@
}
requestedPermissions = ArrayUtils.filterNotNull(requestedPermissions, String[]::new);
- PackageManager pm = mContext.getPackageManager();
+ PackageManager pm;
+ try {
+ pm = mContext.createPackageContextAsUser(mContext.getPackageName(), 0,
+ user).getPackageManager();
+ } catch (NameNotFoundException doesNotHappen) {
+ throw new IllegalStateException(doesNotHappen);
+ }
+
final ArraySet<String> permissions = new ArraySet<>(permissionsWithoutSplits);
ApplicationInfo applicationInfo = pkg.applicationInfo;
@@ -1187,7 +1196,6 @@
}
if (permissions.contains(permission)) {
- UserHandle user = UserHandle.of(userId);
final int flags = mContext.getPackageManager().getPermissionFlags(
permission, pkg.packageName, user);
@@ -1210,8 +1218,11 @@
UserHandle.getAppId(pkg.applicationInfo.uid));
String op = AppOpsManager.permissionToOp(permission);
- mContext.getPackageManager()
- .grantRuntimePermission(pkg.packageName, permission, user);
+ if (pm.checkPermission(permission, pkg.packageName)
+ != PackageManager.PERMISSION_GRANTED) {
+ mContext.getPackageManager()
+ .grantRuntimePermission(pkg.packageName, permission, user);
+ }
mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName,
newFlags, newFlags, user);
diff --git a/services/core/java/com/android/server/policy/EventLogTags.logtags b/services/core/java/com/android/server/policy/EventLogTags.logtags
new file mode 100644
index 0000000..7563382
--- /dev/null
+++ b/services/core/java/com/android/server/policy/EventLogTags.logtags
@@ -0,0 +1,8 @@
+# See system/core/logcat/event.logtags for a description of the format of this file.
+
+option java_package com.android.server.policy
+
+
+# 0 for screen off, 1 for screen on
+70000 screen_toggled (screen_state|1|5)
+70001 intercept_power (action|3),(mPowerKeyHandled|1),(mPowerKeyPressCounter|1)
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 1c5c7a3..7c87462 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -167,7 +167,6 @@
import android.service.vr.IPersistentVrStateCallbacks;
import android.speech.RecognizerIntent;
import android.telecom.TelecomManager;
-import android.util.EventLog;
import android.util.Log;
import android.util.LongSparseArray;
import android.util.MutableBoolean;
@@ -3807,9 +3806,9 @@
}
case KeyEvent.KEYCODE_POWER: {
- Slog.d(TAG, "interceptKeyBeforeQueueing: KEYCODE_POWER "
- + KeyEvent.actionToString(event.getAction())
- + " mPowerKeyHandled=" + mPowerKeyHandled + " b/128933363");
+ EventLogTags.writeInterceptPower(
+ KeyEvent.actionToString(event.getAction()),
+ mPowerKeyHandled ? 1 : 0, mPowerKeyPressCounter);
// Any activity on the power button stops the accessibility shortcut
cancelPendingAccessibilityShortcutAction();
result &= ~ACTION_PASS_TO_USER;
@@ -4359,7 +4358,7 @@
// Called on the PowerManager's Notifier thread.
@Override
public void finishedGoingToSleep(int why) {
- EventLog.writeEvent(70000, 0);
+ EventLogTags.writeScreenToggled(0);
if (DEBUG_WAKEUP) {
Slog.i(TAG, "Finished going to sleep... (why="
+ WindowManagerPolicyConstants.offReasonToString(why) + ")");
@@ -4391,7 +4390,7 @@
// Called on the PowerManager's Notifier thread.
@Override
public void startedWakingUp(@OnReason int why) {
- EventLog.writeEvent(70000, 1);
+ EventLogTags.writeScreenToggled(1);
if (DEBUG_WAKEUP) {
Slog.i(TAG, "Started waking up... (why="
+ WindowManagerPolicyConstants.onReasonToString(why) + ")");
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index 28a853f..15148f3 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -44,6 +44,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
@@ -149,6 +150,7 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -2010,6 +2012,40 @@
}
}
+ private void pullAppsOnExternalStorageInfo(int tagId, long elapsedNanos, long wallClockNanos,
+ List<StatsLogEventWrapper> pulledData) {
+ PackageManager pm = mContext.getPackageManager();
+ StorageManager storage = mContext.getSystemService(StorageManager.class);
+ List<ApplicationInfo> apps = pm.getInstalledApplications(/* flags = */ 0);
+ for (ApplicationInfo appInfo : apps) {
+ UUID storageUuid = appInfo.storageUuid;
+ if (storageUuid != null) {
+ VolumeInfo volumeInfo = storage.findVolumeByUuid(appInfo.storageUuid.toString());
+ if (volumeInfo != null) {
+ DiskInfo diskInfo = volumeInfo.getDisk();
+ if (diskInfo != null) {
+ int externalStorageType = -1;
+ if (diskInfo.isSd()) {
+ externalStorageType = StorageEnums.SD_CARD;
+ } else if (diskInfo.isUsb()) {
+ externalStorageType = StorageEnums.USB;
+ } else if (appInfo.isExternal()) {
+ externalStorageType = StorageEnums.OTHER;
+ }
+ // App is installed on external storage.
+ if (externalStorageType != -1) {
+ StatsLogEventWrapper e =
+ new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos);
+ e.writeInt(externalStorageType);
+ e.writeString(appInfo.packageName);
+ pulledData.add(e);
+ }
+ }
+ }
+ }
+ }
+ }
+
/**
* Pulls various data.
*/
@@ -2210,6 +2246,10 @@
pullExternalStorageInfo(tagId, elapsedNanos, wallClockNanos, ret);
break;
}
+ case StatsLog.APPS_ON_EXTERNAL_STORAGE_INFO: {
+ pullAppsOnExternalStorageInfo(tagId, elapsedNanos, wallClockNanos, ret);
+ break;
+ }
default:
Slog.w(TAG, "No such tagId data as " + tagId);
return null;
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index 2d89bc7..d916e39 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -85,6 +85,7 @@
import android.app.WaitResult;
import android.app.WindowConfiguration.WindowingMode;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
@@ -876,6 +877,11 @@
builder.addTaggedData(FIELD_COMING_FROM_PENDING_INTENT, comingFromPendingIntent ? 1 : 0);
if (intent != null) {
builder.addTaggedData(FIELD_INTENT_ACTION, intent.getAction());
+ ComponentName component = intent.getComponent();
+ if (component != null) {
+ builder.addTaggedData(FIELD_TARGET_SHORT_COMPONENT_NAME,
+ component.flattenToShortString());
+ }
}
if (callerApp != null) {
builder.addTaggedData(FIELD_PROCESS_RECORD_PROCESS_NAME, callerApp.mName);
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 4c9b80b..46c017e 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -3059,7 +3059,11 @@
// activity in home stack.
// See {@link #mInResumeTopActivity}.
mService.mH.post(
- () -> mRootActivityContainer.resumeHomeActivity(prev, reason, mDisplayId));
+ () -> {
+ synchronized (mService.mGlobalLock) {
+ mRootActivityContainer.resumeHomeActivity(prev, reason, mDisplayId);
+ }
+ });
return true;
} else {
return mRootActivityContainer.resumeHomeActivity(prev, reason, mDisplayId);
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 3acd4e7..ea1db40 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -997,6 +997,10 @@
if (callerApp.areBackgroundActivityStartsAllowed()) {
return false;
}
+ // don't abort if the caller has an activity in any foreground task
+ if (callerApp.hasActivityInVisibleTask()) {
+ return false;
+ }
}
// don't abort if the callingUid has START_ACTIVITIES_FROM_BACKGROUND permission
if (mService.checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid)
diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java
index db96847..a46fa13 100644
--- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java
+++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java
@@ -26,6 +26,8 @@
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.app.WindowConfiguration;
import android.os.Environment;
import android.provider.Settings;
@@ -33,6 +35,7 @@
import android.util.Slog;
import android.util.Xml;
import android.view.Display;
+import android.view.DisplayAddress;
import android.view.DisplayInfo;
import android.view.Surface;
@@ -47,10 +50,11 @@
import org.xmlpull.v1.XmlSerializer;
import java.io.File;
-import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
@@ -60,9 +64,33 @@
class DisplayWindowSettings {
private static final String TAG = TAG_WITH_CLASS_NAME ? "DisplayWindowSettings" : TAG_WM;
+ private static final int IDENTIFIER_UNIQUE_ID = 0;
+ private static final int IDENTIFIER_PORT = 1;
+ @IntDef(prefix = { "IDENTIFIER_" }, value = {
+ IDENTIFIER_UNIQUE_ID,
+ IDENTIFIER_PORT,
+ })
+ @interface DisplayIdentifierType {}
+
private final WindowManagerService mService;
- private final AtomicFile mFile;
- private final HashMap<String, Entry> mEntries = new HashMap<String, Entry>();
+ private final HashMap<String, Entry> mEntries = new HashMap<>();
+ private final SettingPersister mStorage;
+
+ /**
+ * The preferred type of a display identifier to use when storing and retrieving entries.
+ * {@link #getIdentifier(DisplayInfo)} must be used to get current preferred identifier for each
+ * display. It will fall back to using {@link #IDENTIFIER_UNIQUE_ID} if the currently selected
+ * one is not applicable to a particular display.
+ */
+ @DisplayIdentifierType
+ private int mIdentifier = IDENTIFIER_UNIQUE_ID;
+
+ /** Interface for persisting the display window settings. */
+ interface SettingPersister {
+ InputStream openRead() throws IOException;
+ OutputStream startWrite() throws IOException;
+ void finishWrite(OutputStream os, boolean success);
+ }
private static class Entry {
private final String mName;
@@ -88,6 +116,26 @@
mName = name;
}
+ private Entry(String name, Entry copyFrom) {
+ this(name);
+ mOverscanLeft = copyFrom.mOverscanLeft;
+ mOverscanTop = copyFrom.mOverscanTop;
+ mOverscanRight = copyFrom.mOverscanRight;
+ mOverscanBottom = copyFrom.mOverscanBottom;
+ mWindowingMode = copyFrom.mWindowingMode;
+ mUserRotationMode = copyFrom.mUserRotationMode;
+ mUserRotation = copyFrom.mUserRotation;
+ mForcedWidth = copyFrom.mForcedWidth;
+ mForcedHeight = copyFrom.mForcedHeight;
+ mForcedDensity = copyFrom.mForcedDensity;
+ mForcedScalingMode = copyFrom.mForcedScalingMode;
+ mRemoveContentMode = copyFrom.mRemoveContentMode;
+ mShouldShowWithInsecureKeyguard = copyFrom.mShouldShowWithInsecureKeyguard;
+ mShouldShowSystemDecors = copyFrom.mShouldShowSystemDecors;
+ mShouldShowIme = copyFrom.mShouldShowIme;
+ mFixedToUserRotation = copyFrom.mFixedToUserRotation;
+ }
+
/** @return {@code true} if all values are default. */
private boolean isEmpty() {
return mOverscanLeft == 0 && mOverscanTop == 0 && mOverscanRight == 0
@@ -106,29 +154,46 @@
}
DisplayWindowSettings(WindowManagerService service) {
- this(service, new File(Environment.getDataDirectory(), "system"));
+ this(service, new AtomicFileStorage());
}
@VisibleForTesting
- DisplayWindowSettings(WindowManagerService service, File folder) {
+ DisplayWindowSettings(WindowManagerService service, SettingPersister storageImpl) {
mService = service;
- mFile = new AtomicFile(new File(folder, "display_settings.xml"), "wm-displays");
+ mStorage = storageImpl;
readSettings();
}
- private Entry getEntry(DisplayInfo displayInfo) {
- // Try to get the entry with the unique if possible.
- // Else, fall back on the display name.
+ private @Nullable Entry getEntry(DisplayInfo displayInfo) {
+ final String identifier = getIdentifier(displayInfo);
Entry entry;
- if (displayInfo.uniqueId == null || (entry = mEntries.get(displayInfo.uniqueId)) == null) {
- entry = mEntries.get(displayInfo.name);
+ // Try to get corresponding entry using preferred identifier for the current config.
+ if ((entry = mEntries.get(identifier)) != null) {
+ return entry;
}
- return entry;
+ // Else, fall back to the display name.
+ if ((entry = mEntries.get(displayInfo.name)) != null) {
+ // Found an entry stored with old identifier - upgrade to the new type now.
+ return updateIdentifierForEntry(entry, displayInfo);
+ }
+ return null;
}
private Entry getOrCreateEntry(DisplayInfo displayInfo) {
final Entry entry = getEntry(displayInfo);
- return entry != null ? entry : new Entry(displayInfo.uniqueId);
+ return entry != null ? entry : new Entry(getIdentifier(displayInfo));
+ }
+
+ /**
+ * Upgrades the identifier of a legacy entry. Does it by copying the data from the old record
+ * and clearing the old key in memory. The entry will be written to storage next time when a
+ * setting changes.
+ */
+ private Entry updateIdentifierForEntry(Entry entry, DisplayInfo displayInfo) {
+ final Entry newEntry = new Entry(getIdentifier(displayInfo), entry);
+ removeEntry(displayInfo);
+ mEntries.put(newEntry.mName, newEntry);
+ return newEntry;
}
void setOverscanLocked(DisplayInfo displayInfo, int left, int top, int right, int bottom) {
@@ -371,12 +436,11 @@
}
private void readSettings() {
- FileInputStream stream;
+ InputStream stream;
try {
- stream = mFile.openRead();
- } catch (FileNotFoundException e) {
- Slog.i(TAG, "No existing display settings " + mFile.getBaseFile()
- + "; starting empty");
+ stream = mStorage.openRead();
+ } catch (IOException e) {
+ Slog.i(TAG, "No existing display settings, starting empty");
return;
}
boolean success = false;
@@ -403,6 +467,8 @@
String tagName = parser.getName();
if (tagName.equals("display")) {
readDisplay(parser);
+ } else if (tagName.equals("config")) {
+ readConfig(parser);
} else {
Slog.w(TAG, "Unknown element under <display-settings>: "
+ parser.getName());
@@ -491,22 +557,26 @@
XmlUtils.skipCurrentTag(parser);
}
+ private void readConfig(XmlPullParser parser) throws NumberFormatException,
+ XmlPullParserException, IOException {
+ mIdentifier = getIntAttribute(parser, "identifier");
+ XmlUtils.skipCurrentTag(parser);
+ }
+
private void writeSettingsIfNeeded(Entry changedEntry, DisplayInfo displayInfo) {
- if (changedEntry.isEmpty()) {
- boolean removed = mEntries.remove(displayInfo.uniqueId) != null;
- // Legacy name might have been in used, so we need to clear it.
- removed |= mEntries.remove(displayInfo.name) != null;
- if (!removed) {
- // The entry didn't exist so nothing is changed and no need to update the file.
- return;
- }
- } else {
- mEntries.put(displayInfo.uniqueId, changedEntry);
+ if (changedEntry.isEmpty() && !removeEntry(displayInfo)) {
+ // The entry didn't exist so nothing is changed and no need to update the file.
+ return;
}
- FileOutputStream stream;
+ mEntries.put(getIdentifier(displayInfo), changedEntry);
+ writeSettings();
+ }
+
+ private void writeSettings() {
+ OutputStream stream;
try {
- stream = mFile.startWrite();
+ stream = mStorage.startWrite();
} catch (IOException e) {
Slog.w(TAG, "Failed to write display settings: " + e);
return;
@@ -516,8 +586,13 @@
XmlSerializer out = new FastXmlSerializer();
out.setOutput(stream, StandardCharsets.UTF_8.name());
out.startDocument(null, true);
+
out.startTag(null, "display-settings");
+ out.startTag(null, "config");
+ out.attribute(null, "identifier", Integer.toString(mIdentifier));
+ out.endTag(null, "config");
+
for (Entry entry : mEntries.values()) {
out.startTag(null, "display");
out.attribute(null, "name", entry.mName);
@@ -578,10 +653,66 @@
out.endTag(null, "display-settings");
out.endDocument();
- mFile.finishWrite(stream);
+ mStorage.finishWrite(stream, true /* success */);
} catch (IOException e) {
- Slog.w(TAG, "Failed to write display settings, restoring backup.", e);
- mFile.failWrite(stream);
+ Slog.w(TAG, "Failed to write display window settings.", e);
+ mStorage.finishWrite(stream, false /* success */);
+ }
+ }
+
+ /**
+ * Removes an entry from {@link #mEntries} cache. Looks up by new and previously used
+ * identifiers.
+ */
+ private boolean removeEntry(DisplayInfo displayInfo) {
+ // Remove entry based on primary identifier.
+ boolean removed = mEntries.remove(getIdentifier(displayInfo)) != null;
+ // Ensure that legacy entries are cleared as well.
+ removed |= mEntries.remove(displayInfo.uniqueId) != null;
+ removed |= mEntries.remove(displayInfo.name) != null;
+ return removed;
+ }
+
+ /** Gets the identifier of choice for the current config. */
+ private String getIdentifier(DisplayInfo displayInfo) {
+ if (mIdentifier == IDENTIFIER_PORT && displayInfo.address != null) {
+ // Config suggests using port as identifier for physical displays.
+ if (displayInfo.address instanceof DisplayAddress.Physical) {
+ return "port:" + ((DisplayAddress.Physical) displayInfo.address).getPort();
+ }
+ }
+ return displayInfo.uniqueId;
+ }
+
+ private static class AtomicFileStorage implements SettingPersister {
+ private final AtomicFile mAtomicFile;
+
+ AtomicFileStorage() {
+ final File folder = new File(Environment.getDataDirectory(), "system");
+ mAtomicFile = new AtomicFile(new File(folder, "display_settings.xml"), "wm-displays");
+ }
+
+ @Override
+ public InputStream openRead() throws FileNotFoundException {
+ return mAtomicFile.openRead();
+ }
+
+ @Override
+ public OutputStream startWrite() throws IOException {
+ return mAtomicFile.startWrite();
+ }
+
+ @Override
+ public void finishWrite(OutputStream os, boolean success) {
+ if (!(os instanceof FileOutputStream)) {
+ throw new IllegalArgumentException("Unexpected OutputStream as argument: " + os);
+ }
+ FileOutputStream fos = (FileOutputStream) os;
+ if (success) {
+ mAtomicFile.finishWrite(fos);
+ } else {
+ mAtomicFile.failWrite(fos);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index dceed28..1b4aa26 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -471,6 +471,20 @@
}
}
+ boolean hasActivityInVisibleTask() {
+ for (int i = mActivities.size() - 1; i >= 0; --i) {
+ TaskRecord task = mActivities.get(i).getTaskRecord();
+ if (task == null) {
+ continue;
+ }
+ ActivityRecord topActivity = task.getTopActivity();
+ if (topActivity != null && topActivity.visible) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Update the top resuming activity in process for pre-Q apps, only the top-most visible
* activities are allowed to be resumed per process.
diff --git a/services/net/Android.bp b/services/net/Android.bp
index 9e1d44b..67fbdc4 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -25,7 +25,6 @@
local_include_dir: "java",
include_dirs: ["frameworks/base/core/java"], // For framework parcelables.
srcs: [
- "java/android/net/ApfCapabilitiesParcelable.aidl",
"java/android/net/DhcpResultsParcelable.aidl",
"java/android/net/IIpMemoryStore.aidl",
"java/android/net/IIpMemoryStoreCallbacks.aidl",
@@ -36,7 +35,6 @@
"java/android/net/InitialConfigurationParcelable.aidl",
"java/android/net/PrivateDnsConfigParcel.aidl",
"java/android/net/ProvisioningConfigurationParcelable.aidl",
- "java/android/net/StaticIpConfigurationParcelable.aidl",
"java/android/net/TcpKeepalivePacketDataParcelable.aidl",
"java/android/net/dhcp/DhcpServingParamsParcel.aidl",
"java/android/net/dhcp/IDhcpServer.aidl",
diff --git a/services/net/java/android/net/DhcpResultsParcelable.aidl b/services/net/java/android/net/DhcpResultsParcelable.aidl
index cf5629b..978638b 100644
--- a/services/net/java/android/net/DhcpResultsParcelable.aidl
+++ b/services/net/java/android/net/DhcpResultsParcelable.aidl
@@ -16,10 +16,10 @@
package android.net;
-import android.net.StaticIpConfigurationParcelable;
+import android.net.StaticIpConfiguration;
parcelable DhcpResultsParcelable {
- StaticIpConfigurationParcelable baseConfiguration;
+ StaticIpConfiguration baseConfiguration;
int leaseDuration;
int mtu;
String serverAddress;
diff --git a/services/net/java/android/net/ProvisioningConfigurationParcelable.aidl b/services/net/java/android/net/ProvisioningConfigurationParcelable.aidl
index 5b46d7f..99606fb 100644
--- a/services/net/java/android/net/ProvisioningConfigurationParcelable.aidl
+++ b/services/net/java/android/net/ProvisioningConfigurationParcelable.aidl
@@ -17,10 +17,10 @@
package android.net;
-import android.net.ApfCapabilitiesParcelable;
import android.net.InitialConfigurationParcelable;
import android.net.Network;
-import android.net.StaticIpConfigurationParcelable;
+import android.net.StaticIpConfiguration;
+import android.net.apf.ApfCapabilities;
parcelable ProvisioningConfigurationParcelable {
boolean enableIPv4;
@@ -29,8 +29,8 @@
boolean usingIpReachabilityMonitor;
int requestedPreDhcpActionMs;
InitialConfigurationParcelable initialConfig;
- StaticIpConfigurationParcelable staticIpConfig;
- ApfCapabilitiesParcelable apfCapabilities;
+ StaticIpConfiguration staticIpConfig;
+ ApfCapabilities apfCapabilities;
int provisioningTimeoutMs;
int ipv6AddrGenMode;
Network network;
diff --git a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
index 6b5826f..44d8e0c 100644
--- a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
+++ b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
@@ -16,17 +16,10 @@
package android.net.shared;
-import static android.net.shared.ParcelableUtil.fromParcelableArray;
-import static android.net.shared.ParcelableUtil.toParcelableArray;
-
import android.annotation.Nullable;
-import android.net.ApfCapabilitiesParcelable;
import android.net.DhcpResults;
import android.net.DhcpResultsParcelable;
import android.net.InetAddresses;
-import android.net.StaticIpConfiguration;
-import android.net.StaticIpConfigurationParcelable;
-import android.net.apf.ApfCapabilities;
import java.net.Inet4Address;
import java.net.InetAddress;
@@ -38,44 +31,12 @@
*/
public final class IpConfigurationParcelableUtil {
/**
- * Convert a StaticIpConfiguration to a StaticIpConfigurationParcelable.
- */
- public static StaticIpConfigurationParcelable toStableParcelable(
- @Nullable StaticIpConfiguration config) {
- if (config == null) return null;
- final StaticIpConfigurationParcelable p = new StaticIpConfigurationParcelable();
- p.ipAddress = config.getIpAddress();
- p.gateway = parcelAddress(config.getGateway());
- p.dnsServers = toParcelableArray(
- config.getDnsServers(), IpConfigurationParcelableUtil::parcelAddress, String.class);
- p.domains = config.getDomains();
- return p;
- }
-
- /**
- * Convert a StaticIpConfigurationParcelable to a StaticIpConfiguration.
- */
- public static StaticIpConfiguration fromStableParcelable(
- @Nullable StaticIpConfigurationParcelable p) {
- if (p == null) return null;
- final StaticIpConfiguration config = new StaticIpConfiguration();
- config.setIpAddress(p.ipAddress);
- config.setGateway(unparcelAddress(p.gateway));
- for (InetAddress addr : fromParcelableArray(
- p.dnsServers, IpConfigurationParcelableUtil::unparcelAddress)) {
- config.addDnsServer(addr);
- }
- config.setDomains(p.domains);
- return config;
- }
-
- /**
* Convert DhcpResults to a DhcpResultsParcelable.
*/
public static DhcpResultsParcelable toStableParcelable(@Nullable DhcpResults results) {
if (results == null) return null;
final DhcpResultsParcelable p = new DhcpResultsParcelable();
- p.baseConfiguration = toStableParcelable(results.toStaticIpConfiguration());
+ p.baseConfiguration = results.toStaticIpConfiguration();
p.leaseDuration = results.leaseDuration;
p.mtu = results.mtu;
p.serverAddress = parcelAddress(results.serverAddress);
@@ -88,7 +49,7 @@
*/
public static DhcpResults fromStableParcelable(@Nullable DhcpResultsParcelable p) {
if (p == null) return null;
- final DhcpResults results = new DhcpResults(fromStableParcelable(p.baseConfiguration));
+ final DhcpResults results = new DhcpResults(p.baseConfiguration);
results.leaseDuration = p.leaseDuration;
results.mtu = p.mtu;
results.serverAddress = (Inet4Address) unparcelAddress(p.serverAddress);
@@ -97,27 +58,6 @@
}
/**
- * Convert ApfCapabilities to ApfCapabilitiesParcelable.
- */
- public static ApfCapabilitiesParcelable toStableParcelable(@Nullable ApfCapabilities caps) {
- if (caps == null) return null;
- final ApfCapabilitiesParcelable p = new ApfCapabilitiesParcelable();
- p.apfVersionSupported = caps.apfVersionSupported;
- p.maximumApfProgramSize = caps.maximumApfProgramSize;
- p.apfPacketFormat = caps.apfPacketFormat;
- return p;
- }
-
- /**
- * Convert ApfCapabilitiesParcelable toApfCapabilities.
- */
- public static ApfCapabilities fromStableParcelable(@Nullable ApfCapabilitiesParcelable p) {
- if (p == null) return null;
- return new ApfCapabilities(
- p.apfVersionSupported, p.maximumApfProgramSize, p.apfPacketFormat);
- }
-
- /**
* Convert InetAddress to String.
* TODO: have an InetAddressParcelable
*/
diff --git a/services/net/java/android/net/shared/ProvisioningConfiguration.java b/services/net/java/android/net/shared/ProvisioningConfiguration.java
index 0aceb22..6f9c294 100644
--- a/services/net/java/android/net/shared/ProvisioningConfiguration.java
+++ b/services/net/java/android/net/shared/ProvisioningConfiguration.java
@@ -235,8 +235,10 @@
p.usingIpReachabilityMonitor = mUsingIpReachabilityMonitor;
p.requestedPreDhcpActionMs = mRequestedPreDhcpActionMs;
p.initialConfig = mInitialConfig == null ? null : mInitialConfig.toStableParcelable();
- p.staticIpConfig = IpConfigurationParcelableUtil.toStableParcelable(mStaticIpConfig);
- p.apfCapabilities = IpConfigurationParcelableUtil.toStableParcelable(mApfCapabilities);
+ p.staticIpConfig = mStaticIpConfig == null
+ ? null
+ : new StaticIpConfiguration(mStaticIpConfig);
+ p.apfCapabilities = mApfCapabilities; // ApfCapabilities is immutable
p.provisioningTimeoutMs = mProvisioningTimeoutMs;
p.ipv6AddrGenMode = mIPv6AddrGenMode;
p.network = mNetwork;
@@ -257,10 +259,10 @@
config.mUsingIpReachabilityMonitor = p.usingIpReachabilityMonitor;
config.mRequestedPreDhcpActionMs = p.requestedPreDhcpActionMs;
config.mInitialConfig = InitialConfiguration.fromStableParcelable(p.initialConfig);
- config.mStaticIpConfig = IpConfigurationParcelableUtil.fromStableParcelable(
- p.staticIpConfig);
- config.mApfCapabilities = IpConfigurationParcelableUtil.fromStableParcelable(
- p.apfCapabilities);
+ config.mStaticIpConfig = p.staticIpConfig == null
+ ? null
+ : new StaticIpConfiguration(p.staticIpConfig);
+ config.mApfCapabilities = p.apfCapabilities; // ApfCapabilities is immutable
config.mProvisioningTimeoutMs = p.provisioningTimeoutMs;
config.mIPv6AddrGenMode = p.ipv6AddrGenMode;
config.mNetwork = p.network;
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java
index e100d16..b0c97d1 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java
@@ -23,6 +23,7 @@
import android.os.Handler;
import android.os.HandlerThread;
+import android.platform.test.annotations.Presubmit;
import android.provider.DeviceConfig;
import com.android.server.appop.AppOpsService;
@@ -44,8 +45,9 @@
* Tests for {@link AppCompactor}.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:AppCompactorTest
+ * atest FrameworksMockingServicesTests:AppCompactorTest
*/
+@Presubmit
@RunWith(MockitoJUnitRunner.class)
public final class AppCompactorTest {
@@ -129,6 +131,12 @@
AppCompactor.KEY_COMPACT_THROTTLE_4,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_5,
+ Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_5 + 1), false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_6,
+ Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_6 + 1), false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
@@ -151,6 +159,10 @@
AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1);
assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(
AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f);
+ assertThat(mCompactorUnderTest.mCompactThrottleBFGS).isEqualTo(
+ AppCompactor.DEFAULT_COMPACT_THROTTLE_5 + 1);
+ assertThat(mCompactorUnderTest.mCompactThrottlePersistent).isEqualTo(
+ AppCompactor.DEFAULT_COMPACT_THROTTLE_6 + 1);
}
@Test
@@ -254,7 +266,7 @@
mCompactorUnderTest.init();
// When we override new reasonable throttle values after init...
- mCountDown = new CountDownLatch(4);
+ mCountDown = new CountDownLatch(6);
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppCompactor.KEY_COMPACT_THROTTLE_1,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
@@ -267,6 +279,12 @@
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppCompactor.KEY_COMPACT_THROTTLE_4,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_5,
+ Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_5 + 1), false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_6,
+ Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_6 + 1), false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
// Then those flags values are reflected in the compactor.
@@ -278,6 +296,10 @@
AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1);
assertThat(mCompactorUnderTest.mCompactThrottleFullFull).isEqualTo(
AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1);
+ assertThat(mCompactorUnderTest.mCompactThrottleBFGS).isEqualTo(
+ AppCompactor.DEFAULT_COMPACT_THROTTLE_5 + 1);
+ assertThat(mCompactorUnderTest.mCompactThrottlePersistent).isEqualTo(
+ AppCompactor.DEFAULT_COMPACT_THROTTLE_6 + 1);
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index bd7774a..5b19700 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -85,10 +85,11 @@
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.test.MoreAsserts;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.ArraySet;
import android.util.Pair;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.R;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.LocalServices;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
index 3d02576..2fbeebd 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
@@ -56,7 +56,7 @@
import java.util.Arrays;
-public class BaseLockSettingsServiceTests extends AndroidTestCase {
+public abstract class BaseLockSettingsServiceTests extends AndroidTestCase {
protected static final int PRIMARY_USER_ID = 0;
protected static final int MANAGED_PROFILE_USER_ID = 12;
protected static final int TURNED_OFF_PROFILE_USER_ID = 17;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/CachedSyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/CachedSyntheticPasswordTests.java
index ca4330f..d2a9145 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/CachedSyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/CachedSyntheticPasswordTests.java
@@ -26,6 +26,9 @@
import static org.mockito.Mockito.when;
import android.os.RemoteException;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.VerifyCredentialResponse;
@@ -40,6 +43,8 @@
* By default, those tests run without caching. Untrusted credential reset depends on caching so
* this class included those tests.
*/
+@SmallTest
+@Presubmit
public class CachedSyntheticPasswordTests extends SyntheticPasswordTests {
@Override
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
index 255e694b..7ebc745 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
@@ -26,8 +26,11 @@
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
import android.os.RemoteException;
+import android.platform.test.annotations.Presubmit;
import android.service.gatekeeper.GateKeeperResponse;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.VerifyCredentialResponse;
import com.android.server.locksettings.FakeGateKeeperService.VerifyHandle;
@@ -36,6 +39,8 @@
/**
* runtest frameworks-services -c com.android.server.locksettings.LockSettingsServiceTests
*/
+@SmallTest
+@Presubmit
public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
@Override
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java
index fcfc6d2..c00d33b 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java
@@ -21,7 +21,7 @@
import static com.android.internal.widget.LockPatternUtils.stringToPattern;
-import static junit.framework.Assert.*;
+import static junit.framework.Assert.assertEquals;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.any;
@@ -30,6 +30,10 @@
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
+import static java.io.FileDescriptor.err;
+import static java.io.FileDescriptor.in;
+import static java.io.FileDescriptor.out;
+
import android.app.ActivityManager;
import android.content.Context;
import android.os.Binder;
@@ -51,8 +55,6 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import static java.io.FileDescriptor.*;
-
/**
* Test class for {@link LockSettingsShellCommand}.
*
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java
index 6e1f357..8af4edd 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java
@@ -29,11 +29,14 @@
import android.os.FileUtils;
import android.os.UserManager;
import android.os.storage.StorageManager;
+import android.platform.test.annotations.Presubmit;
import android.test.AndroidTestCase;
import android.util.Log;
import android.util.Log.TerribleFailure;
import android.util.Log.TerribleFailureHandler;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.widget.LockPatternUtils;
import com.android.server.PersistentDataBlockManagerInternal;
import com.android.server.locksettings.LockSettingsStorage.CredentialHash;
@@ -48,6 +51,8 @@
/**
* runtest frameworks-services -c com.android.server.locksettings.LockSettingsStorageTests
*/
+@SmallTest
+@Presubmit
public class LockSettingsStorageTests extends AndroidTestCase {
private static final int SOME_USER_ID = 1034;
private final byte[] PASSWORD_0 = "thepassword0".getBytes();
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java b/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java
index 1d5a99b..31526b5 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java
@@ -16,8 +16,11 @@
package com.android.server.locksettings;
+import android.platform.test.annotations.Presubmit;
import android.test.AndroidTestCase;
+import androidx.test.filters.SmallTest;
+
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
@@ -25,6 +28,8 @@
import java.util.Map;
import java.util.Set;
+@SmallTest
+@Presubmit
public class PasswordSlotManagerTests extends AndroidTestCase {
PasswordSlotManagerTestable mManager;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/SP800DeriveTests.java b/services/tests/servicestests/src/com/android/server/locksettings/SP800DeriveTests.java
index fc2dcb9..29d0fc1 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/SP800DeriveTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/SP800DeriveTests.java
@@ -16,10 +16,15 @@
package com.android.server.locksettings;
+import android.platform.test.annotations.Presubmit;
import android.test.AndroidTestCase;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.util.HexDump;
+@SmallTest
+@Presubmit
public class SP800DeriveTests extends AndroidTestCase {
public void testFixedInput() throws Exception {
// CAVP: https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/key-derivation
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
index 5a9ca0f..0273f76 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
@@ -33,6 +33,9 @@
import android.app.admin.PasswordMetrics;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.VerifyCredentialResponse;
@@ -48,6 +51,8 @@
/**
* runtest frameworks-services -c com.android.server.locksettings.SyntheticPasswordTests
*/
+@SmallTest
+@Presubmit
public class SyntheticPasswordTests extends BaseLockSettingsServiceTests {
public static final byte[] PAYLOAD = new byte[] {1, 2, -1, -2, 55};
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/WeaverBasedSyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/WeaverBasedSyntheticPasswordTests.java
index 5e56704..abbf016 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/WeaverBasedSyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/WeaverBasedSyntheticPasswordTests.java
@@ -1,5 +1,11 @@
package com.android.server.locksettings;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+
+@SmallTest
+@Presubmit
public class WeaverBasedSyntheticPasswordTests extends SyntheticPasswordTests {
@Override
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 987d46a..a9eb6ec 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -4324,4 +4324,36 @@
assertEquals(IMPORTANCE_LOW, r.getAssistantImportance());
assertEquals(USER_SENTIMENT_NEUTRAL, r.getUserSentiment());
}
+
+ public void testAreNotificationsEnabledForPackage_crossUser() throws Exception {
+ try {
+ mBinderService.areNotificationsEnabledForPackage(mContext.getPackageName(),
+ mUid + UserHandle.PER_USER_RANGE);
+ fail("Cannot call cross user without permission");
+ } catch (SecurityException e) {
+ // pass
+ }
+
+ // cross user, with permission, no problem
+ TestablePermissions perms = mContext.getTestablePermissions();
+ perms.setPermission(android.Manifest.permission.INTERACT_ACROSS_USERS, PERMISSION_GRANTED);
+ mBinderService.areNotificationsEnabledForPackage(mContext.getPackageName(),
+ mUid + UserHandle.PER_USER_RANGE);
+ }
+
+ public void testAreBubblesAllowedForPackage_crossUser() throws Exception {
+ try {
+ mBinderService.areBubblesAllowedForPackage(mContext.getPackageName(),
+ mUid + UserHandle.PER_USER_RANGE);
+ fail("Cannot call cross user without permission");
+ } catch (SecurityException e) {
+ // pass
+ }
+
+ // cross user, with permission, no problem
+ TestablePermissions perms = mContext.getTestablePermissions();
+ perms.setPermission(android.Manifest.permission.INTERACT_ACROSS_USERS, PERMISSION_GRANTED);
+ mBinderService.areBubblesAllowedForPackage(mContext.getPackageName(),
+ mUid + UserHandle.PER_USER_RANGE);
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
index 9a8a732..652ea7d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
@@ -16,6 +16,8 @@
package com.android.server.wm;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.view.WindowManager.REMOVE_CONTENT_MODE_DESTROY;
import static android.view.WindowManager.REMOVE_CONTENT_MODE_MOVE_TO_PRIMARY;
@@ -40,7 +42,9 @@
import android.app.WindowConfiguration;
import android.platform.test.annotations.Presubmit;
+import android.util.Xml;
import android.view.Display;
+import android.view.DisplayAddress;
import android.view.DisplayInfo;
import android.view.Surface;
@@ -53,14 +57,22 @@
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoSession;
+import org.xmlpull.v1.XmlPullParser;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
/**
* Tests for the {@link DisplayWindowSettings} class.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:DisplayWindowSettingsTests
+ * atest WmTests:DisplayWindowSettingsTests
*/
@SmallTest
@Presubmit
@@ -69,12 +81,14 @@
private static final File TEST_FOLDER = getInstrumentation().getTargetContext().getCacheDir();
private DisplayWindowSettings mTarget;
- DisplayInfo mPrivateDisplayInfo;
+ private DisplayInfo mPrivateDisplayInfo;
private DisplayContent mPrimaryDisplay;
private DisplayContent mSecondaryDisplay;
private DisplayContent mPrivateDisplay;
+ private TestStorage mStorage;
+
@Before
public void setUp() throws Exception {
deleteRecursively(TEST_FOLDER);
@@ -83,7 +97,8 @@
mWm.setIsPc(false);
mWm.setForceDesktopModeOnExternalDisplays(false);
- mTarget = new DisplayWindowSettings(mWm, TEST_FOLDER);
+ mStorage = new TestStorage();
+ mTarget = new DisplayWindowSettings(mWm, mStorage);
mPrimaryDisplay = mWm.getDefaultDisplayContentLocked();
mSecondaryDisplay = mDisplayContent;
@@ -143,7 +158,7 @@
mTarget.applySettingsToDisplayLocked(mPrimaryDisplay);
- assertEquals(WindowConfiguration.WINDOWING_MODE_FREEFORM,
+ assertEquals(WINDOWING_MODE_FREEFORM,
mPrimaryDisplay.getWindowingMode());
}
@@ -185,7 +200,7 @@
mTarget.applySettingsToDisplayLocked(mSecondaryDisplay);
- assertEquals(WindowConfiguration.WINDOWING_MODE_FREEFORM,
+ assertEquals(WINDOWING_MODE_FREEFORM,
mSecondaryDisplay.getWindowingMode());
}
@@ -196,7 +211,7 @@
mTarget.applySettingsToDisplayLocked(mSecondaryDisplay);
- assertEquals(WindowConfiguration.WINDOWING_MODE_FREEFORM,
+ assertEquals(WINDOWING_MODE_FREEFORM,
mSecondaryDisplay.getWindowingMode());
}
@@ -474,6 +489,171 @@
mockitoSession.finishMocking();
}
+ @Test
+ public void testReadingDisplaySettingsFromStorage() {
+ final String displayIdentifier = mSecondaryDisplay.getDisplayInfo().uniqueId;
+ prepareDisplaySettings(displayIdentifier);
+
+ readAndAssertDisplaySettings(mPrimaryDisplay);
+ }
+
+ @Test
+ public void testReadingDisplaySettingsFromStorage_LegacyDisplayId() {
+ final String displayIdentifier = mPrimaryDisplay.getDisplayInfo().name;
+ prepareDisplaySettings(displayIdentifier);
+
+ readAndAssertDisplaySettings(mPrimaryDisplay);
+ }
+
+ @Test
+ public void testReadingDisplaySettingsFromStorage_LegacyDisplayId_UpdateAfterAccess()
+ throws Exception {
+ // Store display settings with legacy display identifier.
+ final String displayIdentifier = mPrimaryDisplay.getDisplayInfo().name;
+ prepareDisplaySettings(displayIdentifier);
+
+ // Update settings with new value, should trigger write to injector.
+ final DisplayWindowSettings settings = new DisplayWindowSettings(mWm, mStorage);
+ settings.setRemoveContentModeLocked(mPrimaryDisplay, REMOVE_CONTENT_MODE_MOVE_TO_PRIMARY);
+ assertEquals("Settings value must be updated", REMOVE_CONTENT_MODE_MOVE_TO_PRIMARY,
+ settings.getRemoveContentModeLocked(mPrimaryDisplay));
+ assertTrue(mStorage.wasWriteSuccessful());
+
+ // Verify that display identifier was updated.
+ final String newDisplayIdentifier = getStoredDisplayAttributeValue("name");
+ assertEquals("Display identifier must be updated to use uniqueId",
+ mPrimaryDisplay.getDisplayInfo().uniqueId, newDisplayIdentifier);
+ }
+
+ @Test
+ public void testReadingDisplaySettingsFromStorage_UsePortAsId() {
+ final DisplayAddress.Physical displayAddress = DisplayAddress.fromPhysicalDisplayId(123456);
+ mPrimaryDisplay.getDisplayInfo().address = displayAddress;
+
+ final String displayIdentifier = "port:" + displayAddress.getPort();
+ prepareDisplaySettings(displayIdentifier, true /* usePortAsId */);
+
+ readAndAssertDisplaySettings(mPrimaryDisplay);
+ }
+
+ @Test
+ public void testReadingDisplaySettingsFromStorage_UsePortAsId_IncorrectAddress() {
+ final String displayIdentifier = mPrimaryDisplay.getDisplayInfo().uniqueId;
+ prepareDisplaySettings(displayIdentifier, true /* usePortAsId */);
+
+ mPrimaryDisplay.getDisplayInfo().address = DisplayAddress.fromPhysicalDisplayId(123456);
+
+ // Verify that the entry is not matched and default settings are returned instead.
+ final DisplayWindowSettings settings = new DisplayWindowSettings(mWm);
+ assertNotEquals("Default setting must be returned for new entry",
+ WINDOWING_MODE_PINNED, settings.getWindowingModeLocked(mPrimaryDisplay));
+ }
+
+ @Test
+ public void testWritingDisplaySettingsToStorage() throws Exception {
+ // Write some settings to storage.
+ final DisplayWindowSettings settings = new DisplayWindowSettings(mWm, mStorage);
+ settings.setShouldShowSystemDecorsLocked(mSecondaryDisplay, true);
+ settings.setShouldShowImeLocked(mSecondaryDisplay, true);
+ assertTrue(mStorage.wasWriteSuccessful());
+
+ // Verify that settings were stored correctly.
+ assertEquals("Attribute value must be stored", mSecondaryDisplay.getDisplayInfo().uniqueId,
+ getStoredDisplayAttributeValue("name"));
+ assertEquals("Attribute value must be stored", "true",
+ getStoredDisplayAttributeValue("shouldShowSystemDecors"));
+ assertEquals("Attribute value must be stored", "true",
+ getStoredDisplayAttributeValue("shouldShowIme"));
+ }
+
+ @Test
+ public void testWritingDisplaySettingsToStorage_UsePortAsId() throws Exception {
+ // Store config to use port as identifier.
+ final DisplayAddress.Physical displayAddress = DisplayAddress.fromPhysicalDisplayId(123456);
+ mSecondaryDisplay.getDisplayInfo().address = displayAddress;
+ prepareDisplaySettings(null /* displayIdentifier */, true /* usePortAsId */);
+
+ // Write some settings.
+ final DisplayWindowSettings settings = new DisplayWindowSettings(mWm, mStorage);
+ settings.setShouldShowSystemDecorsLocked(mSecondaryDisplay, true);
+ settings.setShouldShowImeLocked(mSecondaryDisplay, true);
+ assertTrue(mStorage.wasWriteSuccessful());
+
+ // Verify that settings were stored correctly.
+ assertEquals("Attribute value must be stored", "port:" + displayAddress.getPort(),
+ getStoredDisplayAttributeValue("name"));
+ assertEquals("Attribute value must be stored", "true",
+ getStoredDisplayAttributeValue("shouldShowSystemDecors"));
+ assertEquals("Attribute value must be stored", "true",
+ getStoredDisplayAttributeValue("shouldShowIme"));
+ }
+
+ /**
+ * Prepares display settings and stores in {@link #mStorage}. Uses provided display identifier
+ * and stores windowingMode=WINDOWING_MODE_PINNED.
+ */
+ private void prepareDisplaySettings(String displayIdentifier) {
+ prepareDisplaySettings(displayIdentifier, false /* usePortAsId */);
+ }
+
+ private void prepareDisplaySettings(String displayIdentifier, boolean usePortAsId) {
+ String contents = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ + "<display-settings>\n";
+ if (usePortAsId) {
+ contents += " <config identifier=\"1\"/>\n";
+ }
+ if (displayIdentifier != null) {
+ contents += " <display\n"
+ + " name=\"" + displayIdentifier + "\"\n"
+ + " windowingMode=\"" + WINDOWING_MODE_PINNED + "\"/>\n";
+ }
+ contents += "</display-settings>\n";
+
+ final InputStream is = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8));
+ mStorage.setReadStream(is);
+ }
+
+ private void readAndAssertDisplaySettings(DisplayContent displayContent) {
+ final DisplayWindowSettings settings = new DisplayWindowSettings(mWm, mStorage);
+ assertEquals("Stored setting must be read",
+ WINDOWING_MODE_PINNED, settings.getWindowingModeLocked(displayContent));
+ assertEquals("Not stored setting must be set to default value",
+ REMOVE_CONTENT_MODE_MOVE_TO_PRIMARY,
+ settings.getRemoveContentModeLocked(displayContent));
+ }
+
+ private String getStoredDisplayAttributeValue(String attr) throws Exception {
+ try (InputStream stream = mStorage.openRead()) {
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(stream, StandardCharsets.UTF_8.name());
+ int type;
+ while ((type = parser.next()) != XmlPullParser.START_TAG
+ && type != XmlPullParser.END_DOCUMENT) {
+ // Do nothing.
+ }
+
+ if (type != XmlPullParser.START_TAG) {
+ throw new IllegalStateException("no start tag found");
+ }
+
+ int outerDepth = parser.getDepth();
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+ continue;
+ }
+
+ String tagName = parser.getName();
+ if (tagName.equals("display")) {
+ return parser.getAttributeValue(null, attr);
+ }
+ }
+ } finally {
+ mStorage.closeRead();
+ }
+ return null;
+ }
+
private static void assertOverscan(DisplayContent display, int left, int top, int right,
int bottom) {
final DisplayInfo info = display.getDisplayInfo();
@@ -490,7 +670,11 @@
* path that also means the previous state must be written correctly.
*/
private void applySettingsToDisplayByNewInstance(DisplayContent display) {
- new DisplayWindowSettings(mWm, TEST_FOLDER).applySettingsToDisplayLocked(display);
+ // Assert that prior write completed successfully.
+ assertTrue(mStorage.wasWriteSuccessful());
+
+ // Read and apply settings.
+ new DisplayWindowSettings(mWm, mStorage).applySettingsToDisplayLocked(display);
}
private static boolean deleteRecursively(File file) {
@@ -506,4 +690,81 @@
}
return fullyDeleted;
}
+
+ /** In-memory storage implementation. */
+ public class TestStorage implements DisplayWindowSettings.SettingPersister {
+ private InputStream mReadStream;
+ private ByteArrayOutputStream mWriteStream;
+
+ private boolean mWasSuccessful;
+
+ /**
+ * Returns input stream for reading. By default tries forward the output stream if previous
+ * write was successful.
+ * @see #closeRead()
+ */
+ @Override
+ public InputStream openRead() throws FileNotFoundException {
+ if (mReadStream == null && mWasSuccessful) {
+ mReadStream = new ByteArrayInputStream(mWriteStream.toByteArray());
+ }
+ if (mReadStream == null) {
+ throw new FileNotFoundException();
+ }
+ if (mReadStream.markSupported()) {
+ mReadStream.mark(Integer.MAX_VALUE);
+ }
+ return mReadStream;
+ }
+
+ /** Must be called after each {@link #openRead} to reset the position in the stream. */
+ void closeRead() throws IOException {
+ if (mReadStream == null) {
+ throw new FileNotFoundException();
+ }
+ if (mReadStream.markSupported()) {
+ mReadStream.reset();
+ }
+ mReadStream = null;
+ }
+
+ /**
+ * Creates new or resets existing output stream for write. Automatically closes previous
+ * read stream, since following reads should happen based on this new write.
+ */
+ @Override
+ public OutputStream startWrite() throws IOException {
+ if (mWriteStream == null) {
+ mWriteStream = new ByteArrayOutputStream();
+ } else {
+ mWriteStream.reset();
+ }
+ if (mReadStream != null) {
+ closeRead();
+ }
+ return mWriteStream;
+ }
+
+ @Override
+ public void finishWrite(OutputStream os, boolean success) {
+ mWasSuccessful = success;
+ try {
+ os.close();
+ } catch (IOException e) {
+ // This method can't throw IOException since the super implementation doesn't, so
+ // we just wrap it in a RuntimeException so we end up crashing the test all the
+ // same.
+ throw new RuntimeException(e);
+ }
+ }
+
+ /** Override the read stream of the injector. By default it uses current write stream. */
+ private void setReadStream(InputStream is) {
+ mReadStream = is;
+ }
+
+ private boolean wasWriteSuccessful() {
+ return mWasSuccessful;
+ }
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskPositioningControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskPositioningControllerTests.java
index 00e479f..7cfe71e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskPositioningControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskPositioningControllerTests.java
@@ -32,6 +32,7 @@
import android.platform.test.annotations.Presubmit;
import android.view.InputChannel;
+import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -60,10 +61,9 @@
mWindow.mInputChannel = new InputChannel();
synchronized (mWm.mGlobalLock) {
mWm.mWindowMap.put(mWindow.mClient.asBinder(), mWindow);
+ spyOn(mDisplayContent);
+ doReturn(mock(InputMonitor.class)).when(mDisplayContent).getInputMonitor();
}
-
- spyOn(mDisplayContent);
- doReturn(mock(InputMonitor.class)).when(mDisplayContent).getInputMonitor();
}
@Test
@@ -88,6 +88,7 @@
assertNull(mTarget.getDragWindowHandleLocked());
}
+ @FlakyTest(bugId = 129331490)
@Test
public void testHandleTapOutsideTask() {
synchronized (mWm.mGlobalLock) {
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index 8feed7f..a783a40 100644
--- a/services/usage/java/com/android/server/usage/IntervalStats.java
+++ b/services/usage/java/com/android/server/usage/IntervalStats.java
@@ -66,7 +66,7 @@
public final ArrayMap<String, UsageStats> packageStats = new ArrayMap<>();
public final ArrayMap<Configuration, ConfigurationStats> configurations = new ArrayMap<>();
public Configuration activeConfiguration;
- public EventList events = new EventList();
+ public final EventList events = new EventList();
// A string cache. This is important as when we're parsing XML files, we don't want to
// keep hundreds of strings that have the same contents. We will read the string
@@ -82,7 +82,7 @@
public void commitTime(long timeStamp) {
if (curStartTime != 0) {
- duration += timeStamp - duration;
+ duration += timeStamp - curStartTime;
curStartTime = 0;
}
}
@@ -305,7 +305,9 @@
UsageStats usageStats = getOrCreateUsageStats(packageName);
usageStats.update(className, timeStamp, eventType, instanceId);
}
- endTime = timeStamp;
+ if (timeStamp > endTime) {
+ endTime = timeStamp;
+ }
}
/**
@@ -328,6 +330,9 @@
event.mNotificationChannelId = getCachedStringRef(event.mNotificationChannelId);
}
events.insert(event);
+ if (event.mTimeStamp > endTime) {
+ endTime = event.mTimeStamp;
+ }
}
void updateChooserCounts(String packageName, String category, String action) {
@@ -360,8 +365,9 @@
configStats.mActivationCount += 1;
activeConfiguration = configStats.mConfiguration;
}
-
- endTime = timeStamp;
+ if (timeStamp > endTime) {
+ endTime = timeStamp;
+ }
}
void incrementAppLaunchCount(String packageName) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
index 485a79d..c55bb3c 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
@@ -1166,7 +1166,8 @@
if (beingRestored == null) return null;
beingRestored.activeConfiguration = onDevice.activeConfiguration;
beingRestored.configurations.putAll(onDevice.configurations);
- beingRestored.events = onDevice.events;
+ beingRestored.events.clear();
+ beingRestored.events.merge(onDevice.events);
return beingRestored;
}
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index 9498e16..26bfcc9 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -334,7 +334,7 @@
final IntervalStats diskStats = mDatabase.getLatestUsageStats(
INTERVAL_DAILY);
StringBuilder sb = new StringBuilder(256);
- sb.append("Last 24 hours of UsageStats missing! timeRange : ");
+ sb.append("Recent UsageStats missing! timeRange : ");
sb.append(beginTime);
sb.append(", ");
sb.append(endTime);
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 0a9b904..fffa935 100755
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1852,6 +1852,14 @@
"editable_wfc_roaming_mode_bool";
/**
+ * Flag specifying wether to show blocking pay phone option in blocked numbers screen. Only show
+ * the option if payphone call presentation represents in the carrier's region.
+ * @hide
+ */
+ public static final java.lang.String KEY_SHOW_BLOCKING_PAY_PHONE_OPTION_BOOL =
+ "show_blocking_pay_phone_option_bool";
+
+ /**
* Flag specifying whether the carrier will use the WFC home network mode in roaming network.
* {@code false} - roaming preference can be selected separately from the home preference.
* {@code true} - roaming preference is the same as home preference and
@@ -3024,6 +3032,7 @@
sDefaults.putBoolean(KEY_NOTIFY_VT_HANDOVER_TO_WIFI_FAILURE_BOOL, false);
sDefaults.putStringArray(KEY_FILTERED_CNAP_NAMES_STRING_ARRAY, null);
sDefaults.putBoolean(KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, false);
+ sDefaults.putBoolean(KEY_SHOW_BLOCKING_PAY_PHONE_OPTION_BOOL, false);
sDefaults.putBoolean(KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, false);
sDefaults.putBoolean(KEY_STK_DISABLE_LAUNCH_BROWSER_BOOL, false);
sDefaults.putBoolean(KEY_ALLOW_METERED_NETWORK_FOR_CERT_DOWNLOAD_BOOL, false);
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index dde8057..09046a6 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -27,10 +27,6 @@
import android.annotation.UnsupportedAppUsage;
import android.app.ActivityThread;
import android.app.PendingIntent;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothMapClient;
-import android.bluetooth.BluetoothProfile;
import android.content.ActivityNotFoundException;
import android.content.ContentValues;
import android.content.Context;
@@ -43,7 +39,6 @@
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.telecom.PhoneAccount;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
@@ -76,7 +71,6 @@
*/
public final class SmsManager {
private static final String TAG = "SmsManager";
- private static final boolean DBG = false;
/**
* A psuedo-subId that represents the default subId at any given time. The actual subId it
@@ -357,42 +351,11 @@
throw new IllegalArgumentException("Invalid message body");
}
- // A Manager code accessing another manager is *not* acceptable, in Android.
- // In this particular case, it is unavoidable because of the following:
- // If the subscription for this SmsManager instance belongs to a remote SIM
- // then a listener to get BluetoothMapClient proxy needs to be started up.
- // Doing that is possible only in a foreground thread or as a system user.
- // i.e., Can't be done in ISms service.
- // For that reason, SubscriptionManager needs to be accessed here to determine
- // if the subscription belongs to a remote SIM.
- // Ideally, there should be another API in ISms to service messages going thru
- // remote SIM subscriptions (and ISms should be tweaked to be able to access
- // BluetoothMapClient proxy)
- Context context = ActivityThread.currentApplication().getApplicationContext();
- SubscriptionManager manager = (SubscriptionManager) context
- .getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
- int subId = getSubscriptionId();
- SubscriptionInfo info = manager.getActiveSubscriptionInfo(subId);
- if (DBG) {
- Log.d(TAG, "for subId: " + subId + ", subscription-info: " + info);
- }
-
- /* If the Subscription associated with this SmsManager instance belongs to a remote-sim,
- * then send the message thru the remote-sim subscription.
- */
- if (info != null
- && info.getSubscriptionType() == SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM) {
- if (DBG) Log.d(TAG, "sending message thru bluetooth");
- sendTextMessageBluetooth(destinationAddress, scAddress, text, sentIntent,
- deliveryIntent, info);
- return;
- }
-
try {
// If the subscription is invalid or default, we will use the default phone to send the
// SMS and possibly fail later in the SMS sending process.
- ISms iccISms = getISmsServiceOrThrow();
- iccISms.sendTextForSubscriber(subId, ActivityThread.currentPackageName(),
+ ISms iSms = getISmsServiceOrThrow();
+ iSms.sendTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(),
destinationAddress,
scAddress, text, sentIntent, deliveryIntent,
persistMessage);
@@ -401,82 +364,6 @@
}
}
- private void sendTextMessageBluetooth(String destAddr, String scAddress,
- String text, PendingIntent sentIntent, PendingIntent deliveryIntent,
- SubscriptionInfo info) {
- BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
- if (btAdapter == null) {
- // No bluetooth service on this platform?
- sendErrorInPendingIntent(sentIntent, SmsManager.RESULT_ERROR_NO_SERVICE);
- return;
- }
- BluetoothDevice device = btAdapter.getRemoteDevice(info.getIccId());
- if (device == null) {
- if (DBG) Log.d(TAG, "Bluetooth device addr invalid: " + info.getIccId());
- sendErrorInPendingIntent(sentIntent, SmsManager.RESULT_ERROR_NO_SERVICE);
- return;
- }
- btAdapter.getProfileProxy(ActivityThread.currentApplication().getApplicationContext(),
- new MapMessageSender(destAddr, text, device, sentIntent, deliveryIntent),
- BluetoothProfile.MAP_CLIENT);
- }
-
- private class MapMessageSender implements BluetoothProfile.ServiceListener {
- final Uri[] mDestAddr;
- private String mMessage;
- final BluetoothDevice mDevice;
- final PendingIntent mSentIntent;
- final PendingIntent mDeliveryIntent;
- MapMessageSender(final String destAddr, final String message, final BluetoothDevice device,
- final PendingIntent sentIntent, final PendingIntent deliveryIntent) {
- super();
- mDestAddr = new Uri[] {new Uri.Builder()
- .appendPath(destAddr)
- .scheme(PhoneAccount.SCHEME_TEL)
- .build()};
- mMessage = message;
- mDevice = device;
- mSentIntent = sentIntent;
- mDeliveryIntent = deliveryIntent;
- }
-
- @Override
- public void onServiceConnected(int profile, BluetoothProfile proxy) {
- if (DBG) Log.d(TAG, "Service connected");
- if (profile != BluetoothProfile.MAP_CLIENT) return;
- BluetoothMapClient mapProfile = (BluetoothMapClient) proxy;
- if (mMessage != null) {
- if (DBG) Log.d(TAG, "Sending message thru bluetooth");
- mapProfile.sendMessage(mDevice, mDestAddr, mMessage, mSentIntent, mDeliveryIntent);
- mMessage = null;
- }
- BluetoothAdapter.getDefaultAdapter()
- .closeProfileProxy(BluetoothProfile.MAP_CLIENT, mapProfile);
- }
-
- @Override
- public void onServiceDisconnected(int profile) {
- if (mMessage != null) {
- if (DBG) Log.d(TAG, "Bluetooth disconnected before sending the message");
- sendErrorInPendingIntent(mSentIntent, SmsManager.RESULT_ERROR_NO_SERVICE);
- mMessage = null;
- }
- }
- }
-
- private void sendErrorInPendingIntent(PendingIntent intent, int errorCode) {
- if (intent == null) {
- return;
- }
- try {
- intent.send(errorCode);
- } catch (PendingIntent.CanceledException e) {
- // PendingIntent is cancelled. ignore sending this error code back to
- // caller.
- if (DBG) Log.d(TAG, "PendingIntent.CanceledException: " + e.getMessage());
- }
- }
-
/**
* Send a text based SMS without writing it into the SMS Provider.
*
@@ -526,8 +413,8 @@
}
try {
- ISms iccISms = getISmsServiceOrThrow();
- iccISms.sendTextForSubscriberWithSelfPermissions(getSubscriptionId(),
+ ISms iSms = getISmsServiceOrThrow();
+ iSms.sendTextForSubscriberWithSelfPermissions(getSubscriptionId(),
ActivityThread.currentPackageName(),
destinationAddress,
scAddress, text, sentIntent, deliveryIntent, persistMessage);
@@ -610,9 +497,9 @@
}
try {
- ISms iccISms = getISmsServiceOrThrow();
- if (iccISms != null) {
- iccISms.sendTextForSubscriberWithOptions(getSubscriptionId(),
+ ISms iSms = getISmsServiceOrThrow();
+ if (iSms != null) {
+ iSms.sendTextForSubscriberWithOptions(getSubscriptionId(),
ActivityThread.currentPackageName(), destinationAddress, scAddress, text,
sentIntent, deliveryIntent, persistMessage, priority, expectMore,
validityPeriod);
@@ -671,9 +558,9 @@
"Invalid pdu format. format must be either 3gpp or 3gpp2");
}
try {
- ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
- if (iccISms != null) {
- iccISms.injectSmsPduForSubscriber(
+ ISms iSms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
+ if (iSms != null) {
+ iSms.injectSmsPduForSubscriber(
getSubscriptionId(), pdu, format, receivedIntent);
}
} catch (RemoteException ex) {
@@ -759,8 +646,8 @@
if (parts.size() > 1) {
try {
- ISms iccISms = getISmsServiceOrThrow();
- iccISms.sendMultipartTextForSubscriber(getSubscriptionId(),
+ ISms iSms = getISmsServiceOrThrow();
+ iSms.sendMultipartTextForSubscriber(getSubscriptionId(),
ActivityThread.currentPackageName(),
destinationAddress, scAddress, parts,
sentIntents, deliveryIntents, persistMessage);
@@ -891,9 +778,9 @@
if (parts.size() > 1) {
try {
- ISms iccISms = getISmsServiceOrThrow();
- if (iccISms != null) {
- iccISms.sendMultipartTextForSubscriberWithOptions(getSubscriptionId(),
+ ISms iSms = getISmsServiceOrThrow();
+ if (iSms != null) {
+ iSms.sendMultipartTextForSubscriberWithOptions(getSubscriptionId(),
ActivityThread.currentPackageName(), destinationAddress, scAddress,
parts, sentIntents, deliveryIntents, persistMessage, priority,
expectMore, validityPeriod);
@@ -979,8 +866,8 @@
}
try {
- ISms iccISms = getISmsServiceOrThrow();
- iccISms.sendDataForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(),
+ ISms iSms = getISmsServiceOrThrow();
+ iSms.sendDataForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(),
destinationAddress, scAddress, destinationPort & 0xFFFF,
data, sentIntent, deliveryIntent);
} catch (RemoteException ex) {
@@ -1006,8 +893,8 @@
}
try {
- ISms iccISms = getISmsServiceOrThrow();
- iccISms.sendDataForSubscriberWithSelfPermissions(getSubscriptionId(),
+ ISms iSms = getISmsServiceOrThrow();
+ iSms.sendDataForSubscriberWithSelfPermissions(getSubscriptionId(),
ActivityThread.currentPackageName(), destinationAddress, scAddress,
destinationPort & 0xFFFF, data, sentIntent, deliveryIntent);
} catch (RemoteException ex) {
@@ -1069,9 +956,9 @@
boolean isSmsSimPickActivityNeeded = false;
final Context context = ActivityThread.currentApplication().getApplicationContext();
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- isSmsSimPickActivityNeeded = iccISms.isSmsSimPickActivityNeeded(subId);
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ isSmsSimPickActivityNeeded = iSms.isSmsSimPickActivityNeeded(subId);
}
} catch (RemoteException ex) {
Log.e(TAG, "Exception in getSubscriptionId");
@@ -1102,11 +989,11 @@
* the service does not exist.
*/
private static ISms getISmsServiceOrThrow() {
- ISms iccISms = getISmsService();
- if (iccISms == null) {
+ ISms iSms = getISmsService();
+ if (iSms == null) {
throw new UnsupportedOperationException("Sms is not supported");
}
- return iccISms;
+ return iSms;
}
private static ISms getISmsService() {
@@ -1135,9 +1022,9 @@
throw new IllegalArgumentException("pdu is NULL");
}
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- success = iccISms.copyMessageToIccEfForSubscriber(getSubscriptionId(),
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ success = iSms.copyMessageToIccEfForSubscriber(getSubscriptionId(),
ActivityThread.currentPackageName(),
status, pdu, smsc);
}
@@ -1166,9 +1053,9 @@
Arrays.fill(pdu, (byte)0xff);
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- success = iccISms.updateMessageOnIccEfForSubscriber(getSubscriptionId(),
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ success = iSms.updateMessageOnIccEfForSubscriber(getSubscriptionId(),
ActivityThread.currentPackageName(),
messageIndex, STATUS_ON_ICC_FREE, pdu);
}
@@ -1198,9 +1085,9 @@
boolean success = false;
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- success = iccISms.updateMessageOnIccEfForSubscriber(getSubscriptionId(),
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ success = iSms.updateMessageOnIccEfForSubscriber(getSubscriptionId(),
ActivityThread.currentPackageName(),
messageIndex, newStatus, pdu);
}
@@ -1225,9 +1112,9 @@
List<SmsRawData> records = null;
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- records = iccISms.getAllMessagesFromIccEfForSubscriber(
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ records = iSms.getAllMessagesFromIccEfForSubscriber(
getSubscriptionId(),
ActivityThread.currentPackageName());
}
@@ -1262,9 +1149,9 @@
boolean success = false;
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- success = iccISms.enableCellBroadcastForSubscriber(
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ success = iSms.enableCellBroadcastForSubscriber(
getSubscriptionId(), messageIdentifier, ranType);
}
} catch (RemoteException ex) {
@@ -1298,9 +1185,9 @@
boolean success = false;
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- success = iccISms.disableCellBroadcastForSubscriber(
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ success = iSms.disableCellBroadcastForSubscriber(
getSubscriptionId(), messageIdentifier, ranType);
}
} catch (RemoteException ex) {
@@ -1341,9 +1228,9 @@
throw new IllegalArgumentException("endMessageId < startMessageId");
}
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- success = iccISms.enableCellBroadcastRangeForSubscriber(getSubscriptionId(),
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ success = iSms.enableCellBroadcastRangeForSubscriber(getSubscriptionId(),
startMessageId, endMessageId, ranType);
}
} catch (RemoteException ex) {
@@ -1384,9 +1271,9 @@
throw new IllegalArgumentException("endMessageId < startMessageId");
}
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- success = iccISms.disableCellBroadcastRangeForSubscriber(getSubscriptionId(),
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ success = iSms.disableCellBroadcastRangeForSubscriber(getSubscriptionId(),
startMessageId, endMessageId, ranType);
}
} catch (RemoteException ex) {
@@ -1436,9 +1323,9 @@
public boolean isImsSmsSupported() {
boolean boSupported = false;
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- boSupported = iccISms.isImsSmsSupportedForSubscriber(getSubscriptionId());
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ boSupported = iSms.isImsSmsSupportedForSubscriber(getSubscriptionId());
}
} catch (RemoteException ex) {
// ignore it
@@ -1461,9 +1348,9 @@
public String getImsSmsFormat() {
String format = com.android.internal.telephony.SmsConstants.FORMAT_UNKNOWN;
try {
- ISms iccISms = getISmsService();
- if (iccISms != null) {
- format = iccISms.getImsSmsFormatForSubscriber(getSubscriptionId());
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ format = iSms.getImsSmsFormatForSubscriber(getSubscriptionId());
}
} catch (RemoteException ex) {
// ignore it
@@ -1477,10 +1364,10 @@
* @return the default SMS subscription id
*/
public static int getDefaultSmsSubscriptionId() {
- ISms iccISms = null;
+ ISms iSms = null;
try {
- iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
- return iccISms.getPreferredSmsSubscription();
+ iSms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
+ return iSms.getPreferredSmsSubscription();
} catch (RemoteException ex) {
return -1;
} catch (NullPointerException ex) {
@@ -1496,10 +1383,10 @@
*/
@UnsupportedAppUsage
public boolean isSMSPromptEnabled() {
- ISms iccISms = null;
+ ISms iSms = null;
try {
- iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
- return iccISms.isSMSPromptEnabled();
+ iSms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
+ return iSms.isSMSPromptEnabled();
} catch (RemoteException ex) {
return false;
} catch (NullPointerException ex) {
@@ -1976,8 +1863,8 @@
throw new IllegalArgumentException("Empty message URI");
}
try {
- ISms iccISms = getISmsServiceOrThrow();
- iccISms.sendStoredText(
+ ISms iSms = getISmsServiceOrThrow();
+ iSms.sendStoredText(
getSubscriptionId(), ActivityThread.currentPackageName(), messageUri,
scAddress, sentIntent, deliveryIntent);
} catch (RemoteException ex) {
@@ -2024,8 +1911,8 @@
throw new IllegalArgumentException("Empty message URI");
}
try {
- ISms iccISms = getISmsServiceOrThrow();
- iccISms.sendStoredMultipartText(
+ ISms iSms = getISmsServiceOrThrow();
+ iSms.sendStoredMultipartText(
getSubscriptionId(), ActivityThread.currentPackageName(), messageUri,
scAddress, sentIntents, deliveryIntents);
} catch (RemoteException ex) {
diff --git a/tests/TouchLatency/app/build.gradle b/tests/TouchLatency/app/build.gradle
index 2594322..04a8788 100644
--- a/tests/TouchLatency/app/build.gradle
+++ b/tests/TouchLatency/app/build.gradle
@@ -6,7 +6,7 @@
defaultConfig {
applicationId "com.prefabulated.touchlatency"
- minSdkVersion 21
+ minSdkVersion 28
targetSdkVersion 28
versionCode 1
versionName "1.0"
diff --git a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java
index 360c22f..ba77a74 100644
--- a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java
+++ b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java
@@ -24,11 +24,15 @@
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
+import android.view.Display;
+import android.view.Display.Mode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.os.Trace;
+import android.view.Window;
+import android.view.WindowManager;
import java.math.RoundingMode;
import java.text.DecimalFormat;
@@ -219,14 +223,30 @@
}
public class TouchLatencyActivity extends Activity {
+ private Mode mDisplayModes[];
+ private int mCurrentModeIndex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
Trace.beginSection("TouchLatencyActivity onCreate");
setContentView(R.layout.activity_touch_latency);
mTouchView = findViewById(R.id.canvasView);
+
+ WindowManager wm = getWindowManager();
+ Display display = wm.getDefaultDisplay();
+ mDisplayModes = display.getSupportedModes();
+ Mode currentMode = getWindowManager().getDefaultDisplay().getMode();
+
+ for (int i = 0; i < mDisplayModes.length; i++) {
+ if (currentMode.getModeId() == mDisplayModes[i].getModeId()) {
+ mCurrentModeIndex = i;
+ break;
+ }
+ }
+
Trace.endSection();
}
@@ -236,10 +256,35 @@
Trace.beginSection("TouchLatencyActivity onCreateOptionsMenu");
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_touch_latency, menu);
+ if (mDisplayModes.length > 1) {
+ MenuItem menuItem = menu.findItem(R.id.display_mode);
+ Mode currentMode = getWindowManager().getDefaultDisplay().getMode();
+ updateDisplayMode(menuItem, currentMode);
+ }
Trace.endSection();
return true;
}
+
+ private void updateDisplayMode(MenuItem menuItem, Mode displayMode) {
+ int fps = (int) displayMode.getRefreshRate();
+ menuItem.setTitle(fps + "hz");
+ menuItem.setVisible(true);
+ }
+
+ public void changeDisplayMode(MenuItem item) {
+ Window w = getWindow();
+ WindowManager.LayoutParams params = w.getAttributes();
+
+ int modeIndex = (mCurrentModeIndex + 1) % mDisplayModes.length;
+ params.preferredDisplayModeId = mDisplayModes[modeIndex].getModeId();
+ w.setAttributes(params);
+
+ updateDisplayMode(item, mDisplayModes[modeIndex]);
+ mCurrentModeIndex = modeIndex;
+ }
+
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Trace.beginSection("TouchLatencyActivity onOptionsItemSelected");
@@ -251,6 +296,8 @@
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
mTouchView.changeMode(item);
+ } else if (id == R.id.display_mode) {
+ changeDisplayMode(item);
}
Trace.endSection();
diff --git a/tests/TouchLatency/app/src/main/res/layout/activity_touch_latency.xml b/tests/TouchLatency/app/src/main/res/layout/activity_touch_latency.xml
index 8d20ff2..6257576 100644
--- a/tests/TouchLatency/app/src/main/res/layout/activity_touch_latency.xml
+++ b/tests/TouchLatency/app/src/main/res/layout/activity_touch_latency.xml
@@ -18,6 +18,7 @@
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
+ android:keepScreenOn="true"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".TouchLatencyActivity">
<com.prefabulated.touchlatency.TouchLatencyView
diff --git a/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml
index 5aef72e..52be919 100644
--- a/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml
+++ b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml
@@ -15,6 +15,14 @@
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" tools:context=".TouchLatencyActivity">
- <item android:id="@+id/action_settings" android:title="@string/mode"
- android:orderInCategory="100" android:showAsAction="always" />
+ <item
+ android:id="@+id/action_settings"
+ android:orderInCategory="101"
+ android:showAsAction="always"
+ android:title="@string/mode"/>
+ <item
+ android:id="@+id/display_mode"
+ android:showAsAction="ifRoom"
+ android:title="@string/display_mode"
+ android:visible="false"/>
</menu>
diff --git a/tests/TouchLatency/app/src/main/res/values/strings.xml b/tests/TouchLatency/app/src/main/res/values/strings.xml
index b97f095..771992c 100644
--- a/tests/TouchLatency/app/src/main/res/values/strings.xml
+++ b/tests/TouchLatency/app/src/main/res/values/strings.xml
@@ -17,4 +17,5 @@
<string name="app_name">Touch Latency</string>
<string name="mode">Touch</string>
+ <string name="display_mode">Mode</string>
</resources>
diff --git a/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java b/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java
index 3e86e77..21a4988 100644
--- a/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java
+++ b/tests/net/java/android/net/shared/IpConfigurationParcelableUtilTest.java
@@ -25,8 +25,6 @@
import android.net.DhcpResults;
import android.net.LinkAddress;
-import android.net.StaticIpConfiguration;
-import android.net.apf.ApfCapabilities;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -43,21 +41,16 @@
@RunWith(AndroidJUnit4.class)
@SmallTest
public class IpConfigurationParcelableUtilTest {
- private StaticIpConfiguration mStaticIpConfiguration;
private DhcpResults mDhcpResults;
@Before
public void setUp() {
- mStaticIpConfiguration = new StaticIpConfiguration();
- mStaticIpConfiguration.ipAddress = new LinkAddress(parseNumericAddress("2001:db8::42"), 64);
- mStaticIpConfiguration.gateway = parseNumericAddress("192.168.42.42");
- mStaticIpConfiguration.dnsServers.add(parseNumericAddress("2001:db8::43"));
- mStaticIpConfiguration.dnsServers.add(parseNumericAddress("192.168.43.43"));
- mStaticIpConfiguration.domains = "example.com";
- // Any added StaticIpConfiguration field must be included in equals() to be tested properly
- assertFieldCountEquals(4, StaticIpConfiguration.class);
-
- mDhcpResults = new DhcpResults(mStaticIpConfiguration);
+ mDhcpResults = new DhcpResults();
+ mDhcpResults.ipAddress = new LinkAddress(parseNumericAddress("2001:db8::42"), 64);
+ mDhcpResults.gateway = parseNumericAddress("192.168.42.42");
+ mDhcpResults.dnsServers.add(parseNumericAddress("2001:db8::43"));
+ mDhcpResults.dnsServers.add(parseNumericAddress("192.168.43.43"));
+ mDhcpResults.domains = "example.com";
mDhcpResults.serverAddress = (Inet4Address) parseNumericAddress("192.168.44.44");
mDhcpResults.vendorInfo = "TEST_VENDOR_INFO";
mDhcpResults.leaseDuration = 3600;
@@ -67,46 +60,35 @@
}
@Test
- public void testParcelUnparcelStaticConfiguration() {
- doStaticConfigurationParcelUnparcelTest();
- }
-
- @Test
- public void testParcelUnparcelStaticConfiguration_NullIpAddress() {
- mStaticIpConfiguration.ipAddress = null;
- doStaticConfigurationParcelUnparcelTest();
- }
-
- @Test
- public void testParcelUnparcelStaticConfiguration_NullGateway() {
- mStaticIpConfiguration.gateway = null;
- doStaticConfigurationParcelUnparcelTest();
- }
-
- @Test
- public void testParcelUnparcelStaticConfiguration_NullDomains() {
- mStaticIpConfiguration.domains = null;
- doStaticConfigurationParcelUnparcelTest();
- }
-
- @Test
- public void testParcelUnparcelStaticConfiguration_EmptyDomains() {
- mStaticIpConfiguration.domains = "";
- doStaticConfigurationParcelUnparcelTest();
- }
-
- private void doStaticConfigurationParcelUnparcelTest() {
- final StaticIpConfiguration unparceled =
- fromStableParcelable(toStableParcelable(mStaticIpConfiguration));
- assertEquals(mStaticIpConfiguration, unparceled);
- }
-
- @Test
public void testParcelUnparcelDhcpResults() {
doDhcpResultsParcelUnparcelTest();
}
@Test
+ public void testParcelUnparcelDhcpResults_NullIpAddress() {
+ mDhcpResults.ipAddress = null;
+ doDhcpResultsParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcelDhcpResults_NullGateway() {
+ mDhcpResults.gateway = null;
+ doDhcpResultsParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcelDhcpResults_NullDomains() {
+ mDhcpResults.domains = null;
+ doDhcpResultsParcelUnparcelTest();
+ }
+
+ @Test
+ public void testParcelUnparcelDhcpResults_EmptyDomains() {
+ mDhcpResults.domains = "";
+ doDhcpResultsParcelUnparcelTest();
+ }
+
+ @Test
public void testParcelUnparcelDhcpResults_NullServerAddress() {
mDhcpResults.serverAddress = null;
doDhcpResultsParcelUnparcelTest();
@@ -122,10 +104,4 @@
final DhcpResults unparceled = fromStableParcelable(toStableParcelable(mDhcpResults));
assertEquals(mDhcpResults, unparceled);
}
-
- @Test
- public void testParcelUnparcelApfCapabilities() {
- final ApfCapabilities caps = new ApfCapabilities(123, 456, 789);
- assertEquals(caps, fromStableParcelable(toStableParcelable(caps)));
- }
}
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index e881ad4..2fac8e0 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -498,7 +498,6 @@
try {
doAnswer(validateAnswer).when(mNetworkMonitor).notifyNetworkConnected();
doAnswer(validateAnswer).when(mNetworkMonitor).forceReevaluation(anyInt());
- doAnswer(validateAnswer).when(mNetworkMonitor).setAcceptPartialConnectivity();
} catch (RemoteException e) {
fail(e.getMessage());
}
@@ -2553,8 +2552,7 @@
verifyActiveNetwork(TRANSPORT_CELLULAR);
}
- // TODO(b/128426024): deflake and re-enable
- // @Test
+ @Test
public void testPartialConnectivity() {
// Register network callback.
NetworkRequest request = new NetworkRequest.Builder()
@@ -2578,20 +2576,24 @@
assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork());
callback.assertNoCallback();
+ // With HTTPS probe disabled, NetworkMonitor should pass the network validation with http
+ // probe.
+ mWiFiNetworkAgent.setNetworkValid();
// If the user chooses yes to use this partial connectivity wifi, switch the default
// network to wifi and check if wifi becomes valid or not.
mCm.setAcceptPartialConnectivity(mWiFiNetworkAgent.getNetwork(), true /* accept */,
false /* always */);
- // With https probe disabled, NetworkMonitor should pass the network validation with http
- // probe.
- mWiFiNetworkAgent.setNetworkValid();
+ // If user accepts partial connectivity network,
+ // NetworkMonitor#setAcceptPartialConnectivity() should be called too.
waitForIdle();
try {
- verify(mWiFiNetworkAgent.mNetworkMonitor,
- timeout(TIMEOUT_MS).times(1)).setAcceptPartialConnectivity();
+ verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity();
} catch (RemoteException e) {
fail(e.getMessage());
}
+ // Need a trigger point to let NetworkMonitor tell ConnectivityService that network is
+ // validated.
+ mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true);
callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent);
NetworkCapabilities nc = callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED,
mWiFiNetworkAgent);
@@ -2621,6 +2623,15 @@
// acceptUnvalidated is also used as setting for accepting partial networks.
mWiFiNetworkAgent.explicitlySelected(true /* acceptUnvalidated */);
mWiFiNetworkAgent.connect(true);
+ // If user accepted partial connectivity network before,
+ // NetworkMonitor#setAcceptPartialConnectivity() will be called in
+ // ConnectivityService#updateNetworkInfo().
+ waitForIdle();
+ try {
+ verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity();
+ } catch (RemoteException e) {
+ fail(e.getMessage());
+ }
callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent);
nc = callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
@@ -2635,23 +2646,33 @@
// NET_CAPABILITY_PARTIAL_CONNECTIVITY.
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
mWiFiNetworkAgent.explicitlySelected(true /* acceptUnvalidated */);
+ // Current design cannot send multi-testResult from NetworkMonitor to ConnectivityService.
+ // So, if user accepts partial connectivity, NetworkMonitor will send PARTIAL_CONNECTIVITY
+ // to ConnectivityService first then send VALID. Once NetworkMonitor support
+ // multi-testResult, this test case also need to be changed to meet the new design.
mWiFiNetworkAgent.connectWithPartialConnectivity();
- callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
- // TODO: If the user accepted partial connectivity, we shouldn't switch to wifi until
- // NetworkMonitor detects partial connectivity
- assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
- mWiFiNetworkAgent.setNetworkValid();
+ // If user accepted partial connectivity network before,
+ // NetworkMonitor#setAcceptPartialConnectivity() will be called in
+ // ConnectivityService#updateNetworkInfo().
waitForIdle();
try {
- verify(mWiFiNetworkAgent.mNetworkMonitor,
- timeout(TIMEOUT_MS).times(1)).setAcceptPartialConnectivity();
+ verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity();
} catch (RemoteException e) {
fail(e.getMessage());
}
+ callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent);
- callback.expectCapabilitiesWith(NET_CAPABILITY_PARTIAL_CONNECTIVITY, mWiFiNetworkAgent);
- // Wifi should be the default network.
+ // TODO: If the user accepted partial connectivity, we shouldn't switch to wifi until
+ // NetworkMonitor detects partial connectivity
assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+ callback.expectCapabilitiesWith(NET_CAPABILITY_PARTIAL_CONNECTIVITY, mWiFiNetworkAgent);
+ mWiFiNetworkAgent.setNetworkValid();
+ // Need a trigger point to let NetworkMonitor tell ConnectivityService that network is
+ // validated.
+ mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true);
+ callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
+ mWiFiNetworkAgent.disconnect();
+ callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
}
@Test
diff --git a/tools/fonts/fontchain_linter.py b/tools/fonts/fontchain_linter.py
index ce9becd..f191f6c 100755
--- a/tools/fonts/fontchain_linter.py
+++ b/tools/fonts/fontchain_linter.py
@@ -475,6 +475,11 @@
_emoji_sequences = remove_emoji_exclude(_emoji_sequences, exclusions)
_emoji_zwj_sequences = remove_emoji_exclude(_emoji_zwj_sequences, exclusions)
_emoji_variation_sequences = remove_emoji_variation_exclude(_emoji_variation_sequences, exclusions)
+ # Unicode 12.0 adds Basic_Emoji in emoji-sequences.txt. We ignore them here since we are already
+ # checking the emoji presentations with emoji-variation-sequences.txt.
+ # Please refer to http://unicode.org/reports/tr51/#def_basic_emoji_set .
+ _emoji_sequences = {k: v for k, v in _emoji_sequences.iteritems() if not v == 'Basic_Emoji' }
+
def remove_emoji_variation_exclude(source, items):
return source.difference(items.keys())
@@ -542,56 +547,6 @@
]
ZWJ = 0x200D
-FEMALE_SIGN = 0x2640
-MALE_SIGN = 0x2642
-
-GENDER_DEFAULTS = [
- (0x26F9, MALE_SIGN), # PERSON WITH BALL
- (0x1F3C3, MALE_SIGN), # RUNNER
- (0x1F3C4, MALE_SIGN), # SURFER
- (0x1F3CA, MALE_SIGN), # SWIMMER
- (0x1F3CB, MALE_SIGN), # WEIGHT LIFTER
- (0x1F3CC, MALE_SIGN), # GOLFER
- (0x1F46E, MALE_SIGN), # POLICE OFFICER
- (0x1F46F, FEMALE_SIGN), # WOMAN WITH BUNNY EARS
- (0x1F471, MALE_SIGN), # PERSON WITH BLOND HAIR
- (0x1F473, MALE_SIGN), # MAN WITH TURBAN
- (0x1F477, MALE_SIGN), # CONSTRUCTION WORKER
- (0x1F481, FEMALE_SIGN), # INFORMATION DESK PERSON
- (0x1F482, MALE_SIGN), # GUARDSMAN
- (0x1F486, FEMALE_SIGN), # FACE MASSAGE
- (0x1F487, FEMALE_SIGN), # HAIRCUT
- (0x1F575, MALE_SIGN), # SLEUTH OR SPY
- (0x1F645, FEMALE_SIGN), # FACE WITH NO GOOD GESTURE
- (0x1F646, FEMALE_SIGN), # FACE WITH OK GESTURE
- (0x1F647, MALE_SIGN), # PERSON BOWING DEEPLY
- (0x1F64B, FEMALE_SIGN), # HAPPY PERSON RAISING ONE HAND
- (0x1F64D, FEMALE_SIGN), # PERSON FROWNING
- (0x1F64E, FEMALE_SIGN), # PERSON WITH POUTING FACE
- (0x1F6A3, MALE_SIGN), # ROWBOAT
- (0x1F6B4, MALE_SIGN), # BICYCLIST
- (0x1F6B5, MALE_SIGN), # MOUNTAIN BICYCLIST
- (0x1F6B6, MALE_SIGN), # PEDESTRIAN
- (0x1F926, FEMALE_SIGN), # FACE PALM
- (0x1F937, FEMALE_SIGN), # SHRUG
- (0x1F938, MALE_SIGN), # PERSON DOING CARTWHEEL
- (0x1F939, MALE_SIGN), # JUGGLING
- (0x1F93C, MALE_SIGN), # WRESTLERS
- (0x1F93D, MALE_SIGN), # WATER POLO
- (0x1F93E, MALE_SIGN), # HANDBALL
- (0x1F9D6, FEMALE_SIGN), # PERSON IN STEAMY ROOM
- (0x1F9D7, FEMALE_SIGN), # PERSON CLIMBING
- (0x1F9D8, FEMALE_SIGN), # PERSON IN LOTUS POSITION
- (0x1F9D9, FEMALE_SIGN), # MAGE
- (0x1F9DA, FEMALE_SIGN), # FAIRY
- (0x1F9DB, FEMALE_SIGN), # VAMPIRE
- (0x1F9DC, FEMALE_SIGN), # MERPERSON
- (0x1F9DD, FEMALE_SIGN), # ELF
- (0x1F9DE, FEMALE_SIGN), # GENIE
- (0x1F9DF, FEMALE_SIGN), # ZOMBIE
- (0X1F9B8, FEMALE_SIGN), # SUPERVILLAIN
- (0x1F9B9, FEMALE_SIGN), # SUPERHERO
-]
def is_fitzpatrick_modifier(cp):
return 0x1F3FB <= cp <= 0x1F3FF
@@ -666,13 +621,6 @@
equivalent_emoji.update(LEGACY_ANDROID_EMOJI)
equivalent_emoji.update(ZWJ_IDENTICALS)
- for ch, gender in GENDER_DEFAULTS:
- equivalent_emoji[(ch, ZWJ, gender)] = ch
- for skin_tone in range(0x1F3FB, 0x1F3FF+1):
- skin_toned = (ch, skin_tone, ZWJ, gender)
- if skin_toned in all_emoji:
- equivalent_emoji[skin_toned] = (ch, skin_tone)
-
for seq in _emoji_variation_sequences:
equivalent_emoji[seq] = seq[0]
diff --git a/tools/incident_report/main.cpp b/tools/incident_report/main.cpp
index be33afc..17a3c7a 100644
--- a/tools/incident_report/main.cpp
+++ b/tools/incident_report/main.cpp
@@ -277,147 +277,6 @@
}
// ================================================================================
-static uint8_t*
-write_raw_varint(uint8_t* buf, uint32_t val)
-{
- uint8_t* p = buf;
- while (true) {
- if ((val & ~0x7F) == 0) {
- *p++ = (uint8_t)val;
- return p;
- } else {
- *p++ = (uint8_t)((val & 0x7F) | 0x80);
- val >>= 7;
- }
- }
-}
-
-static int
-write_all(int fd, uint8_t const* buf, size_t size)
-{
- while (size > 0) {
- ssize_t amt = ::write(fd, buf, size);
- if (amt < 0) {
- return errno;
- }
- size -= amt;
- buf += amt;
- }
- return 0;
-}
-
-static int
-adb_incident_workaround(const char* adbSerial, const vector<string>& sections)
-{
- const int maxAllowedSize = 20 * 1024 * 1024; // 20MB
- unique_ptr<uint8_t[]> buffer(new uint8_t[maxAllowedSize]);
-
- for (vector<string>::const_iterator it=sections.begin(); it!=sections.end(); it++) {
- Descriptor const* descriptor = IncidentProto::descriptor();
- FieldDescriptor const* field;
-
- // Get the name and field id.
- string name = *it;
- char* end;
- int id = strtol(name.c_str(), &end, 0);
- if (*end == '\0') {
- // If it's an id, find out the string.
- field = descriptor->FindFieldByNumber(id);
- if (field == NULL) {
- fprintf(stderr, "Unable to find field number: %d\n", id);
- return 1;
- }
- name = field->name();
- } else {
- // If it's a string, find out the id.
- field = descriptor->FindFieldByName(name);
- if (field == NULL) {
- fprintf(stderr, "Unable to find field: %s\n", name.c_str());
- return 1;
- }
- id = field->number();
- }
-
- int pfd[2];
- if (pipe(pfd) != 0) {
- fprintf(stderr, "pipe failed: %s\n", strerror(errno));
- return 1;
- }
-
- pid_t pid = fork();
- if (pid == -1) {
- fprintf(stderr, "fork failed: %s\n", strerror(errno));
- return 1;
- } else if (pid == 0) {
- // child
- dup2(pfd[1], STDOUT_FILENO);
- close(pfd[0]);
- close(pfd[1]);
-
- char const** args = (char const**)malloc(sizeof(char*) * 8);
- int argpos = 0;
- args[argpos++] = "adb";
- if (adbSerial != NULL) {
- args[argpos++] = "-s";
- args[argpos++] = adbSerial;
- }
- args[argpos++] = "shell";
- args[argpos++] = "dumpsys";
- args[argpos++] = name.c_str();
- args[argpos++] = "--proto";
- args[argpos++] = NULL;
- execvp(args[0], (char*const*)args);
- fprintf(stderr, "execvp failed: %s\n", strerror(errno));
- free(args);
- return 1;
- } else {
- // parent
- close(pfd[1]);
-
- size_t size = 0;
- while (size < maxAllowedSize) {
- ssize_t amt = read(pfd[0], buffer.get() + size, maxAllowedSize - size);
- if (amt == 0) {
- break;
- } else if (amt == -1) {
- fprintf(stderr, "read error: %s\n", strerror(errno));
- return 1;
- }
- size += amt;
- }
-
- int status;
- do {
- waitpid(pid, &status, 0);
- } while (!WIFEXITED(status));
- if (WEXITSTATUS(status) != 0) {
- return WEXITSTATUS(status);
- }
-
- if (size > 0) {
- uint8_t header[20];
- uint8_t* p = write_raw_varint(header, (id << 3) | 2);
- p = write_raw_varint(p, size);
- int err = write_all(STDOUT_FILENO, header, p-header);
- if (err != 0) {
- fprintf(stderr, "write error: %s\n", strerror(err));
- return 1;
- }
- err = write_all(STDOUT_FILENO, buffer.get(), size);
- if (err != 0) {
- fprintf(stderr, "write error: %s\n", strerror(err));
- return 1;
- }
- }
-
- close(pfd[0]);
- }
- }
-
- return 0;
-}
-
-// ================================================================================
static void
usage(FILE* out)
{
@@ -449,7 +308,6 @@
const char* inFilename = NULL;
const char* outFilename = NULL;
const char* adbSerial = NULL;
- bool adbIncidentWorkaround = true;
pid_t childPid = -1;
vector<string> sections;
const char* privacy = NULL;
@@ -475,9 +333,6 @@
case 'h':
usage(stdout);
return 0;
- case 'w':
- adbIncidentWorkaround = false;
- break;
case 'p':
privacy = optarg;
break;
@@ -517,19 +372,10 @@
fprintf(stderr, "fork failed: %s\n", strerror(errno));
return 1;
} else if (childPid == 0) {
+ // child
dup2(pfd[1], STDOUT_FILENO);
close(pfd[0]);
close(pfd[1]);
- // child
- if (adbIncidentWorkaround) {
- // TODO: Until the device side incident command is checked in,
- // the incident_report builds the outer Incident proto by hand
- // from individual adb shell dumpsys <service> --proto calls,
- // with a maximum allowed output size.
- return adb_incident_workaround(adbSerial, sections);
- }
-
- // TODO: This is what the real implementation will be...
char const** args = (char const**)malloc(sizeof(char*) * (8 + sections.size()));
int argpos = 0;
args[argpos++] = "adb";
diff --git a/tools/incident_section_gen/main.cpp b/tools/incident_section_gen/main.cpp
index f6c9c0e..3b3fe19 100644
--- a/tools/incident_section_gen/main.cpp
+++ b/tools/incident_section_gen/main.cpp
@@ -408,10 +408,16 @@
for (int i=0; i<descriptor->field_count(); i++) {
const FieldDescriptor* field = descriptor->field(i);
- if (field->type() != FieldDescriptor::TYPE_MESSAGE && field->type() != FieldDescriptor::TYPE_STRING) {
+ if (field->type() != FieldDescriptor::TYPE_MESSAGE
+ && field->type() != FieldDescriptor::TYPE_STRING) {
continue;
}
+
const SectionFlags s = getSectionFlags(field);
+ if (s.userdebug_and_eng_only()) {
+ printf("#if ALLOW_RESTRICTED_SECTIONS\n");
+ }
+
switch (s.type()) {
case SECTION_NONE:
continue;
@@ -424,8 +430,7 @@
printf(" NULL),\n");
break;
case SECTION_DUMPSYS:
- printf(" new DumpsysSection(%d, %s,", field->number(),
- s.userdebug_and_eng_only() ? "true" : "false");
+ printf(" new DumpsysSection(%d, ", field->number());
splitAndPrint(s.args());
printf(" NULL),\n");
break;
@@ -438,9 +443,13 @@
printf(" NULL),\n");
break;
case SECTION_TOMBSTONE:
- printf(" new TombstoneSection(%d, \"%s\"),\n", field->number(), s.args().c_str());
+ printf(" new TombstoneSection(%d, \"%s\"),\n", field->number(),
+ s.args().c_str());
break;
}
+ if (s.userdebug_and_eng_only()) {
+ printf("#endif\n");
+ }
}
printf(" NULL };\n");
diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp
index daee6d6..a5b56a4 100644
--- a/tools/stats_log_api_gen/main.cpp
+++ b/tools/stats_log_api_gen/main.cpp
@@ -512,7 +512,7 @@
fprintf(out, " std::this_thread::sleep_for(std::chrono::milliseconds(10));\n");
fprintf(out, " }\n");
fprintf(out, " if (ret < 0) {\n");
- fprintf(out, " note_log_drop(ret);\n");
+ fprintf(out, " note_log_drop(ret, code);\n");
fprintf(out, " }\n");
fprintf(out, " return ret;\n");
fprintf(out, "}\n");
@@ -620,7 +620,7 @@
fprintf(out, " std::this_thread::sleep_for(std::chrono::milliseconds(10));\n");
fprintf(out, " }\n");
fprintf(out, " if (ret < 0) {\n");
- fprintf(out, " note_log_drop(ret);\n");
+ fprintf(out, " note_log_drop(ret, code);\n");
fprintf(out, " }\n");
fprintf(out, " return ret;\n\n");
fprintf(out, "}\n");